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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

哈夫曼树编码解码器.docx

1、哈夫曼树编码解码器数据结构实验报告实验名称: 哈夫曼树学生姓名: 苗润泉班 级: 2009211103班内序号: 14学 号: 09210074日 期: 2010年12月3日1实验要求利用二叉树结构实现哈弗曼编/解码器基本要求如下:(1).初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈弗曼树。(2).建立编码表(CreateTable):利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。(3).编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。(4).译码(Decoding):利用已经建好的哈夫曼树对编码后的字符

2、串进行译码,并输出译码结果。(5).打印(Print):以直观的方式打印哈夫曼树(选作)。(6).计算输入的字符串编码前和编码后的长度,并进行分析,讨论哈弗曼编码的压缩效果。测试数据如下:I love data structure , I love computer . I will try my best to study data structure .提示:(1).用户界面可以设计为“菜单”方式,能够进行交互。(2).根据输入的字符串中的每个字符出现的次数统计频度。2. 程序分析2.1 存储结构 采用二叉树的静态三叉链表存储结构,示意图如下:静态三叉链表的C+描述如下:struct HN

3、ode unsigned int weight; unsigned int parent; unsigned int LChild; unsigned int RChild;2.2 关键算法分析1.关键算法:a.创建哈夫曼树:从1i中选出权值最小的结点由于要挑选的结点ax,ay,是权值最小的两个结点,且要求axay,则可以先从1i中选出最小的,赋值给ax,然后再在1i中挑出除ax之外的权值最小的结点,保存到ay。b.生成编码表:将编码字符逆置由于在生成编码表时,采用自下而上的方式,所以每个字符的编码顺序是反序的,即还需要将编码逆置一下。方法是采用循环算法,依次将编码中的前后对应的字符逆置。c.

4、编码:此算法比较简单,每读出一个字符,只要在编码表中找出对应的编码即可。2代码详细分析:示意图如下: a=0 a=1 a=2 a=3 a=43. 程序运行结果1输入及统计结果2编码表3编码结果4译码结果:4. 总结程序一开始就碰到了一个难题,如何从屏幕上读取字符串并存储,后来在网上查找,发现cin.getline函数就是专门实现这个功能的,于是这个问题便迎刃而解了。然后,由于本程序统计的东西较多,循环的嵌套也比较多,一开始时总是出现错误,后来慢慢的一个一个得都解决了,主要是细心的问题。在理论课上感觉对树的概念理解的还算透彻,但是实验时,就发现,仅仅是理论课、教材上那么一点东西是远远不够的,我们

5、需要的还是多实践,增强对C+编程的熟练程度。还有一点就是,在编程时,很容易忽略机器的思维而代以人的思维,或者,很容易将一些不常见的情况忽略掉,有时候需要抛出异常,有时是需要做各种假设,这都需要在不断地熟悉中培养出来的良好的编程素质,我承认我在这方面做的还很差,以后会更加努力的。/Huffman.h#include#includeusing namespace std;struct HNode /树存?储结构1 unsigned int weight; unsigned int parent; unsigned int LChild; unsigned int RChild;struct HCo

6、de /哈t夫曼编码?的?存?储结构1 char data; char code100;class Huffmanprivate: HNode *HTree; HCode *HCodeTable; int Cn;public: void CreateHtree(int a,int n); /创建哈t夫曼树 void CreateCodeTable(char b,int n);/创建哈t夫曼编码?表 void Encode(char *s,char *d);/对?s进?行D编码?,?存?储到?d; void Decode(char *s,char *d,int n);/对?s进?行D解a码?,?

7、存?储到?d; void PrintTable(int n,char b);/打印?哈t夫曼编码?表 Huffman(); int Codes; /用?于统3计?转a换?哈t夫曼编码?后所用?空?间?;void Huffman:CreateHtree(int a,int n) HTree=new HNode2*n-1; int Cn=n; for(int i=0;in;i+) HTreei.weight=ai; HTreei.LChild=-1; HTreei.RChild=-1; HTreei.parent=-1; int x=0,y=1; for(int i=n;i2*n-1;i+)/找到

8、?权值最?小?的?两?个?字?母?,?并返回?他?们?的?位?置?x,?y for(int j=0;ji;j+) if(x=y) y+; if(ax0) x+; if(ayaj)&(aj0) x=j; if(ayaj)&(aj0)&y!=x) y=j; ai=ax+ay; ax=-1; /将?已?建造哈t夫曼的?权值置?为a-1 ay=-1; HTreex.parent=HTreey.parent=i; HTreei.weight=HTreex.weight+HTreey.weight; HTreei.LChild=x; HTreei.RChild=y; HTreei.parent=-1; v

9、oid Huffman:CreateCodeTable(char b, int n) char temp; Cn=0; HCodeTable=new HCoden; if(Cnn) Cn=n; for(int i=0;in;i+) HCodeTablei.data=bi; int child=i; int parent=HTreei.parent; int k=0; while(parent!=-1) if(child=HTreeparent.LChild) HCodeTablei.codek=0; else HCodeTablei.codek=1; k+; child=parent; par

10、ent=HTreeparent.parent; HCodeTablei.codek=0; k-; / 0不?进?行D反转a,?所以?k-1 for(int j=0;jk;j+,k-) /将?编码?反转a temp=HCodeTablei.codej; HCodeTablei.codej=HCodeTablei.codek; HCodeTablei.codek=temp; void Huffman:PrintTable(int n,char b) for(int i=0;in;i+) coutbi哈t夫曼的?编码?为aHCodeTablei.codeendl; void Huffman:Enco

11、de(char *s,char *d) int k=0,l=0,q=0,p=0; Codes=0; /统3计?哈t夫编码?所用?的?bit树 while(sp!=0) k=0;q=0; while(HCodeTablek.data!=sp) /找到?编码?表中D字?母?对?应|的?句?子的?之?母? k+; while(HCodeTablek.codeq!=0)/将?编码?写入?d dl=HCodeTablek.codeq; l+; q+; Codes+; /写入?1或0,?Codes+1,?用?于统3计?转a换?后的?bit p+; dl=0;void Huffman:Decode(char

12、*s,char*d,int n)int l=0,p=0; while(sp!=0) int parent=2*n-2; while(HTreeparent.LChild!=-1&HTreeparent.RChild!=-1) if(sp=0) parent=HTreeparent.LChild; else parent=HTreeparent.RChild; p+; dl=HCodeTableparent.data; l+; dl=0;Huffman:Huffman() int i=0; HNode *p=NULL; HCode *q=NULL; while(HTreei.parent=-1)

13、 /当parent=-1时,?就是?根节点?,?此?时是?HTree数y组的?结尾2 p=&HTreei; delete p; i+; i=0; q=&HCodeTablei; while(iCn) q=&HCodeTablei; delete q; i+; /Huffman.cpp#include#include#includehuffman.h#includeusing namespace std;char Str1024; /存?储输?入?的?字?符?int count=0; /统3计?所输?入?的?字?符?串?有D多少个?字?符?int count2=0; /统3计?有D多少种?字?符

14、?char Count1024; /存?储字?符?int Counti1024; /存?储字?符?的?权值void Getchar(); /统3计?字?符?串?中D的?各种?字?符?的?权值void main() int a=0; char Pstr11024; char Pstr21024; bool flag=0; /标记?是?否?输?入?了?字?符? Huffman Huff; while(a!=48) cout1:输?入?字?符?串? 2:o打印?编码?表 3:o打印?编码?结果? 4:o打印?译?码?结果? 0:o退?出? *endl; a=_getche();int i=0; sw

15、itch(a) case 49: cout请?输?入?字?符?串?(小?于1024个?字?符?)?endl; /if(flag) / / Huff.Huffman(); / try Getchar(); while(icount2) if(Counti= ) cout空?格?的?个?数y为aCountiit; else coutCounti的?个?数y为aCountiit; i+; coutendl; cout共2有Dcount2种?字?符?; coutendl; flag=1; Huff.CreateHtree(Counti,count2); Huff.CreateCodeTable(Cou

16、nt,count2); catch(char*S) coutSendl; break; case 50: if(flag) Huff.PrintTable(count2,Count); else cout错误!?!?请?先输?入?字?符?endl; break; case 51: if(flag) Huff.Encode(Str,Pstr1); coutPstr1endl; cout编码?前字?符?串?为aStr; cout共2Count字?符?,占?8*countbit=8*countbitendl; cout编码?后所占?bit为aHuff.Codesbitendl; cout压1缩?比为

17、a8*count/float(Huff.Codes)endl; else cout错误!?!?请?先输?入?字?符?endl; ; break; case 52: if(flag) Huff.Decode(Pstr1,Pstr2,count2); coutPstr2endl; else cout错误!?!?请?先输?入?字?符?endl; break; case 48: exit(0); void Getchar() count=0; cin.getline(Str,1024); for(;Strcount!=0;count+) if(count=1024)throw溢?出?; if(coun

18、t=0)throw错误!?!?请?重?新?输?入?; int j=0,k=0; char key=Str0; / int count1=0; while(key!=0) count1=0; for(int i=j;Stri!=0;i+) if(key=Stri) +count1; j+; /Str的?序号? Countk=key; Countik=count1; k+; /Count,Counti的?序号? for(int i=0;ik;i+) /比较?Count中D是?否?已?经-存?有DStrj if(Strj=Counti) j+; i=0; key=Strj; /找到?Count中D没?有DStrj这a个?字?母? Countk=0; count2=k; /储存?有D多少种?字?母?

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

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