第38课 - 霍夫曼树
1. 最初的解决方案
对于文本“BADCADFEED”的传输而言,因为重复出现的只有“ABCDEF”这六个字符,因此可以用下面的方式编码:
A |
B |
C |
D |
E |
F |
000 |
001 |
010 |
011 |
100 |
101 |
接收方可以根据每3个bit进行一次字符解码的方式还原文本信息。
2. 存在的问题
这样的编码需要30个bit才能表示10个字符。容易出错。
3. 改进
避免每个字符都占用相同的bit位。
A |
B |
C |
D |
E |
F |
01 |
1001 |
101 |
00 |
11 |
1000 |
25个bit就能表示10个字符,效率提高17%。
4. 霍夫曼树
(1) 给定n个数值{v1, v2, ...vn}
(2) 根据这n个数值构造二叉树集合F,F = {T1, T2, ..,Tn},Ti得到数据域vi,左右子树为空。
(3) 在F中选取两颗树根节点的最小的数作为左右子树构造一棵新的二叉树,这棵二叉树的根节点中的值为左右子树根节点中的值的和。
(4) 在F中删除这两棵子树,并将构造的新的二叉树加入F中。
(5) 重复3和4,直到F中只剩下一个树为止。这棵树就是霍夫曼树。
5. 霍夫曼树的应用
假设经过统计ABCDEF在需要传输的保温中出现的概率如下:
A |
B |
C |
D |
E |
F |
27% |
8% |
15% |
15% |
30% |
5% |
根据这些数值构造的霍夫曼树如下:
该霍夫曼树叶结点在树中的位置编码如下:
A:01
B:1001
C:101
D:00
E:11
F:1000
小结:
霍夫曼树是一种特殊的二叉树。
霍夫曼树应用于信息编码和数据压缩领域。
霍夫曼树是现代压缩算法的基础。