哈夫曼树
定义
从树中一个节点到另一个节点之间的分支构成两个节点之间的路径
路径上的分支数目称为路径长度。如图所示,根节点到节点D
的路径长度为4。
树的路径长度就是从树根到每一个节点的路径长度之和
a
树
的
路
径
长
度
=
1
+
1
+
2
+
2
+
3
+
3
+
4
+
4
=
20
\begin{aligned} a树的路径长度 &= 1+1+2+2+3+3+4+4\\ &=20 \end{aligned}
a树的路径长度=1+1+2+2+3+3+4+4=20
设二叉树具有n
个带权值的叶子节点,那么从根节点到各个叶子节点的路径长度l
与相应节点权值的w
乘积的和,叫做二叉树的带权路径长度
W
P
L
=
∑
i
=
1
n
w
i
l
i
WPL = \displaystyle\sum^n_{i=1}w_il_i
WPL=i=1∑nwili
其中,将具有最小带权路径长度的二叉树称为哈夫曼树,也称最优树
a
的
W
P
L
=
5
×
1
+
15
×
2
+
40
×
3
+
30
×
4
+
10
×
4
=
315
\begin{aligned} a的WPL&=5 \times 1 + 15 \times 2 + 40 \times 3 + 30 \times 4 + 10 \times 4\\ &=315 \end{aligned}
a的WPL=5×1+15×2+40×3+30×4+10×4=315
构造哈夫曼树
- 权值越大的叶子节点越要靠近根节点
- 权值越小的叶子节点越要远离根节点
序列{A5,B15,C40,D30,E10}
,字母后的数字为权重
-
以权值递增顺序重新排列
A5
,E10
,B15
,D30
,C40
-
取序列中前两个权值最小的节点作为新节点
N1
的两个孩子节点,权值小的是左孩子,权值大的是右孩子
-
新节点
N1
的权值是两个孩子节点的权值之和,即5+10=15。用(N1)15
替换A5
和E10
,插入到有序序列中,保持从小到大排列
(N1)15
,B15
,D30
,C40
-
取前两个权值最小的节点
(N1)15
,B15
用(N2)30
替换(N1)15
和B15
,插入到有序序列中
(N2)30
,D30
,C40
-
取前两个权值最小的节点
(N2)30
,D30
用(N3)60
替换(N2)30
和D30
,插入到有序序列中,注意保持从小到大的排列
C40
,(N3)60
- 取前两个权值最小的节点
C40
,(N3)60
替换完成后序列只有N4
一个节点,哈夫曼树构造完成
此 时 的 W P L = 40 × 1 + 30 × 2 + 15 × 3 + 10 × 4 + 5 × 4 = 205 \begin{aligned} 此时的WPL&=40 \times 1 + 30 \times 2 + 15 \times 3 + 10 \times 4 + 5 \times 4\\ &=205 \end{aligned} 此时的WPL=40×1+30×2+15×3+10×4+5×4=205
哈夫曼树的特点
哈夫曼树没有单分支节点,即度为1的节点n1
的数目等于0
所以
n
=
n
0
+
n
1
+
n
2
=
n
0
+
n
2
=
2
n
0
−
1
n = n_0 + n_1 + n_2\\ = n_0 + n_2\\ =2n_0 - 1
n=n0+n1+n2=n0+n2=2n0−1
哈夫曼编码
现有序列 DBACADFEED
采用二进制来传输信息
A | 000 |
B | 001 |
C | 010 |
D | 011 |
E | 100 |
F | 101 |
011001000010000011101100100011
采用哈夫曼编码的方法,先分析字符在字符串中的权重
占比 | 放大100倍的权值 | |
---|---|---|
A | 0.20 | 20 |
B | 0.10 | 10 |
C | 0.10 | 10 |
D | 0.30 | 30 |
E | 0.20 | 20 |
F | 0.10 | 10 |
构造哈夫曼树
规定哈夫曼树中的左分支为0
,右分支为1
从根节点到每个叶子节点所经过的分支对应的0和1组成的序列便为该节点对应字符的编码。这样的编码称为哈夫曼编码。
A | 00 |
B | 1010 |
C | 1011 |
D | 11 |
E | 01 |
F | 100 |
得到哈夫曼编码
1110100010110011100010111
比原来少了5个字符。
前缀编码
在一组字符的哈夫曼编码中,不可能出现一个字符的哈夫曼编码是另一个字符哈夫曼编码的前缀。上面的表格就不存在容易与1010
混淆的101
- 没有两个字符的编码相同
- 没有两个字符编码的前缀相同
例1
5个字符有如下4种编码方法,其中不是前缀编码的是
A. 01
,0000
,0001
,001
,1
B. 011
,000
,001
,010
,1
C. 000
,001
,010
,011
,100
D. 0
,100
,110
,1110
,1100
D选项中110
和1100
前缀重复,不是前缀编码
例2
对n( n ≥ 2 )个权值均不同的字符构成哈夫曼树,关于该树的叙述中,错误的是
A. 该树一定是一棵完全二叉树
B. 该树中一定没有度为1的节点
C. 树中两个权值最小的节点一定是兄弟节点
D. 树中任一非叶子节点的权值一定不小于下一层任一节点的权值
选A
例3
如果一棵哈夫曼树T中共有255个节点,那么该树用于对几个字符进行哈夫曼编码
解:
没有度为1的节点
n = 2n0 - 1
推出n0 = 128
按照哈夫曼树的定义,叶子节点即为字符,所以该树用于对128个字符进行哈夫曼编码