哈夫曼树的定义
我们给树的结点赋予一个表示某种意义的值,称为该结点的权;
我们再定义从根结点到某个结点需要经过的边数,与该结点的权的乘积,称为结点的带权路径长度;
所有叶子结点的带权路径长度之和,称为树的带权路径长度,记为WPL。
下面,先来直观感受一下WPL的含义:
(a) WPL = 7×2 + 5×2 + 2×2 + 4×2 = 36
(b) WPL = 4×2 + 7×3 + 5×3 + 2×1 = 46
(c) WPL = 7×1 + 5×2 + 2×3 + 4×3 = 35
好了,下面给出哈夫曼树的定义:
在含有n个带权叶子结点的所有二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树。
哈夫曼树的构造
给定n个带有权值的结点,构造哈夫曼树的算法描述如下:
选出权值最小的两个结点,构造成一个新的结点,且新结点的权值看作两个结点的权值之和;不断重复这个过程。
由此构造出的哈夫曼树有如下特点:
1)每个结点最终都会称为叶子结点,权值越小的叶子越靠下,权值越大的叶子越靠上;
2)构造过程是个两两结合的过程,因此共新建了 n-1 个结点,最终哈夫曼树的总结点数为 2n-1 ;
3)构造过程是个两两结合的过程,因此不会出现度为 1 的结点;
4)构造出的哈夫曼树是不唯一的,但是最小带权路径长度(WPL)是最小且唯一的。
看看图解,一下就会!!!以 {3,5,6,9,12}
为例:
哈夫曼编码
在数据通信中,对字符的编码可以是长度固定的,也可以是长度不等的。可变长度编码有个极大的好处,就是可以使得字符的平均编码长度减短,起到数据压缩的效果。
想要对不同的字符使用不同长度的编码的前提是,一个编码不能是另一个编码的前缀。这不难理解,假设合法编码有“110”、“11”、“0”,那么在翻译“1100”时,分割结果是不唯一的。
哈夫曼树有一个优秀的性质,即权值越小的叶子越靠下,权值越大的叶子越靠上。那么,如果我们把叶子结点权值设置为字符出现的频度,比给边标记上0/1,将从根结点到叶子经过的边的所有标记序列作为编码的话——频度越高的字符编码越短,频度越低的字符编码越长,并且不会出现一个编码是另一个编码的前缀的情况!
还是看个栗子吧 >_<!!!