求二叉树-浙江工商大学.PPT

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

17. 哈夫曼编码 6.17 哈夫曼编码 6.17.1 背景 若一段程序有1000条指令,其中I1大约有400条,I2大约有300条,I3大约有150条,I4大约有50条,I5大约有40条,I6大约有30条,I7大约有30条。那么是否有一种编码方式能够实现程序长度最短? 哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。该技术一般可将数据压缩掉20%至90%,其压缩效率取决于被压缩文件的特征。 6.17 哈夫曼编码 6.17.2 定长编码 如果采用定长编码,需要的编码长度是?log27?=3。 该段程序的总位数大约为3×1000=3000。 指令 I1 I2 I3 I4 I5 I6 I7 编码 000 001 010 011 100 101 110 6.17 哈夫曼编码 6.17.3 变长编码 我们的思路是使用频率高的指令采用短的编码,这样才能缩短程序长度。比如: 但是事情没有这样简单。比如,00解释成两个I1,还是一个I3。因此,上述编码不能用。 指令 I1 I2 I3 I4 I5 I6 I7 编码 0 1 00 01 000 001 010 6.17 哈夫曼编码 6.17.4 前缀码 如果在一个编码系统中,任一个编码都不是其他任何编码的前缀(最左子串),则称该编码系统中的编码是前缀码。 例如,一组编码01,001,010,100,110就不是前缀码,因为01是010的前缀,若去掉01或010就是前缀码。例如,名字中的郑霞、郑霞锦就不是前缀码。 6.17 哈夫曼编码 6.17.5 哈夫曼编码 思路:对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予1,右分支赋予0(相反也行),则从根到每个叶子的通路上,各分支的赋值分别构成一个二进制串,该二进制串就称为哈夫曼编码。(注意不是从叶子到根) 指令 I1 I2 I3 I4 I5 I6 I7 频率 0.4 0.3 0.15 0.05 0.04 0.03 0.03 编码 0 10 110 11100 11101 11110 11111 6.17 哈夫曼编码 6.17.5 哈夫曼编码 哈夫曼编码是前缀码 证明:哈夫曼编码是根到叶子路径上的边的编码的序列。而由树的特点知,若路径A是另一条路经B的最左部分,则B经过了A,因此,A的终点不是叶子。而哈夫曼编码都对应终点为叶子的路径,所以,任一哈夫曼码都不会与任意其他哈夫曼编码的前部分完全重叠,得证。 6.17 哈夫曼编码 6.17.5 哈夫曼编码 哈夫曼编码是最优前缀码。 比如,对于n个字符,分别以它们的使用频度为叶子权,构造哈夫曼树,则该树对应的哈夫曼编码,能使各种报文(由这n种字符构成的文本)对应的二进制串的平均长度最短。 6.17 哈夫曼编码 6.17.5 哈夫曼编码 计算哈夫曼编码的平均码长 pi为各个编码对应的概率,li为各个编码对应的长度。 采用哈夫曼编码后,该段程序的总位数大约为 1×400+2×300+3×150+5×(50+40+30+30)=2200。平均码长为2200/1000=2.2。 指令 I1 I2 I3 I4 I5 I6 I7 频率 0.4 0.3 0.15 0.05 0.04 0.03 0.03 编码 0 10 110 11100 11101 11110 11111 18. 并查集 6.18 并查集 6.18.1 背景 大侠的规则 碰到和自己不是一路人的,就免不了要打一架。 绝对不打自己的朋友。 信奉“朋友的朋友就是我的朋友” 两个原本互不相识的人,如何判断是否属于一个朋友圈呢? 6.18.1 背景 寻找亲戚 如Marry和Tom是亲戚,Tom和Ben是亲戚,可以推出Marry和Ben是亲戚。 如果有完整的家谱,判断两个人是否亲戚是可行的。 6.18 并查集 但如果是远亲,那么检验亲戚关系就十分复杂。 在这种情况下,就需要应用并查集。 6.18.2 并查集概念 并查集(英文:Disjoint Set,即“不相交集合”)。将编号分别为1…N的N个对象划分为不相交集合,在每个集合中,选择其中某个元素代表所在集合。 常见两种操作: 合并两个集合 查找某元素是否属于哪个集合 所以,称为“并查集”。 6.18 并查集 6.18.3 并查集实现方法(1) 定义一个数组 set[1..n] ,其中set[i] 表示元素i 所在的集合;用编号最小的元素标记所在集合 比如:不相交集合: {1,3,7}, {4}, {2,5,9,10}, {6,8} 6.18 并查集 i 1 2 3 4 5 6 7 8 9 10 set[i] 1 2 1 4 2 6 1 6 2 2 6.18.3 并查集实现方法(1) 查找某个元素(时间复杂度O(1)) find

文档评论(0)

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

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

1亿VIP精品文档

相关文档