哈夫曼树的总结
来源:互联网 发布: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)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
根据以上可以知道,这个权值是起到了关键的作用,权值分布不同,构造出的最优二叉树也是不同的。带权路径长度就是指的所有叶节点的权值乘以路径长度的总和。当不考虑权值,或者说所有节点权值都一样的时候,我们任意构造二叉树,概率上来说其路径之和都是一样的。当权值不同,我们就考虑,让权值大的(也就是发生概率越大的)越靠近根节点,能够更快地被检测到,权值小的放地越远离根节点,因为它被访问的概率越小。举一个例子,比如有一个成绩单:如果不考虑第二行比例,那么我们构造一个二叉判定树就可以是:如果考虑第二行比例,即权值,二叉树就可以是:可以看到,因为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/
- 哈夫曼树的总结
- 总结(算不上总结的总结)
- [总结】半年的总结
- 总结的
- 【总结】:本科毕业的简单总结
- 开发总结:Android反编译方法的总结
- [总结]对JFace的一点总结
- [总结]对JFace的一点总结
- 刘徐阳总结的一些编程总结
- 总结的常用时间函数总结
- 排序总结(总结的非常好)
- Java学习- 他人的 总结 printf总结
- 测试工作经验总结3:简短的总结?
- 关于实习:不是总结的总结
- 非常好的动态规划总结,DP总结
- 总结:数据清洗的一些总结
- 我的应聘总结!
- 一年工作的总结
- 【NOIP2015】信息传递 dfs
- Android开发之TextView垂直显示List列表数据
- 神经网络:Residual Network
- php单双引号对变量解析的影响以及php向mysql插入数据时的变量解析问题详解
- ReactNative 广播机制
- 哈夫曼树的总结
- Could not expand ZIP错误
- 两行代码实现 读取手机联系人
- -ldl 选项作用
- 蓝桥杯练习:入门训练 Fibonacci数列
- mathtype输入latex数学公式
- 编程能力提高-----rand和srand的用法
- bash特性之基础
- BZOJ 3687 简单题【dp,bitset基础应用