一、背景知识
- 节点的权:有某种现实含义的数值(如表示结点的重要性)
- 结点的带权路径长度:从根到该结点的路径长度与该结点上的权值相乘
- 树的带权路径长度:树的所有叶结点的带权路径长度之和(Weighted Path Length,WPL)
二、哈夫曼树
1、定义:
在含有n个带权叶结点的二叉树中,WPL最小的二叉树,也称最优二叉树
2、构造:
(1)将n个结点看作n棵只含有一个结点的二叉树,构成森林F
(2)构造一个新结点,从F中选择二棵根节点权值最小的树作为其左右子树,并将新结点的权值置为二者权值之和
(3)将新得到的树加入F中,并删除原来选择的两棵树
(4)重复步骤(2)和(3),直至F中只剩下一棵树
3、性质:
(1)每个初始结点都会变成叶结点,且权值越小离根节点越远
(2)结点总数为2n-1
(3)不存在度为1的结点
(4)构造并不唯一,但WPL必然相同且最优
4、哈夫曼编码:
情景设置:考场上,小渣想找老八要数学选择题的答案假设100题中有80题选C,10题选A,8题选B,2题选D,那么老八如何传递答案才能效率最高呢?(温馨提示:诚信考试,不要向主人公学习哦)
- 固定长度编码:每个字符用相等长度的二进制位表示
如:A为00,B为01,C为10,D为11,则WPL=100*2=200 - 可变长度编码:允许用不等长的二进制位表示不同字符
如:C=0,A为10,B为111,D为110(没错,之所以这样假设,是为了使WPL最小),WPL=80x1+10x2+8x3+2x3=130
Os:这个你可能会问了,那我将A改为1,WPL不是更小吗?
确实,因此我们要引出下一个概念
- 前缀编码:指的是没有一个编码是其他编码的前缀
如果将A改为1,那么CAAABD:0111111110,毫无疑问,这个非前缀编码是有歧义的
此时我们可以利用之前的方法,将字符集的每个字符作为一个叶结点,出现频率作为结点的权值,构造哈夫曼树
Ps:哈夫曼树不唯一,所以哈夫曼编码也不唯一。对了,哈夫曼编码可用于数据压缩,非常
三、总结:
这是我们第一次体会到算法在实际场景中的应用,让我们真切地感受到算法的学习不是枯燥无味,它给计算机的发展提供了巨大的帮助,它的背后蕴含着无穷的能量,期待着我们去学习、去热爱、去探索、去创造。