资源描述:
《算术编码的C++实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、算术编码的C++实现#include#include#include#includeusingnamespacestd;#defineN50//输入的字符应该不超过50个structL//结构用于求各字符及其概率{charch;//存储出现的字符(不重复)intnum;//存储字符出现的次数doublef;//存储字符的概率};//显示信息voiddisp();//求概率函数,输入:字符串;输出:字符数组、字符的概率数组;返回:数组长度;intproba(string
2、str,charc[],longdoublep[],intcount);//求概率的辅助函数intsearch(vectorarch,char,intn);//编码函数,输入:字符串,字符数组,概率数组,以及数组长度;输出:编码结果longdoublebma(charc[],longdoublep[],stringstr,intnumber,intsize);//译码函数,输入:编码结果,字符串,字符数组,概率数组,以及它们的长度;输出:字符串//该函数可以用于检测编码是否正确voidyma(stringstr,charc[],l
3、ongdoublep[],intnumber,intsize,longdoubleinput);intmain(){stringstr;//输入要编码的String类型字符串intnumber=0,size=0;//number--字符串中不重复的字符个数;size--字符串长度charc[N];//用于存储不重复的字符longdoublep[N],output;//p[N]--不重复字符的概率,output--编码结果disp();cout<<"输入要编码的字符串:";getline(cin,str);//输入要编码的字符串size=
4、str.length();//字符串长度number=proba(str,c,p,size);//调用求概率函数,返回不重复字符的个数cout.setf(ios::fixed);//“魔法配方”规定了小数部分的个数cout.setf(ios::showpoint);//在此规定编码结果的小数部分有十个cout.precision(10);output=bma(c,p,str,number,size);//调用编码函数,返回编码结果yma(str,c,p,number,size,output);//调用译码函数,输出要编码的字符串,//以
5、验证编码是否正确return0;}//显示信息voiddisp(){cout<6、t){cout.setf(ios::fixed);//“魔法配方”规定了小数部分位数为三位cout.setf(ios::showpoint);cout.precision(3);vectorpt;//定义了结构类型的向量,用于同时存储不重复的字符和其概率Ltemp;//结构类型的变量temp.ch=str[0];//暂存字符串的第一个字符,它的个数暂设为1temp.num=1;temp.f=0.0;pt.push_back(temp);//将该字符及其个数压入向量for(inti=1;i7、描{temp.ch=str[i];//暂存第二个字符temp.num=1;temp.f=0.0;for(intj=0;j=0){pt[k].num++;break;}else{pt.push_back(temp);break;}}}for(i=0;i8、i].f=double(pt[i].num)/count;}intnumber=pt.size();//计算不重复字符出现的次数cout<<"各字符概率如下:";for(i=0;i