ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:86.96KB ,
资源ID:15154063      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/15154063.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(4赫夫曼编码文档格式.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

4赫夫曼编码文档格式.docx

1、1概述1.1现状分析目前进行快速远距离通信的主要手段是电报,而电报通信的数码拨号时,我们常常会用到十进制,八进制,十六进制制数等。而输入数字后,数据将以二进制数编码后进行远距离通信传送。1.2存在的问题在十进制,八进制,十六进制制数中往往为了提高通讯效率,会采用二进制数码尽可能短。但每个字符设计长度不等的编码,让电文中出现多次数较多,这就造成大量的资源浪费。1.3实现意义利用赫夫曼编码进行通信可大大提高信道利用率,缩短信息传输时间,降低传输成本,减少代码错误率。有效的数据压缩节省数据文件的存储空间和网络的传送时间。2系统分析实验先对输入的一串字符进行个数统计;然后将各字符出现的频率作为各自的权

2、值进行赫夫曼编码,并打印对应对的赫夫曼编码序列。然后又对编码序列进行回译。2.1实现功能1.赫夫曼的建立;2.赫夫曼编码的生成;3.编码文件的译码;2.2先是一个统计各字符的函数int jsq(char *s,int cnt,char str)在其中定义一个数组temp26即temp0表示A的频率;同理Temp2表示B的频率依此类推;函数最后返回值为字符串的种类。2.3建立赫夫曼树的的算法void ChuffmanTree(HuffmanTree HT,HuffmanCode HC,int cnt,char str)增加一个选择函数:void select(HuffmanTree T,int

3、k,int *s1,int *s2)即在对应的parent为0的结点中选取权值最小的两个结点在建立赫夫曼树的算法中:先对各节点初始化,对应的均为0;在对叶子节点进行权值赋值;选取两个parent为零的权值最小的两结点,将它们分为另一新结点的左右孩子,并将他们的权值和作为新结点的权值。这样在结点中不断在选取,知道无法选取为止。则赫夫曼树已经建立好。2.4获得赫夫曼编码void HuffmanEncoding(HuffmanTree HT,HuffmanCode HC)只需将对对应的叶子结点进行遍历,遇到是左子树则是0,右子树则为 1;对每个叶子结点进行又下到上遍历直到根节点即得到对应的逆编码,存

4、入一个数组中,然后逆向打印。即可。2.5对对印的编码进行回译只需逐个读取,直到符合某个字符的编码即打印出来,这样不断循环即可。char *decode(HuffmanCode HC)3概要设计4详细设计4.1建立赫夫曼的三个函数 void select(HuffmanTree T,int k,int *s1,int *s2)/在HT1k中选择parent为0且权值最小的两个根结点,其序号分别为S1和S2 int i,j; int min1=100; for(i=1;i=k;i+)/查找s1 if(Ti.weightA & *pZ) k=*p-64; tempk+; j=0; for(i=1,j

5、=0;i+)/统计有多少种字符 if(tempi!=0) j+; strj=i+64;/将对应的数组送到数组中 cntj=tempi;/存入对应数组的权值 return j;/构造赫夫曼树HT int i,s1,s2;=2*num-1;i+)/初始化HT,左右孩子,双亲,权值都为0 HTi.lchild=0; HTi.rchild=0; HTi.parent=0; HTi.weight=0;=num;i+)/输入num个叶节点的权值 HTi.weight=cnti; for(i=num+1;i+)/从numd后面开始新建结点存放新生成的父节点 HTs1.parent=i;HTs2.parent

6、=i;/将s1和s2的parent赋值 HTi.lchild=s1; HTi.rchild=s2;/新结点的左右孩子 HTi.weight=HTs1.weight+ HTs2.weight;/新结点的权值 for(i=0;i+)/输入字符集中的字符 HCi.ch=stri; i=1; while(i0)/直至上溯到HTc是树根为止 /若Tc是Tp的做孩子,则生成0;否则生成代码1 cd-start=(HTp.lchild=c) ? 0 :1/cd数组用来存放每一个字母对应的01编码, c=p; /while 结束 strcpy(HCi.bits,&cdstart);/将cd数组中德01代码复制

7、到i结点中字符 %c:,HCi.ch); for(j=start;cdj!=0;j+)%c,cdj);n); HCi.len=num-start; /for 结束void coding(HuffmanCode HC,char *str)/对str 所代表的字符串进行编码,并写入文件 FILE *fp; fp=fopen(codefile.txt,w while(*str) if(HCi.ch=*str) for(j=0;jHCi.len;j+) fputc(HCi.bitsj,fp); break; str+; fclose(fp);4.3电文的译码char * decode(HuffmanC

8、ode HC)/代码文件coodfile.txt的译码*菡枫* char str254;/假设原文本文件不超过254个字符 char *p; static char cdn+1; int i,j,k=0,cjs;r/读文件编码后的文件为: while(!feof(fp) cjs=0;num & cjs=0 & !feof(fp); cdi= cdi+1= cdi=fgetc(fp);,cdi);/打印出编码后的二进制码 for(j=1;if(strcmp(HCj.bits,cd)=0) strk=HCj.ch; k+; cjs=1; strk= p=str; return p;4.4 主函数v

9、oid main() char st254,*s,str27; int cn27; HuffmanTree HT; HuffmanCode HC;输入需要编码的字符串(假设均为大写字母): n gets(st); num=jsq(st,cn,str);/统计字符的种类及各类字符出现的频率 ChuffmanTree(HT,HC,cn,str);/建立赫夫曼树 HuffmanEncoding(HT,HC);/生成赫夫曼编码 coding(HC,st);/建立电文赫夫曼编码文件 s=decode(HC);/读编码文件译码*菡枫*译码后的字符串:%sn,s);5运行与测试6总结和心得在这次的试验中,让我更深的了解数据结构,在做实验的时候,自己亲自动手,一点一点慢慢做,突然发现好困难,也由于平时的基本功不够,所以导致了问题的难度性加大了。在这次的试验中,难易程度对我而言较大,程序代码难度有点大,但由于输入时不细心,导致许多的小错误,还存在着不少的问题,在同学的帮助下,慢慢解决了这个问题,但许多概念还是模棱两可的但是,这次绝对是我的一个进步。我以后一定认真学习,好好把握问题的关键,掌握知识的要领。7参考文献1 .严蔚敏、吴伟民主编 数据结构(C语言版) 清华大学出版社2 苏仕华主编 数据结构课程设计 机械工业出版社3

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1