赫夫曼树(Haffman)及其运用

赫夫曼树,别名“哈夫曼树”、“最优树”以及“最优二叉树”。

概念:

在这里插入图片描述

  • 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。
    (从根结点到结点 a 之间的通路就是一条路径。)

  • 路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。
    (在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图 中从根结点到结点 c 的路径长度为 3)

  • 结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。
    (图中结点 a 的权为 7,结点 b 的权为 5。)

  • 结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。
    (图中结点 b 的带权路径长度为 2 * 5 =10 )

  • 树的带权路径长度为树中所有叶子结点的带权路径长度之和。通常记作 “WPL” 。(图中所示的这颗树的带权路径长度为:WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3)

赫夫曼树(最优二叉树)

假设有n个权值(ω1,ω2,…ωn),试构造一棵有n个叶子结点的二叉树,每个叶子结点的带权为ωi(有多少种方式?)
其中:带权路径长度WPL最小的二叉树称作赫夫曼树。

构造:
对于给定的有各自权值的 n 个结点,构建哈夫曼树有一个行之有效的办法:

1.在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;
2.在原有的 n个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中
以此类推; 重复 1 和 2,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树。
在这里插入图片描述

赫夫曼树的特点

  • 权值越大的结点,距离根结点越近。
  • 树中没有度为1的结点,这类树又叫做正则(严格)二叉树。
  • 树的带权路径长度最短。

赫夫曼编码

  • 前缀编码:任一个字符的编码都不是另一个字符的编码的前缀。
  • 由赫夫曼树得到的平均长度最短的二进制前缀编码
  • 平均长度最短:源于赫夫曼树保证了WPL(带权路径长度之和)最小
  • 从赫夫曼树的根结点到每一个叶子结点的路径,都可以等价为一段二进制编码。

在这里插入图片描述
为什么不能用二叉树代替赫夫曼树构造前缀码?

  • 由赫夫曼树的特性知:赫夫曼树的带权路径长度是最短的,赫夫曼编码过程中,每个字符的权值都是在字符中出现的次数,路径长度即为每个字符编码的长度,出现次数最多的字符编码长度越短,因此整个字符串被编码后的前缀码长度最短——赫夫曼编码产生的是最短前缀码

例:对于n(n≥2)个权值均不相同的字符构成的哈夫曼树,关于该树的叙述中,错误的是(B)

   A. 该树一定是一棵完全二叉树
   B. 树中一定没有度为1的结点
   C. 树中两个权值最小的结点一定是兄弟结点
   D. 树中任一非叶结点的权值,一定不小于下一层任一
        结点的权值

解析:

哈夫曼树为带权路径长度最小的二叉树,不一定是完全二叉树。
哈夫曼树中没有度为1的结点
构造哈夫曼树时,最先选取两个权值最小的结点作为左右子树构造一棵新的二叉树,C正确;
哈夫曼树中任一非叶结点P的权值为其左右子树根结点权值之和,其权值不小于其左右子树根结点的权值,在与结点P的左右子树根结点处于同一层的结点中,若存在权值大于结点.P权值的结点Q,那么结点Q的兄弟结点中权值较小的一个应该与结点P作为左右子树构造新的二叉树。综上可知,哈夫曼树中任一非叶结点的权值一定不小于下一层任一结点的权值。

例:下列选项给出的是从根分别到达两个叶结点路径上的权值序列,能属于同一棵哈夫曼树的是 (D)

   A. 24, 10, 5和24, 10, 7  
   B. 24, 10, 5和24, 12, 7
   C. 24, 10, 10和24, 14, 11     
   D. 24, 10, 5和24, 14, 6

解析:

哈夫曼树是带权路径长度最短的二叉树。由根节点出发到两个叶子节路径中,第二个被访问的两个结点的权值要么相等,要么和为根节点的权值,故B项错误。同理,通过第三个被访问的节点排除A项。
由两条路径可推出三个叶子节点的权值分别是:3、10和11,而根据哈夫曼树的定义可知,权值为3的节点应该和权值为10的结点结合,故C项错误。
D项,反推出有四个叶子节点,权值分别为:5、5、6和8,满足哈夫曼树的条件。

例: 已知字符集{a, b, c, d, e, f},若各字符出现的次数分别为6, 3, 8, 2, 10, 4, 则对应字符集中各字符的哈夫曼编
码可能是()

   A. 00, 1011, 01, 1010, 11, 100
   B. 00, 100, 110, 000, 0010, 01 
   C. 10, 1011, 11, 0011, 00, 010
   D. 0011, 10, 11, 0010, 01, 000

解析:

任一个字符的编码都不是另一个字符的编码的前缀。

猜你喜欢

转载自blog.csdn.net/weixin_43787365/article/details/105922404