树和二叉树(5哈夫曼树及其应用).ppt

上传人:灯火****19 文档编号:135053963 上传时间:2020-06-11 格式:PPT 页数:111 大小:1.14MB
返回 下载 相关 举报
树和二叉树(5哈夫曼树及其应用).ppt_第1页
第1页 / 共111页
树和二叉树(5哈夫曼树及其应用).ppt_第2页
第2页 / 共111页
树和二叉树(5哈夫曼树及其应用).ppt_第3页
第3页 / 共111页
树和二叉树(5哈夫曼树及其应用).ppt_第4页
第4页 / 共111页
树和二叉树(5哈夫曼树及其应用).ppt_第5页
第5页 / 共111页
点击查看更多>>
资源描述

《树和二叉树(5哈夫曼树及其应用).ppt》由会员分享,可在线阅读,更多相关《树和二叉树(5哈夫曼树及其应用).ppt(111页珍藏版)》请在金锄头文库上搜索。

1、6 6哈夫曼树及其应用 1 相关概念路径 从树中一个结点到另一个结点所经过的分支序列或者说结点序列 如结点A到结点F的路径为 A B E F A B C D E F G 6 6 1最优二叉树 路径长度 路径上面的分支个数 如A F的路径长度为3 A B C D E F G 树的路径长度 从树根到每一个结点的路径长度之和 如左边树的路径长度为 Len A B Len A C Len A D Len A E Len A F Len A G 1 1 2 2 3 3 12 A B C D E F G 结点的权值 在某些应用中 树中结点往往要和一定的数值联系起来 那么这个数值通常称为该结点的权值 简称权

2、 如左图 A B C D E F G 4 1 2 5 3 7 结点的带权路径长度 该结点到根结点的路径长度与该结点上权的乘积 如结点E的带权路径长度为 Len E A 3 2 3 6 A B C D E F G 4 1 2 5 3 7 树的带权路径长度 树中所有叶子结点的带权路径长度之和 记作 WPL w1 L1 w2 L2 wn Ln A B C D E F G w1 w2 w3 w4 最优二叉树 哈夫曼树 给定n个权值 w1 w2 wn 试构造一棵有n个叶子结点的二叉树 每个叶子结点带权为wi 构造出来的二叉树的形态可以有多个 我们把其中带权路径长度WPL最小的二叉树称作最优二叉树或者哈夫

3、曼树 A B C D E F G w1 w2 w3 w4 2 哈夫曼算法 1 如何构造一棵哈夫曼树 我们首先通过一个例子来演示一下构造过程 当权值为 7 5 2 4 时 构造哈夫曼树 7 5 2 4 当权值为 7 5 2 4 时 构造哈夫曼树 7 5 2 4 6 当权值为 7 5 2 4 时 构造哈夫曼树 7 2 4 6 5 当权值为 7 5 2 4 时 构造哈夫曼树 7 2 4 6 5 11 当权值为 7 5 2 4 时 构造哈夫曼树 7 2 4 6 5 11 当权值为 7 5 2 4 时 构造哈夫曼树 7 2 4 6 5 11 18 2 哈夫曼算法的语言描述 根据给定的n个权值 w1 w2

4、 wn 构成n棵二叉树的集合F T1 T2 Tn 其中每棵二叉树Ti中只有一个带权为wi的根结点 其左右子树为空 在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树 且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和 在F中删除这两棵树 同时将新得到的二叉树加入F中 重复 和 直到F只含一棵树为止 这棵树便是哈夫曼树 6 6 2哈夫曼编码 对于字符串 ABACCDA 共有7个字符 4种字符 其中A B C D出现的次数分别为3 1 2 1 现在要对字符串进行0 1编码 有哪些方法 哪一种编码的长度最短 1 各种编码方式 1 定长编码 根据出现的字符种数进行编码字符串 AB

5、ACCDA 中共出现4种字符 那么可以用2位表示 那么字符串 ABACCDA 的编码将为 00010010101100 总长度为7 2 14位 1 各种编码方式 1 定长编码 根据出现的字符种数进行编码这种编码方式可以对应到二叉树 如右图所式 A B C D 0 0 0 1 1 1 1 各种编码方式 2 变长编码当A B C D按照如下形式进行编码时 那么字符串 ABACCDA 的编码将为 0110010101110 总长度为13位 比第二种方式又要短 采取这种变长编码方式 需要遵循一个原则 即每一个字符的编码都不应该是另一个字符编码的前缀 否则就会出现二义性 1 各种编码方式 2 变长编码这

6、种编码方式也可以对应到二叉树 如右图所式 A B C 0 0 1 1 D 0 1 1 各种编码方式 2 变长编码如当A B C D按照如下形式进行编码时 请将 0111 翻译成字符串 试一试 有哪些翻译方式 之所以会出现二义性 是因为出现了A的编码是C的编码的前缀 B的编码是D的编码的前缀 1 各种编码方式 2 变长编码这样 这些编码恢复成二叉树的形式时 不会形成A B C D恰好为二叉树的叶子结点 如右图 A C B 0 1 1 1 D 1 1 各种编码方式 从上面的分析可以看出 一个可用的编码必须满足每个字符的编码不能是其他编码的前缀 也可以看出 每一个可用的编码都可以转化成二叉树的形式

7、这样编码理论便可以与二叉树的一些性质结合起来 就可以应用二叉树的理论知识来解决编码问题 1 各种编码方式 3 哈夫曼编码假设编码过程中有以下对应关系 那么总的编码长度为 WPL w1 L1 w2 L2 w3 L3 w4 L4那么如何选择L1 L2 L3 L4的值 使得WPL最小呢 1 各种编码方式 3 哈夫曼编码 可以看出 该公式与哈夫曼树满足的公式一模一样 那么我们可以采取构造哈夫曼树的方式来求编码的长度 对于字符串 ABACCDA 共有7个字符 4种字符 其中A B C D出现的次数分别为3 1 2 1 根据权值 3 1 2 1 构造哈夫曼树 1 2 3 1 A B C D 对于字符串 A

8、BACCDA 共有7个字符 4种字符 其中A B C D出现的次数分别为3 1 2 1 根据权值 3 1 2 1 构造哈夫曼树 3 2 1 1 B D C A 对于字符串 ABACCDA 共有7个字符 4种字符 其中A B C D出现的次数分别为3 1 2 1 根据权值 3 1 2 1 构造哈夫曼树 3 2 1 1 B D C A 2 对于字符串 ABACCDA 共有7个字符 4种字符 其中A B C D出现的次数分别为3 1 2 1 根据权值 3 1 2 1 构造哈夫曼树 3 2 1 1 B D C A 2 对于字符串 ABACCDA 共有7个字符 4种字符 其中A B C D出现的次数分别

9、为3 1 2 1 根据权值 3 1 2 1 构造哈夫曼树 3 2 1 1 B D C A 2 4 对于字符串 ABACCDA 共有7个字符 4种字符 其中A B C D出现的次数分别为3 1 2 1 根据权值 3 1 2 1 构造哈夫曼树 3 2 1 1 B D C A 2 4 对于字符串 ABACCDA 共有7个字符 4种字符 其中A B C D出现的次数分别为3 1 2 1 根据权值 3 1 2 1 构造哈夫曼树 3 2 1 1 B D C A 2 4 7 下面对哈夫曼树进行编码 每一个结点的左分支上面标0 右分支上面标1 3 2 1 1 B D C A 2 4 7 下面对哈夫曼树进行编码

10、 每一个结点的左分支上面标1 右分支上面标0 3 2 1 1 B D C A 2 4 7 0 下面对哈夫曼树进行编码 每一个结点的左分支上面标1 右分支上面标0 3 2 1 1 B D C A 2 4 7 0 1 下面对哈夫曼树进行编码 每一个结点的左分支上面标1 右分支上面标0 3 2 1 1 B D C A 2 4 7 0 1 0 下面对哈夫曼树进行编码 每一个结点的左分支上面标1 右分支上面标0 3 2 1 1 B D C A 2 4 7 0 1 0 1 下面对哈夫曼树进行编码 每一个结点的左分支上面标1 右分支上面标0 3 2 1 1 B D C A 2 4 7 0 1 0 1 0 下

11、面对哈夫曼树进行编码 每一个结点的左分支上面标1 右分支上面标0 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 A 0 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 A 0B

12、 1 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 A 0B 11 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 A 0B 110 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 A 0B 110C 1 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 A

13、0B 110C 10 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 A 0B 110C 10D 1 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 A 0B 110C 10D 11 3 2 1 1 B D C A 2 4 7 1 0 1 0 1 0 从根结点到各个叶子结点 所经分支上面的0 1序列 就是该叶子结点所代表字符的编码 A 1B 110C 10D 111 3 2 1 1 B D C

14、 A 2 4 7 1 0 1 0 1 0 思考 N个权值构造的哈夫曼树 树中结点总数是多少 哈夫曼树中 权值越大的结点越靠近根结点 该论断是否正确 2 哈夫曼编码的具体实现 输入字符及其权重根据权重构造哈夫曼树根据哈夫曼树编码 算法6 12的动态演示 1 存储结构的选择权值分别如下 这八个权值作为叶子结点 最终形成的哈夫曼树应共有2 8 1 15个结点 采用双亲孩子表示法来存储哈夫曼树 2 初始化 3 建树过程 第一步 第二步 第三步 第四步 第五步 第六步 第七步 4 编码过程 从叶子结点开始 向根回溯 来对叶子结点所代表的字符进行编码 以第一个叶子结点为例 1的双亲结点为9 且1是9的左孩

15、子 故分支应该标 0 所以编码 0 入栈 以第一个叶子结点为例 0 以第一个叶子结点为例 9的双亲结点为11 且9是11的右孩子 故分支应该标 1 所以编码 1 入栈 0 以第一个叶子结点为例 0 1 以第一个叶子结点为例 11的双亲结点为13 且11是13的右孩子 故分支应该标 1 所以编码 1 入栈 0 1 以第一个叶子结点为例 0 1 1 以第一个叶子结点为例 13的双亲结点为15 且13是15的左孩子 故分支应该标 0 所以编码 0 入栈 0 1 1 以第一个叶子结点为例 0 1 1 0 以第一个叶子结点为例 15的双亲结点为0 所以可以判断15就是根结点 那么第一个结点编码完毕 编码应该从栈顶向栈底读 为 0110 0 1 1 0 同理可以写出其他叶子结点的编码 思考 1 写出字符串 abbccccdddddddeee 的最短编码 2 当选择二叉链表来作为哈夫曼树的存储结构时 算法过程该如何描述

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号