C++哈夫曼树与哈夫曼编码.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码 一、实验目的 1、使学生熟练掌握哈夫曼树的生成算法。 2、熟练掌握哈夫曼编码的方法。 二、实验内容 [问题描述] [基本要求]1. 初始化:从键盘读入n个字符,以及它们的权值,建立Huffman树。 2. 编码:根据建立的Huffman树,求每个字符的Huffman编码。对给定的待编码字符序列进行编码。“CFBABBFHGH”(也可自己设定数据进行测试)。 三、实验前的准备工作 1、掌握树的逻辑结构。 2、掌握哈夫曼树的定义及生成算法。 3、掌握哈夫曼编码的方法。 四、问题分析 根据实验内容,首先需要将从键盘读入n个字符以及他们的权值,可以先将他们保存到两个数组中,在建立Huffman树,并进行初始化,将n个字符以及权值保存进Huffman树中,建立完Huffman树后,对每个字符进行编码,可以从子叶逆向求,最后在根据所得的各个字符的编码对给定的字符串进行编码。 五、算法设计 首先是Huffman树的建立,n个字符Huffman树需要2n-1个结点,为了方便,为HT申请2n个HuffmanTree的动态内存用于建立Huffman树。先对前n个结点进行初始化,将字符和权值分别赋给HT[i].charname和HT[i].weight,HT[i].parent、HT[i].lchild、HT[i].rchild分别赋0.,其余结点的属性全赋0.选择两个weight最小的结点,将其parent属性改为一个charname为0的结点,并将该结点的lchild和rchild属性分别改为两个结点。以此循环,直至Huffman树建立完成。 其次是每个字符的编码,从Huffman树的子叶开始,向上找其parent,若是其parent的左孩子,则在数组cd[]中计0,又孩子计1,直至结点无parent为止,最后将cd[]数组中的值strcpy给HT[]。 最后是为字符串编码,字符串的每个字符对应Huffman中的字符,输出其HC[]中的字符编码即可。 六、测试数据 1. 字符个数:5 字符1,2,3,4,5 权值1,2,3,4,5 理论结果: 编码分别为:010,011,00,10,11 测试字符串:43152 编码:100001011011 2. 字符个数:8 字符A,B,C,E,F,G,H 权值5,29,7,8,14,23,3,11 理论结果: 编码分别为:0001,10,1110,1111,110,01,0000,001 测试字符串:BDFGEHCA 编码:10111101000011000111100001 七、总结 对于本次试验,主要是在Huffman树的建立上,选择parent为0且weight最小的两个结点不容易,只要这个问题解决,Huffman树的建立就迎刃而解了,每个字符的编码求起来到不是太难,仅是子叶到根逆向的问题。字符串的编码就更容易了,只需将相应字符的编码输出即可。 八、附录 #includeiostream.h #includemalloc.h typedef struct{ char charname; double weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char **HuffmanCode; int n; char *a; double *b; void initcin() { cout请输入字符个数endl; cinn; a=new char[n]; b=new double[n]; cout请输入字符!endl; for (int i=0;in;i++)cina[i]; cout请输入权值!endl; for(i=0;in;i++)cinb[i]; } void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,char *a,double*b,int n) { if(n=1)return; int m=2*n-1; HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); int i; for(i=1;i=n;++i) { HT[i].charname=a[i-1]; HT[i].weight=b[i-1]; HT[i].parent=HT[i].lchild=HT[i].rchild=0;//coutHT[i].parentendl; } for(;i=m;++i) { HT[i].charname=0; HT[i].weight=0; HT[i].parent=HT[i].lchild=HT[i].rchild=0; }

您可能关注的文档

文档评论(0)

zhuwenmeijiale + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档