哈夫曼编码加权平均长度计算示例
假设有一个字符集及其出现概率如下:
字符 | 概率 |
---|---|
A | 0.4 |
B | 0.3 |
C | 0.2 |
D | 0.1 |
步骤1:构建哈夫曼树
1. 排序:按概率从小到大排序 → D(0.1), C(0.2), B(0.3), A(0.4)
2. 合并最小概率的两个节点:
合并 D(0.1) 和 C(0.2) → 新节点 P1(0.3)
现在队列:B(0.3), P1(0.3), A(0.4)
3. 继续合并:
合并 B(0.3) 和 P1(0.3) → 新节点 P2(0.6)
现在队列:A(0.4), P2(0.6)
4. 最后合并:
合并 A(0.4) 和 P2(0.6) → 根节点(概率1.0)
步骤2:分配编码
左分支 = 0,右分支 = 1(或相反,不影响最终平均长度):
A(0.4) → `0`(长度1)
B(0.3) → `10`(长度2)
C(0.2) → `110`(长度3)
D(0.1) → `111`(长度3)
步骤3:计算加权平均长度
验证最优性
香农熵(理论最小平均长度):
比较:哈夫曼编码的 L=1.9接近熵 H≈1.846,且满足H≤L<H+1。
另一个例子(固定长度 vs 哈夫曼编码)
假设字符集:A(0.7), B(0.2), C(0.1)
固定长度编码(2比特/符号)
编码:A=`00`, B=`01`, C=`10`
平均长度:2×0.7+2×0.2+2×0.1=2 比特/符号
哈夫曼编码
1. 合并 C(0.1) 和 B(0.2) → P1(0.3)
2. 合并 P1(0.3) 和 A(0.7) → 根节点(1.0)
3. 编码:
A(0.7) → `0`(长度1)
B(0.2) → `10`(长度2)
C(0.1) → `11`(长度2)
4. 平均长度:
L=(0.7×1)+(0.2×2)+(0.1×2)=0.7+0.4+0.2=1.3 比特/符号
压缩率提升:相比固定长度(2比特),哈夫曼编码(1.3比特)节省了35%空间!
总结
哈夫曼编码通过动态分配短码给高频字符,最小化加权平均长度。
计算步骤:
1. 按概率升序排序;
2. 反复合并最小概率的节点,构建哈夫曼树;
3. 分配编码(左0右1或反之);
4. 计算 。
哈夫曼树 WPL(带权路径长度)计算示例
WPL(Weighted Path Length,带权路径长度)是哈夫曼树的一个重要指标,表示所有叶子节点的权值 × 路径长度之和。它直接影响哈夫曼编码的加权平均长度。
计算公式
其中:
权值:通常是字符的频率或概率;
路径长度:从根节点到该叶子节点的边数(即编码位数)。
示例1:计算给定哈夫曼树的 WPL
假设已经构建好如下哈夫曼树(数字代表权值):
(100)
/ \
(40) (60)
/ \
(25) (35)
叶子节点:
左子树:40(路径长度=1)
右子树的左:25(路径长度=2)
右子树的右:35(路径长度=2)
计算 WPL:
示例2:从字符频率构建哈夫曼树并计算 WPL
给定字符频率:
字符 | 频率 |
---|---|
A | 5 |
B | 9 |
C | 12 |
D | 13 |
E | 16 |
F | 45 |
步骤1:构建哈夫曼树
1. 按频率升序排列:A(5), B(9), C(12), D(13), E(16), F(45)。
2. 每次合并最小的两个节点:
合并 A(5) + B(9) → P1(14)
合并 C(12) + D(13) → P2(25)
合并 P1(14) + E(16) → P3(30)
合并 P2(25) + P3(30) → P4(55)
合并 F(45) + P4(55) → 根节点(100)
最终哈夫曼树结构:
(100)
/ \
F(45) (55)
/ \
(25) (30)
/ \ / \
C(12) D(13) P1(14) E(16)
/ \
A(5) B(9)
步骤2:计算 WPL
F(45):路径长度=1 → 45×1=45
C(12):路径长度=3 → 12×3=36
D(13):路径长度=3 → 13×3=39
A(5):路径长度=4 → 5×4=20
B(9):路径长度=4 → 9×4=36
E(16):路径长度=3 → 16×3=48
示例3:验证 WPL 与哈夫曼编码的关系
对上述字符集进行哈夫曼编码:
F(45):`0`(长度1)
C(12):`100`(长度3)
D(13):`101`(长度3)
A(5):`1100`(长度4)
B(9):`1101`(长度4)
E(16):`111`(长度3)
计算加权平均编码长度:
结论:WPL(224)除以总频率(100)即为加权平均长度(2.24),两者直接相关。
关键点总结
1. WPL 是哈夫曼树的带权路径长度,等于所有叶子节点的(权值×路径长度)之和。
2. 哈夫曼编码的加权平均长度 = WPL / 总频率。
3. 构建哈夫曼树时,每次合并权值最小的两个节点,确保 WPL 最小。