哈夫曼树.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
哈夫曼树.ppt

* * * * * * 如何构造一个哈夫曼树 问题:根据给定的 n 个权值 {w1, w2, …, wn},构造一棵以这些权值为叶子的哈夫曼树? 1、用给定的n个权值构造n 棵以各权值为根的二叉树。 2、选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并且这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和;并删去这两棵二叉树,同时加入刚新生成的二叉树; 3、重复 第(2) 步,直至生成一棵树为止。 如何构造一个哈夫曼树 例如: 已知权值 W={ 5, 6, 2, 9, 7 } 9 5 6 2 7 5 2 7 6 9 7 6 7 13 9 5 2 7 6 7 13 9 5 2 7 9 5 2 7 16 6 7 13 29 0 0 0 0 1 1 1 1 00 01 10 110 111 哈夫曼树的特点 1、有n个叶子结点 2、没有度为1的结点 3、总的结点数为 2n-1 4、形态不唯一 哈夫曼树的应用--最佳判断过程 在考查课记分时往往把百分制转换成优( x=90 )、良 (80x90) 、中 (70=x80) 、及格 (60=x70) 、不及格 (x60) 五个等级。若不考虑学生考试分数的分布概率,程序判定过程很容易写成下图 所示的方法。 if (socre60) printf(bad); else if (socre70) printf(pass); else if (score80) printf(general); else if (score90) printf(good); esle printf(very good); 哈夫曼树的应用--最佳判断过程 我们知道,一般来讲学生考分大多分布在 70 至 80 分之间,从上图 可看出这种情的 x 值要比较 2 至 3 次才能确定等级。而学生中考试不及格的人数很少, x 值比较一次即可定等级。能否使出现次数多的在 70 至 80 分之间的 x 值比较次数减少些,而使很少出现的低于 60 分的 x 值比较次数多一些,以便提高程序的运行效率呢?假设学生成绩对于不及格、及格、中等、良好和优秀的分布概率分别为 5 %, 15 %, 40 %, 30 %, 10 %,以它们做为叶子的权值来构造哈夫曼树,如下图所示。此时带权路径长最短,其值为 205 %。它可以使大部分的分数值经过较少的比较次数得到相应的等级。 哈夫曼树的应用--最佳判断过程 但是,事务往往不是绝对的,此时每个判断柜内的条件较为复杂,比较两次,反而降低运行效 率。所以我们采用折衷作法,调整后得下图判定树。它更加切合实际。 哈夫曼树的应用—通信编码 在通信及数据传输中多采用二进制编码。为了使电文尽可能的缩短,可以对电文中每个字符出现的次数进行统计。设法让出现次数多的字符的二进制码短些,而让那 些很少出现的字符的二进制码长一些。假设有一段电文,其中用到 4 个不同字符A,C,S,T,它们在电文中出现的次数分别为 7 , 2 , 4 , 5 。把 7 , 2 , 4 , 5 当做 4 个叶子的权值构造哈夫曼树如下图所示。在树中令所有左分支取编码为 0 ,令所有右分支取编码为1。将从根结点起到某个叶子结点路径上的各左、右分支的编码顺序排列,就得这个叶子结点所代表的字符的二进制编码,如图所示。 哈夫曼树的应用—通信编码 这些编码拼成的电文不会混淆,因为每个字符的编码均不是其他编码的前缀,这种编码称做前缀编码。   关于信息编码是一个复杂的问题,还应考虑其他一些因素。比如前缀编码每个编码的长度不相等,译码时较困难。还有检测、纠错问题都应考虑在内。这里仅对哈夫曼树举了一个应用实例。 * 遍历的作用:将一般的表达式转换为后缀表示(波兰表达式)时,可将表达式写成有序树,再化为二叉树,然后进行中序遍历,其遍历序列即为表达式的波兰表示式。 将一个无序序列构造成二叉排序树以后,中序遍历二叉排序树就可以得到有序序列。 * 遍历的作用:将一般的表达式转换为后缀表示(波兰表达式)时,可将表达式写成有序树,再化为二叉树,然后进行中序遍历,其遍历序列即为表达式的波兰表示式。 将一个无序序列构造成二叉排序树以后,中序遍历二叉排序树就可以得到有序序列。 * 左指针域:用于指向该结点的左子结点的存储地址 右指针域:指向右子结点。 * 左指针域:用于指向该结点的左子结点的存储地址 右指针域:指向右子结点。 * 左指针域:用于指向该结点的左子结点的存储地址 右指针域:指向右子结点。 * 左指针域:用于指向该结点的左子结点的存储地址 右指针域:指向右子结点。 * 左指针域:用于指向该结点的左子结点的存储地址 右指针域:指向右子结点。 * 左指针域:用于指向该结点的左子结点

文档评论(0)

lyb01 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档