哈夫曼树定义
哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树。所谓带权路径长度是指树中所有的叶子结点的权值乘以其到根结点的路径长度(边数)。哈夫曼树广泛应用于数据压缩等领域,特别是在构建最优前缀码(如哈夫曼编码)时非常有效。
如何构造哈夫曼树
构造哈夫曼树的基本步骤如下:
- 将所有节点按权值排序,并视为一个森林(每个节点是一棵树)。
- 选出两个根节点权值最小的树合并,新的树的根节点权值为这两个根节点权值之和。
- 将新树重新放入森林,再次排序。
- 重复步骤2和3,直到森林中只剩下一棵树,这棵树即为哈夫曼树。
示例:构造哈夫曼树
题目一:给定的权值:3, 7, 8, 2, 6, 10, 14。我们将以这些权值构造哈夫曼树。并计算带权路径长度。
步骤:
- 初始排序:2, 3, 6, 7, 8, 10, 14
- 合并最小两个:(2, 3) -> 5,新序列:5, 6, 7, 8, 10, 14
- 合并最小两个:(5, 6) -> 11,新序列:7, 8, 10, 11, 14
- 合并最小两个:(7, 8) -> 15,新序列:10, 11, 14, 15
- 合并最小两个:(10, 11) -> 21,新序列:14, 15, 21
- 合并最小两个:(14, 15) -> 29,新序列:21, 29
- 合并最后两个:(21, 29) -> 50,完成构造
在哈夫曼树中,当两个节点合并时,通常较小的节点会放置在左侧,而较大的节点会放置在右侧。这是为了确保树的最终结构能够反映出频率的递增顺序,从而使得较低频率的字符具有较长的编码,而较高频率的字符具有较短的编码。
最终哈夫曼树结构:
计算带权路径长度 (WPL)
带权路径长度(WPL)是所有叶子节点的权值乘以其到根节点的路径长度之和。
- 2 * 4 = 8
- 3 * 4 = 12
- 6 * 3 = 18
- 7 * 3 = 21
- 8 * 3 = 24
- 10 * 2 = 20
- 14 * 2 = 28
WPL = 8 + 12 + 18 + 21 + 24 + 20 + 28 = 131
题目二:给定字母 a,b,c,d,e 的使用频率为 0.09,0.17,0.2,0.23,0.31。设计以该权值为基础的哈夫曼树,并给出哈夫曼编码?平均长度是多少?
步骤
- 初始排序:a (0.09), b (0.17), c (0.20), d (0.23), e (0.31)
- 合并最小两个:(a: 0.09, b: 0.17) -> ab: 0.26,新序列:c (0.20), d (0.23), ab (0.26), e (0.31)
- 合并最小两个:(c: 0.20, d: 0.23) -> cd: 0.43,新序列:ab (0.26), e (0.31), cd (0.43)
- 合并最小两个:(ab: 0.26, e: 0.31) -> abe: 0.57,新序列:cd (0.43), abe (0.57)
- 合并最后两个:(cd: 0.43, abe: 0.57) -> abcde: 1.00哈夫曼树结构
哈夫曼编码:(编码的规则通常是:向左走记录为 "0",向右走记录为 "1"。这样,每个字母的编码可以通过追踪从根节点到该字母节点的路径来确定)
c: 从根节点到c的路径是左左,编码是 00.
d: 从根节点到d的路径是左右,编码是 01.
a: 从根节点到a的路径是右左左,编码是 100.
b: 从根节点到b的路径是右左右,编码是 101.
e: 从根节点到e的路径是右右,编码是 11.
这些编码反映了每个字符的相对频率:较低频率的字符(如a和b)具有较长的编码,而较高频率的字符(如e)具有较短的编码。这种编码方法确保了总体编码长度尽可能短,从而实现有效的数据压缩。