自适应算术编码的程序
/******************自适应模式算术编码 **********************/
#include
#include
#include
double proc[]={0.10,0.10,0.10,0.10,0.10,0.10,0.10,0.10,0.10,0.10};
int Num[10]={1,1,1,1,1,1,1,1,1,1};
double result,areaBegin,areaEnd;
int cord[1000],cordLength;
char str[1000];
int strLength=0;
bool readdat()
{
printf("*********** 自适应模式算术编码 ***********\n");
printf("请输入字符串(0--9): \n");
scanf("%s",str);
while(str[strLength]!='\0')
strLength++;
for(int i=0;i
if(str[i]>'9' || str[i]
return 0;
}
void encord()
{
int sum=10;
int i;
printf(" 编 码 :");
double w=0.0,len;
areaBegin=0.0,areaEnd=1.0;
for(i=0;i
{
int n=str[i]-'0',k; w=0.0;
for(k=0;k
len=areaEnd-areaBegin; //计算新的区间
areaEnd = areaBegin+len*(w+proc[k]);
areaBegin += len*w;
Num[n]++;
sum++;
for(int l=0;l
{
proc[l]=Num[l]/double(sum);
}
}
result = areaBegin*0.01+areaEnd*0.99; // 选择适当的点
cordLength=(int(-log(areaEnd-areaBegin)/log(2)))+1;
printf("编码位数: %d\n",cordLength);
printf("编码结果: ");
double temp1=result; int temp2;
for(int j=0;j
temp1 *= 2;
temp2 = int(temp1);
temp1 -= temp2;
cord[j] = temp2;
printf("%d",temp2);
}printf("\n");
}
void decord()
{
double proc[]={0.10,0.10,0.10,0.10,0.10,0.10,0.10,0.10,0.10,0.10};
int Num[10]={1,1,1,1,1,1,1,1,1,1};
int sum=10;
int i,l;
printf(" 译 码 :\n");
result=0.0; double wei=0.5;
for(i=0;i
result += wei*cord[i];
printf("译码选取的数:%f\n",result);
areaBegin=0.0,areaEnd=1.0; wei=0.0;
int temp; double len;
for(int j=0;j
{
temp=0; wei=0.0;len=areaEnd-areaBegin;
while(result-areaBegin>wei*len){ wei += proc[temp++]; } //搜索所在区间 temp--;
areaEnd = areaBegin+wei*len; // 计算新的区间
areaBegin =areaBegin+(wei-proc[temp])*len;
printf("%d",temp);
Num[temp]++;
sum++;
for(l=0;l
{
proc[l]=Num[l]/(double)sum;
}
}
printf("\n");
}
int main()
{
if(readdat())
printf("字符输入错误!!!\n"); else{
encord();
decord();
}
return 0;
}