哈夫曼树与哈夫曼编码
什么是哈夫曼树(Huffman Tree)
- [例]将百分制的考试成绩转换为五分制的成绩
if (score<60) grade=1;
else if (score<70) grade=2;
else if (score<80) grade=3;
else if (score<90) grade=4;
else grade=5;
判定树:
- score<60需要做一次判断
- score>90需要做四次判断
- 若大多数情况score>90,少部分甚至没有score<60,这样的判定树显然不够优化
如果考虑学生成绩的分布概率
分数段 | 0-59 | 60-69 | 70-79 | 80-89 | 90-100 |
---|---|---|---|---|---|
比例 | 0.05 | 0.15 | 0.40 | 0.30 | 0.10 |
- 查找效率=0.05*1+0.15*2+0.4*3+0.3*4+0.1*4=3.15
修改判定树
if (score<80)
{
if (score<70)
if (score<60) grade=1;
else grade=2;
else grade=3;
}
else if (score<90) grade=4;
else grade=5;
- 查找效率=0.4*2+0.3*2+0.15*3+0.05*3+0.10*2=2.2
如何根据结点不同的查找效率构造更有效的搜索树?
哈夫曼树的定义
- 带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值Wk,从根节点到每个叶子结点的长度为Lk,则每个叶子结点的带权路径长度之和就是:WPL=sum(WkLk) , 1<=k<=n
- 最优二叉树或哈夫曼树:WPL最小的二叉树
[例]有五个叶子结点,它们的权值为{1,2,3,4,5},用此权值序列可以构造出形状不同的多个二叉树。