哈夫曼树的总结

来源:互联网 发布:js数组去重复的方法 编辑:程序博客网 时间:2024/05/22 00:38


查看原文:http://www.wyblog.cn/2016/11/16/%e5%93%88%e5%a4%ab%e6%9b%bc%e6%a0%91%e7%9a%84%e6%80%bb%e7%bb%93/

百科的定义:

给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

根据以上可以知道,这个权值是起到了关键的作用,权值分布不同,构造出的最优二叉树也是不同的。带权路径长度就是指的所有叶节点的权值乘以路径长度的总和。当不考虑权值,或者说所有节点权值都一样的时候,我们任意构造二叉树,概率上来说其路径之和都是一样的。当权值不同,我们就考虑,让权值大的(也就是发生概率越大的)越靠近根节点,能够更快地被检测到,权值小的放地越远离根节点,因为它被访问的概率越小。举一个例子,比如有一个成绩单:null如果不考虑第二行比例,那么我们构造一个二叉判定树就可以是:如果考虑第二行比例,即权值,二叉树就可以是:可以看到,因为70~79分段人数最多,80到89分段其次,所以可以以80为根节点,迅速判断是否在70~79或者80~89分段内,这样会依概率减少总的比较次数。可见,哈夫曼树可以提高效率。

接下来的问题是,如何构造哈夫曼树?

一般可以按下面步骤构建:1.将所有节点按权值大小从大到小进行排列,每个节点都可以当做一棵树,则组成了一个单节点森林。2.在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,新树根节点的权值为其左右子树上节点的权值之和。为了使其为二叉查找树,应该令权值小的作为左儿子,权值大的作为右儿子。这里有种特殊情况,即新树的根的权值比较大,大于了其他节点的权值,那么我们取得两颗权值最小的树中可能就不含有这棵新生成的树。这对结果是没有影响的,最终会生成一棵完整的哈夫曼树。3.从森林中删除这两棵树,同时把新树加入到森林中。4.重复2,3步骤,直到最后森林中只剩一棵树即哈夫曼树。下面是构建哈夫曼树的图解过程:

哈夫曼编码

在对报文进行编码时,可以使每个字符都有固定长度、固定结构进行编码,然而这并不是最有效的编码方式。哈夫曼树可以用来对报文进行编码操作。如果能统计出来报文里每个字符出现的概率大小,那么如若使出现概率大的字符编码长度小一点,概率小的字符相对来说编码长度大一点,那么我们就达到了压缩报文,节约空间的目的。具体来说,哈夫曼编码的过程就是,先按字符的权值大小,构造一棵哈夫曼树,然后在树中,每个节点的左儿子路径表示为“0”,右路径表示为“1”,则从根节点到每个叶子节点的路径编码,即可表示为相应字符的哈夫曼编码。就拿上图例子来说:A,B,C,D对应的哈夫曼编码分别为:111,10,110,0。用图说明则为:

参考资料:

http://www.cnblogs.com/mcgrady/p/3329825.html http://blog.csdn.net/shuangde800/article/details/7341289



查看原文:http://www.wyblog.cn/2016/11/16/%e5%93%88%e5%a4%ab%e6%9b%bc%e6%a0%91%e7%9a%84%e6%80%bb%e7%bb%93/
0 0
原创粉丝点击