1、从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径的长度。
2、树的路径长度是从树根到每一结点的路径长度之和。
3、树的带权路径长度(WPL)是树中所有叶子结点的带权路径长度之和。
4、带权路径长度 WPL 最小的二叉树称作哈夫曼树。
哈夫曼算法描述
- 根据给定的
n
个权值
{w1,w2,...,wn} 构成 n 棵二叉树的集合F={T1,T2,...,Tn} ,其中每棵二叉树 Ti 中只有一个带权为 wi 根结点,其左右子树均为空。 - 在 F 中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
- 在
F 中删除这两棵树,同时将新得到的二叉树加入 F 中。 - 重复
2 和 3 步骤,直到F 只含一棵树为止。这棵树就是哈夫曼树。
假设六个字母的频率(权值)为
A27,B8,C15,D15,E30,F5
,合起来正好是100%。
用哈夫曼算法构造哈夫曼树的过程如下:
1、先把字母按频率从小到大的顺序排列成一个有序序列,即:
F5,B8,C15,D15,A27,E30
。
2、取头两个最小权值的结点作为一个新结点
N1
的两个子结点,
F
为
3、将
N1
替换
F
和
4、重复步骤 2。将
N1
与
C
作为一个新结点
5、将
N2
替换
N1
和
C
,插入有序序列中,保持从小到大排序。即:
6、重复步骤 2。将
D
与
7、将
N3
替换
D
和
8、重复步骤 2。将
N2
与
E
作为一个新结点
7、将
N4
替换
N2
和
E
,插入有序序列中,保持从小到大排序。即:
8、重复步骤 2。将
N3
与
N4
作为一个新结点
N5
的两个子结点。
N5
的权值为 100。
。
哈夫曼编码
左图为构造哈夫曼树的过程的权值显示。右图为将权值左分支改为 0,右分支改为 1 后的哈夫曼树。
此时,对六个字母用从树根到叶子所经过路径的 0 或 1 来编码,可以得到如下表所示的定义。
字母 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
二进制字符 | 01 | 1001 | 101 | 00 | 11 | 1000 |
而若字母用相应的二进制数据表示,则如下表所示:
字母 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
二进制字符 | 000 | 001 | 010 | 011 | 100 | 101 |
则可以对比一下将文字内容“BADCADFEED”编码后的结果串:
- 原编码二进制串 :001000011010000011101100100011(共 30 个字符)
- 哈夫曼编码二进制串:1001010010101001000111100(共25个字符)
若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称作前缀编码。