在给定符号集和符号概率的情况下,算术编码可以给出接近最优的编码结果,相比于霍夫曼编码来说更接近香农极限。
对于HELLOWORLD来说,共7种符号
符号概率如下
代码如下
#include "stdafx.h"
#include<iostream>
#include<string>
#include<math.h>
#include<iomanip>
using namespace std;
#define STR_LEN = 10;
char str[11] = "HELLOWORLD";
char s[7] = {
'D','E','H','L','O','R','W',
};
double w[7] = {
0.1, 0.1, 0.1, 0.3, 0.2, 0.1, 0.1,
};
double range[7][2];
void main()
{
range[0][0] = 0;
range[0][1] = w[0];
for(int i = 1; i < 7; i++)
{
range[i][0]=range[i-1][1];
range[i][1]=range[i][0]+w[i];
}
for(int i = 1; i < 7; i++)
{
cout<<range[i][0]<< " "<<range[i][1]<<endl;
}
double low=0;
double high =1;
double r = 0;
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 7; j++)
{
if(s[j] == str[i])
{
r = high - low;//range[j][1] - range[j][0];
high = low + r*range[j][1];
low = low + r*range[j][0];
break;
}
}
cout<<low<<" "<<high<<endl;
}
cout<<endl;
char c[10];
int k = 0;
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 7; j++)
{
if(low >= range[j][0] && low < range[j][1])
{
c[k++] = s[j];
low = (low-range[j][0])/(range[j][1]-range[j][0]);
break;
}
}
}
for(int i = 0; i < 10; i++)
{
cout<<c[i]<<" ";
}
cout<<endl;
}