数据结构哈弗曼树.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文档。上传文档
查看更多
数据结构哈弗曼树

6.7 哈夫曼树 一、Huffman树 二、Huffman编码 6.7.1 Huffman树(最优二叉树) 若干术语: 路 径:由一结点到另一结点间的分支所构成。 路径长度:路径上的分支数目。 例如:a→e的路径长度=2 二叉树的路径长度:从二叉树根到所有叶子结点的路径长度之和。树路径长度=8 二叉树的带权路径长度:从二叉树根结点到所有叶子结点的路径长度与相应叶子结点权值的乘积之和(WPL)即树中所有叶子结点的带权路径长度之和 Huffman树:带权路径长度最小的树。 Huffman常译为哈夫曼、赫夫曼、霍夫曼等 树的带权路径长度如何计算? WPL = (wklk 构造Huffman树的基本思想: 权值大的结点用短路径,权值小的结点用长路径。 构造Huffman树的步骤(即Huffman算法): (1) 由给定的 n 个权值{ w1, w2, …, wn }构造n棵二叉树的集合F = { T1, T2, …, Tn } (即森林) ,其中每棵二叉树 Ti wi 的根结点,其左右子树均空。 (2) 在F 中选取两棵根结点权值最小和次小的树分别做为左右子树构造一棵新的二叉树,且让新二叉树根结点的权值等于其左右子树的根结点权值之和。 (3) 在F 中删去这两棵树,同时将新得到的二叉树加入 F中。 (4) 重复(2) 和(3) , 直到 F 只含一棵树为止。这棵树便是Huffman树。 具体操作步骤: 对权值进行合并、删除与替换 ——在权值集合{7,5,2,4}中,总是合并当前值最小的两个权 具体操作步骤: 对权值进行合并、删除与替换 ——在权值集合{7,5,2,4}中,总是合并当前值最小的两个权 Huffman树特点:肯定没有度为1的结点;一棵有n 0个叶子结点的Huffman树,共有2n0-1个结点; 讨论:Huffman树有什么用? 例:设有4个字符d,i,a,n,出现的频度分别为7,5,2,4, 怎样编码才能使它们组成的报文在网络中传得最快? 法1:等长编码 令d=00,i=01,a=10,n=11,则: WPL1=2bit×(7+5+2+4)=36 法2:不等长编码 令d=0;i=10,a=110,n=111,则: WPL2=1bit×7+2bit×5+3bit×(2+4)=35 6.7.2 哈夫曼编码问题 哈夫曼树可用于构造代码总长度最短的编码方案。具体构造方法如下: 设需要编码的字符集合为{d1,d2,…,dn}{w1,w2,…,wn},以d1,d2,…,dn作为叶结点,以w1,w2,…,wn作为各叶结点的权值构造一棵二叉树,规定哈夫曼树中的左分支为0,右分支为1,则从根结点到每个叶结点所经过的分支对应的0和1组成的序列便为该结点对应字符的编码。这样的代码总长度最短的不等长编码称之为哈夫曼编码。 明确:要实现哈夫曼编码,就要先构造哈夫曼树 按左“0”右“1” 对哈夫曼树的所有分支编号 ——在 哈夫曼树的基础上构造哈夫曼编码 哈夫曼编码结果:d=0, i=10, a=110, n=111 WPL=1bit×7+2bit×5+3bit(2+4)=35(小于等长码的WPL=36) 在建立不等长编码时,必须使任何一个字符的编码都不是另一个字符编码的前缀,这样才能保证译码的惟一性。 例:若字符a的编码为01,b的编码为010, c的编码为10 对于代码串01010,在译码时无法判定是将前两位码01译成字符a还是将前三位码010译为字符b。 在哈夫曼树中,由于每个字符结点都是叶子结点,而叶子结点不可能在根结点到其他叶子结点的路径上,所以任何一个字符的哈夫曼树编码不可能是另一个字符的哈夫曼编码的前缀。 练习:假设用于通信的电文仅由5个字母{A,B,C,D,E}组成,字母在电文中出现的次数分别为2,4,5,7,8。试为这5个字母设计哈夫曼编码。 A:010 B:011 C:00 D:10 E:11 6.8 树与二叉树的转换 讨论1:树如何转为二叉树? 转换步骤: step1: 将树中兄弟结点之间加一连线; step2: 保留结点的最左孩子连线,删除其它孩子连线; step3: 整理保留和添加的连线。 讨论3:森林如何转为二叉树? 即F={T1, T2, …,Tm} B={root, LB, RB} 法一: ① 各森林先各自转为二叉树; ② 依次连到前一个二叉树的右子树上。 法二:森林直接变兄弟,再转为二叉树 法一和法二得到的二叉树是完全相同的、惟一的。 森林转二叉树举例: (用法一,各森林先转二叉树,在连接成一棵二叉树) 森林转二叉树举例: (用法二,森林直接变兄弟,再转为二叉树) 讨论4:二叉树如何还原为森林?

文档评论(0)

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

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

1亿VIP精品文档

相关文档