- 1、本文档共177页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
对应二叉树的后序遍历序列 - 浙江工商大学
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)) find1(x) { return set[x]; } 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(n)) merge1(a,b)// a,b是两个集合标号 { i = min(a,b); j = max(a,b); for (k=1; k=n; k++) { if (set[k] == j) set[k] = i; } } 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.4 并查集实现方法(2) 定义一个数组 set[1..n] ,每个集合用一棵“有根树”(即有向树,指定了根的树)表示 set[i] = i , 则i表示本集合,且是集合对应树的根。 set[i] = j, ji, 则 j 是 i 的双亲节点。 6.18 并查集 6.18.4 并查
您可能关注的文档
最近下载
- 内蒙古乌尼特矿业有限责任公司乌尼特煤矿接续生产环境影响报告书.doc
- 特种设备-维护保养记录(叉车-电动托盘堆垛车).docx
- 《多边形的内角和》 示范教学PPT课件【初中数学人教版八年级上册】.pptx
- 紧密型县域医疗卫生共同体消毒供应中心运营指南(2020年版 医联体建设).docx
- 泵站运行考试(高级)习题库(第1部分).pdf
- 挡土墙计算理正岩土(“挡土墙”文档)共21张.pptx
- XXXX生态风景区智慧景区项目施工组织方案及对策.pdf
- 陈培勋平湖秋月五线谱钢琴谱.pdf
- 可爱的中国教案第10课可爱的中国第十课同心共筑中国梦.docx
- 2024《S市乡镇幼儿教师职业幸福感问卷调研分析报告》9700字.docx VIP
文档评论(0)