欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    算术编码的C++实现(共5页).doc

    • 资源ID:7205616       资源大小:24KB        全文页数:5页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    算术编码的C++实现(共5页).doc

    精选优质文档-倾情为你奉上算术编码的C+实现#include <iostream>#include <string>#include <cstring>#include <vector>using namespace std;#define N 50 /输入的字符应该不超过50个struct L /结构用于求各字符及其概率char ch; /存储出现的字符(不重复) int num; /存储字符出现的次数double f;/存储字符的概率 ;/显示信息void disp();/求概率函数,输入:字符串;输出:字符数组、字符的概率数组;返回:数组长度;int proba(string str,char c,long double p,int count);/求概率的辅助函数int search(vector<L> arch,char,int n);/编码函数,输入:字符串,字符数组,概率数组,以及数组长度;输出:编码结果long double bma(char c,long double p,string str,int number,int size);/译码函数,输入:编码结果,字符串,字符数组,概率数组,以及它们的长度;输出:字符串/该函数可以用于检测编码是否正确void yma(string str,char c,long double p, int number,int size,long double input);int main()string str; /输入要编码的String类型字符串int number=0,size=0; /number-字符串中不重复的字符个数;size-字符串长度char cN; /用于存储不重复的字符 long double pN,output; /pN-不重复字符的概率,output-编码结果disp();cout<<"输入要编码的字符串:"getline(cin,str); /输入要编码的字符串size=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); /调用译码函数,输出要编码的字符串, /以验证编码是否正确return 0;/显示信息void disp()cout<<endl;cout<<"*算术编码*n"cout<<"*作者:heiness*n"cout<<endl;cout<<"此程序只需要输入要编码的字符串,不需要输入字符概率n" cout<<endl;/求概率函数int proba(string str,char c,long double p, int count) cout.setf(ios:fixed); /“魔法配方”规定了小数部分位数为三位cout.setf(ios:showpoint);cout.precision(3);vector<L>pt; /定义了结构类型的向量,用于同时存储不重复的字符和其概率 L temp; /结构类型的变量temp.ch = str0; /暂存字符串的第一个字符,它的个数暂设为1temp.num=1; temp.f=0.0;pt.push_back(temp); /将该字符及其个数压入向量 for (int i=1;i<count;i+)/对整个字符串进行扫描temp.ch=stri; /暂存第二个字符temp.num=1;temp.f=0.0;for (int j=0;j<pt.size();j+) /在结构向量中寻找是否有重复字符出现 /若重复,该字符个数加1,并跳出循环int k; /若不重复,则压入该字符,并跳出循环k=search(pt,stri,pt.size();if(k>=0)ptk.num+;break;else pt.push_back(temp);break;for (i=0;i<pt.size();i+) /计算不重复字符出现的概率pti.f=double(pti.num)/count; intnumber=pt.size(); /计算不重复字符出现的次数 cout<<"各字符概率如下:n" for (i=0;i<number;i+) /显示所得的概率,验证是否正确 if (count=0) cout<<"NO sample!n" else ci=pti.ch; pi=pti.f; cout<<ci<<"的概率为:"<<pi<<endl; return number; /返回不重复字符的个数/求概率的辅助函数/若搜索发现有重复字符返回正数/否则,返回-1int search(vector<L> arch,char ch1,int n)for (int i=0;i<n;i+) if(ch1=archi.ch) return i;return -1;/编码函数long double bma(char c,long double p,string str,int number,int size)long double High=0.0,Low=0.0,high,low,range;/High-下一个编码区间的上限,Low-下一个编码区间的下限;/high-中间变量,用来计算下一个编码区间的上限;/low-中间变量,用来计算下一个编码区间的下限;/range-上一个被编码区间长度int i,j=0;for(i=0;i<number;i+)if(str0=ci) break; /编码第一个字符while(j<i)Low+=pj+; /寻找该字符的概率区间下限range=pj; /得到该字符的概率长度High=Low+range; /得到该字符概率区间上限for(i=1;i<size;i+) /开始编码第二个字符for(j=0;j<number;j+) /寻找该字符在c数组中的位置if(stri=cj)if(j=0) /若该字符在c数组中的第一个字符low=Low; /此时该字符的概率区间下限刚好为零high=Low+pj*range;High=high;range*=pj; /求出该字符的编码区间长度else /若该编码字符不是c数组中的第一个float proba_next=0.0;for(int k=0;k<=j-1;k+)proba_next+=pk; /再次寻找字符的概率区间下限low=Low+range*proba_next; /编码区间下限high=Low+range*(proba_next+pj);/编码区间上限Low=low; /编码区间下限High=high; /编码区间上限range*=pj; /编码区间长度else continue; /i+,编码下一个字符cout<<endl;cout<<"输入字符串的编码为:"<<Low<<endl;return Low;/译码函数void yma(string str,char c,long double p, int number,int size,long double input)vector<char> v; /定义char类型向量vlong double temp; /中间变量long double sumN; /存储不重复字符概率区间的下限sum0=0.0; /数组第一个元素为0 for (int i=1;i<number+1;i+) /计算数组各元素的值 sumi=sumi-1+pi-1; for (int j=0;j<size;j+) for (int k=0;k<number;k+) /确定被编码字符的下限属于【0,1】之间的哪一段if (input>sumk)&&(input<sumk+1) /发现在哪就将属于该段的字符压入向量vv.push_back(strj);temp=(input-sumk)/(sumk+1-sumk);/计算下一个被编码字符的下限input=temp;break;elsecontinue; cout<<endl;cout<<"译码输出为:" /将译码结果输出 for (int m=0;m<v.size();m+)cout<<vm;cout<<endl;专心-专注-专业

    注意事项

    本文(算术编码的C++实现(共5页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开