哈夫曼树及应用.docVIP

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

2.9.1 哈夫曼树及应用 ??? 哈夫曼树又称最优树(二叉树),是一类带权路径最短的树。构造这种树的算法最早是由哈夫曼(Huffman)1952年提出,这种树在信息检索中很有用。 结点之间的路径长度:从一个结点到另一个结点之间的分支数目。 树的路径长度:从树的根到树中每一个结点的路径长度之和。 结点的带权路径长度:从该结点到树根之间的路径长度与结点上权的乘积。 树的带权路径长度:树中所有叶子结点的带权路径长度之和,记作: ??????????????????????????????? ??? WPL为最小的二叉树就称作最优二叉树或哈夫曼树。 ??? 完全二叉树不一定是最优二叉树。 ??? 哈夫曼树的构造: (1)根据给定的n个权值{w1,w2,...,wn}构造n棵二叉树的集合F={T1,T2,...,Tn},其中Ti中只有一个权值为wi的根结点,左右子树为空; (2)在F中选取两棵根结点的权值为最小的数作为左、右子树以构造一棵新的二叉树,且置新的二叉树的根结点的权值为左、右子树上根结点的权值之和。 (3)将新的二叉树加入到F中,删除原两棵根结点权值最小的树; (4)重复(2)和(3)直到F中只含一棵树为止,这棵树就是哈夫曼树。 例1: 例2: 结点的存储结构: 构造哈夫曼树的算法说明: #define n????????????????? /* 叶子总数 */ #define? m? 2*n-1????? /* 结点总数 */ 证:由性质3,叶子结点数 n0=n2+1,故哈夫曼树结点总数为 n0+n2=n0+(n0-1)=2*n0-1 例3 在解某些判定问题时,利用哈夫曼树获得最佳判定算法。 (a) WPL=0.05*1+0.15*2+0.4*3+0.3*4+0.1*4=3.15 (b)(c) WPL=0.4*1+0.3*2+0.15*3+0.05*4+0.1*4=2.05??????????????????? WPL=0.05*3+0.15*3+0.4*2+0.3*2+0.1*2=2.2 哈夫曼编码 ??? 从哈夫曼树根结点开始,对左子树分配代码“0”,右子树分配代码“1”,一直到达叶子结点为止,然后将从树根沿每条路径到达叶子结点的代码排列起来,便得到了哈夫曼编码。 例,对电文 EMCAD 编码。若等长编码,则 ??? EMCAD = 000001010011100 共15位 设各字母的使用频度为 {E,M,C,A,D}={1,2,3,3,4}。用频度为权值生成哈夫曼树,并在叶子上标注对应的字母,树枝分配代码“0”或“1”: ? 各字母的编码即为哈夫曼编码:? EMCAD = 000001011011 共12位 2.9.2 二叉排序树 ??? 二叉排序树是一种特殊结构的二叉树,它作为一种表的组织手段,通常被称为树表。可以作为一种排序和检索的手段。 定义 二叉排序树或是空树,或是具有下述性质的二叉树:其左子树上所有结点的数据值均小于根结点的数据值;右子树上所有结点的数据值均大于或等于根结点的数据值。左子树和右子树又各是一棵二叉排序树。 对二叉排序树,若按中序遍历就可以得到由小到大的有序序列。如上图,中序遍历得: {2,3,4,8,9,9,10,13,15,18} 二叉排序树的生成 ??? 对任意一组数据元素序列{R1,R2,...,Rn},要生成一棵二叉排序树的过程为: (1)令R1为二叉树的根; (2)若R2RR1,令R2为R1左子树的根结点,否则R2为R1右子树的根结点; (3)对R3,...,Rn结点的插入方法同上。 例,数据元素序列{10,18,3,8,12,2,7,3},其生成二叉排序树的过程如下: 二叉排序树中结点的删除 ??? 要求删除一个结点后的二叉树仍是一棵二叉排序树。算法思想,分以下几种情况考虑: (1)被删除的结点是叶子结点,则只需修改其双亲结点的指针既可; (2)被删除结点p只有左子树pL或右子树pR,此时只要使左子树pL或右子树pR成为p双亲结点q的左子树或右子树即可。 (3)若被删除结点p的左、右子树均非空,有两种做法: 令pL直接链接到q的左(或右)孩子链域上,pR链接到p结点中序前趋结点s上(s是pL最右下的结点); 以p结点的直接中序前趋或后继替代p所指结点,然后再从原二叉排序树中删去该直接前趋或后继。  

文档评论(0)

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

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

版权声明书
用户编号:6203200221000001

1亿VIP精品文档

相关文档