《数据结构》—— 哈夫曼树

x33g5p2x  于2021-11-21 转载在 其他  
字(0.9k)|赞(0)|评价(0)|浏览(454)

1. 带权路径长度

结点的权: 有某种现实含义的数值(如:表示结点的重要性等)
结点的带权路径长度: 从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积。例如:叶子节点为5= 结点值*路径长度 = 5 *3=15

树的带权路径长度: 树中所有叶结点的带权路径长度之和(WPL, Weighted Path Length)

【注意】:只算叶子结点!

2. 哈夫曼树的构造

在含有n个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树。也称最优二叉树。例如,上图的第2、3二叉树都是哈夫曼树。

给定n个权值分别为w1, w2,w3,…, wn的结点集合,如何构造哈夫曼树?

  1. 从这些结点中,找出来两个权值最小的结点构成兄弟,以左小右大的方式;
  2. 1步骤兄弟组成的根节点的权值是 兄弟权值之和;
  3. 然后再从结点集合中找出2个权值最小的结点构成兄弟,重复1 2 步骤,最终得到一棵二叉树。

WPL = 23+43+52+71=6+12+10+7=35

特点:

  • 每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大;
  • 哈夫曼树的结点总数为2n − 1;
  • 哈夫曼树中不存在度为1的结点;
  • 哈夫曼树并不唯一,但WPL必然相同且为最优。

3. 哈夫曼编码

原理:

  • 将每个出现的字符当作一个独立的结点,其权值为它出现的频度(或次数),构造出对应的哈夫曼树;
  • 将字符的编码解释为从根至该字符的路径上边标记的序列;
  • 其中边标记为0表示"转向左孩子",标记为1表示"转向右孩子"。

哈夫曼编码可用于数据压缩。
固定长度编码——每个字符用相等长度的二进制位表示;
可变长度编码——允许对不同字符用不等长的二进制位表示;
若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码

假设100题中有80题选C,10题选A,8题选B,2题选D
所有答案的二进制长度=80* 2+10* 2+8* 2+2* 2=200 bit。
构成二叉树:

即:A–00,B–01,C–10,D–11。

构成哈夫曼树是:结点A权值10,B值8,C值80,D值2。

即:C–0 ,A–10,B–111,D–110。(可变长度编码)

相关文章