- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DS07_树c_陈越主编_数据结构要点
? 哈夫曼树的构造 第4章 树 1 2 3 4 5 9 6 15 3 1 2 3 3 6 3 1 2 3 ? 每次把权值最小的两棵二叉树合并 §4.6.2 哈夫曼树 typedef struct TreeNode *HuffmanTree; struct TreeNode{ int Weight; HuffmanTree Left, Right; } HuffmanTree Huffman( MinHeap H ) { /* 假设H-Size个权值已经存在H-Elements[]-Weight里 */ int i; HuffmanTree T; BuildMinHeap(H); /*将H-Elements[]按权值调整为最小堆*/ for (i = 1; i H-Size; i++) { /*做H-Size-1次合并*/ T = malloc( sizeof( struct TreeNode) ); /*建立新结点*/ T-Left = DeleteMin(H); /*从最小堆中删除一个结点,作为新T的左子结点*/ T-Right = DeleteMin(H); /*从最小堆中删除一个结点,作为新T的右子结点*/ T-Weight = T-Left-Weight+T-Right-Weight; /*计算新权值*/ Insert( H, T ); /*将新T插入最小堆*/ } T = DeleteMin(H); return T; } 整体复杂度为O(N logN) ? 哈夫曼树的特点: ? 没有度为1的结点; ? 哈夫曼树的任意非叶节点的左右子树交换后仍是哈夫曼树; ? n个叶子结点的哈夫曼树共有2n-1个结点; ? 也就是说,与一棵哈夫曼树同构的二叉树都是哈夫曼树; ? 对同一组权值{w1 ,w2 , … , wn},是否存在不同构的两棵哈夫曼树呢? 【定义】在不考虑结点权值的情况下,如果二叉树A通过任意结点的左右子树交换,可以变成二叉树B,那么就称A和B是同构的。 Yes! 第4章 树 §4.6.2 哈夫曼树 ? 对一组权值{ 1, 2 , 3, 3 },不同构的两棵哈夫曼树: 1 2 3 3 WPL = 18 WPL = 18 1 2 3 3 第4章 树 §4.6.2 哈夫曼树 ? 哈夫曼编码 ? 给定一段字符串,如何对字符进行编码,可以使得该字符串的编码存储空间最少? [例4.10] 假设有一段文本,包含58个字符。经过统计,发现其中只有7个字符是互不相同的,它们是:a,e,i,s,t,空格(sp),换行(nl)。 【分析】如果用等长ASCII编码:58 ×8 = 464位; 如果用等长3位编码:58 ×3 = 174位; 如果出现频率高的字符用的编码短些,出现频率低的字符则可以编码长些;以期得到总的编码长度最短。 ? 最优解决方案是 “哈夫曼(Huffman)编码” 。 第4章 树 §4.6.2 哈夫曼树 0 0 0 1 1 1 1 1 1 a x u z 0 0 0 Cost ( aaaxuaxz ? 00010110010111 ) = 1?4 + 3?1 + 2?2 + 3?1 = 14 Cost ( aaaxuaxz ? 0000001001001011 ) = 2?4 + 2?1 + 2?2 + 2?1 = 16 ? 如果字符Ci 在深度di的地方并且出现的频率是 fi , 那么编码总长cost = ? di fi . a u x z 答案是 aaaxuaxz (编码 a = 0, u = 110, x = 10, z = 111). 如何能够保证解码工作无二义地进行? 关键是: 任何字符的编码不能是别的字符编码的前缀. 对如下编码方式, a = 0, u = 110, x = 10, z = 111 码串 00010110010111, 该如何解码? ? 所有字符都只出现在“满二叉树”(full tree)的叶子上时任何码串都可以无二义地解码–—— 这样的码叫做前缀码prefix code. 所有结点要么有两个孩子,要么是叶子。 ?二叉树用于编码 求编码总长最小的“满二叉树”,其中所有字符对应于二叉树的
您可能关注的文档
- DCS培训要点.ppt
- cy3液压操作机构要点.ppt
- CRRT-石家庄要点.ppt
- DCS控制系统原理要点.ppt
- DATALOGICPBT7100操作手册与故障排除要点.ppt
- DCS操作规程培训要点.ppt
- DEH-NK汽轮机综合控制系统操作说明书KVIEW要点.doc
- Deform-3d热处理模拟操作要点.doc
- DeltaV系统标准化操作规程要点.docx
- DHA藻油与植物食用油的调配要点.doc
- 半导体材料性能提升技术突破与应用案例分析报告.docx
- 半导体设备国产化政策支持下的关键技术突破与应用前景报告.docx
- 剧本杀市场2025年区域扩张策略研究报告.docx
- 剧本杀行业2025人才培训体系构建中的市场需求与供给分析.docx
- 剧本杀行业2025年人才培训行业人才培养模式创新与探索.docx
- 剧本杀行业2025年内容创作人才需求报告.docx
- 剧本杀行业2025年区域市场区域剧本市场消费者满意度与市场竞争力研究报告.docx
- 剧本杀市场2025年区域竞争态势下的区域合作策略分析报告.docx
- 剧本杀行业2025人才培训与行业人才培养模式创新.docx
- 剧本杀行业剧本创作人才心理素质培养报告.docx
文档评论(0)