C++自学第四课(哈夫曼树)
2026-09-17 22:13:37
发布于:湖南
哈夫曼树()是数据压缩领域的经典结构,核心思想是让出现频率高的字符用短编码,频率低的用长编码,从而实现整体编码长度最短。下面从直觉到构造一步步讲清楚。
一、核心思想:贪心算法
假设要压缩一段文本,其中:
a 出现 45 次
b 出现 13 次
c 出现 12 次
d 出现 16 次
e 出现 9 次
f 出现 5 次
如果定长编码(如),每个字符至少位(因为种字符)。但哈夫曼的思路是:出现次数多的用位,出现少的用位,总长度就能大幅缩短。
二、构造步骤(手算演示)
规则:每次选频率最小的两棵树合并,新树频率为两者之和,重复直到只剩一棵树。
初始森林(每棵树只有一个节点):
a:45 b:13 c:12 d:16 e:9 f:5
第 1 步:选最小的和合并
14
/ \
f:5 e:9
剩余:a:45 b:13 c:12 d:16 新树:14
第 2 步:选最小的和合并
25
/ \
c:12 b:13
剩余:a:45 d:16 树1:14 树2:25
第 3 步:选最小的和合并
30
/ \
d:16 14
/ \
f:5 e:9
剩余:a:45 树2:25 树3:30
第 4 步:选最小的和合并
55
/ \
25 30
/ \ / \
c:12 b:13 d:16 14
/ \
f:5 e:9
剩余:a:45 树4:55
第 5 步:合并最后的和
100
/ \
a:45 55
/ \
25 30
/ \ / \
c:12 b:13 d:16 14
/ \
f:5 e:9
三、生成编码
从根节点出发,左分支标 0,右分支标 1(或相反,只要一致即可):

长度:45 + 36 + 39 + 48 + 20 + 36 = 224 位
对比定长编码(3 位 × 100 = 300 位),压缩率约 25%。
四、关键性质
1.
前缀码特性:任何字符的编码都不是另一个字符编码的前缀(因为都在叶子节点),解码时不会有歧义。例如收到,只能解析为,不会误认为是开头的其他组合。
2.
最优性:哈夫曼算法是贪心算法,每次合并最小频率,数学上可证明这样得到的树是带权路径长度()最小的二叉树。
3.
不唯一性:如果合并时左右子树交换,或遇到相等频率时选择不同,可能得到不同的树,但相同,都是最优解。
五.局限
需要提前统计频率(两遍扫描:先统计,再编码),对实时流数据不够友好
需要存储编码表(或树结构),小文件可能"越压越大"
对已经压缩过的数据(如视频、图片)效果差,因为信息熵已接近极限
哈夫曼树就是用贪心策略把高频字符放在离根近的地方,低频字符放在离根远的地方,从而让整个编码系统的平均长度最短。
求关注!
这里空空如也



















有帮助,赞一个