数据结构详细设计.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文档。上传文档
查看更多
数 据 结 构 课 程 设 计 设 计 题 目 赫 夫 曼 树 年 级 专 业 学 生 姓 名 学 生 学 号 指 导 老 师 目 录 摘要………………………………………2 问题分析和任务定义……………………2 逻辑设计…………………………………2 详细设计…………………………………3 程序编码…………………………………4 程序调试与测试…………………………7 结果分析…………………………………7 设计创新及心得…………………………8 参考文献…………………………………8 设计摘要: 对于赫夫曼编码问题,在构造赫夫曼树时又要求能方便地实现从孩子结点到双亲结点的操作。因此,设计赫夫曼树的结点存储结构为双亲孩子存储结构。若有n个权值{w1,w2,……,wn},构造一棵有n个叶子结点的二叉树,每个叶子结点带权为wi,则其中带权路径长度WPL最小的二叉树称做赫夫曼树。根据定义,一棵二叉树要使其带权路径长度WPL值最小,必须使权值越大的叶结点越靠近根结点。 赫夫曼算法: (1)根据给定的n个权值{w1,w2,……,wn}构成n棵二叉树的集合F={T1,T2,……,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空。 (2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。 (3)在F中删除这两棵树,同时将所得到的二叉树加入F中。 (4)重复(2)和(3),直到F只含一棵树为止。这棵树便是赫夫曼树。赫夫曼树可用于构造代码总长度最短的编码方案。 方法如下: 设需要编码的字符集合为{d1,d2,……,dn},各个字符在电文中出现的次数集合为{w1,w2,……,wn},以d1,d2,……,dn作为叶结点,以w1,w2,……,wn作为各叶结点的权值构造一棵二叉树,规定赫夫曼树中的左分支为0,右分支为1,则从根结点到每个叶结点所经过的分支对应的0和1组成的序列便为该结点对应字符的编码。这样的代码总长度最短的不等长编码称为赫夫曼编码。 (一)问题分析和任务定义: 对于一组具有确定权值的叶结点可以构造出多个具有不同带权路径长度的二叉树,其中具有最小带权路径长度的二叉树称作赫夫曼树(或称最优二叉树)。利用赫夫曼树构造法建立最优二叉树函数,输入一段文本,能将其转换为赫夫曼编码,并以文件的方式保存。通过赫夫曼树转换成编码,对解决实际问题很有帮助。限制条件是所建立的二叉树中不存在度数为1的结点。 (二)逻辑设计:先建立赫夫曼树,然后再求赫夫曼编码。 ①赫夫曼树haffTree初始化 。n个叶结点的二叉树共有2n-1个结点 算法如下: for(i=0;i2*n-1;i++) { huff_node [i].weight=0; huff_node[i].parent=0; huff_node[i].flag=0; huff_node[i].lchild=-1; huff_node[i].rchild=-1; } ②构造赫夫曼树的算法如下所示: for(i=0;in-1;i++) { m1=m2=MAX; x1=x2=0; for(j=0;jn+i;j++) { if (huff_node[j].weightm1huff_node[j].flag==0) { m2=m1; x2=x1; m1=huff_node[j].weight; x1=j; } else if (huff_node[j].weightm2huff_node[j].flag==0) { m2=huff_node[j].weight; x2=j; } } ③求字符的赫夫曼编码的算法如下所示: for(i=0;in;i++) { cd.start=n; c=i; p=huff_node[c].parent; while(p!=0) { if(huff_node[p].lchild==c) cd.bits[cd.start]=0; else cd.bits[cd.start]=1;

文档评论(0)

企管文库 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档