哈夫曼树和哈夫曼编码

来源:互联网 发布:怎么在u盘中装ubuntu 编辑:程序博客网 时间:2024/06/09 22:58

原文参照:http://blog.csdn.net/bruce_6/article/details/38656413

1.基本概念

节点之间的路径长度:在树中从一个结点到另一个结点所经历的分支,构成了这两个结点间的路径上的经过的分支数称为它的路径长度

树的路径长度:从树的根节点到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。
结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。
结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。
树的带权路径长度(Weighted Path Length of Tree:WPL):定义为树中所有叶子结点的带权路径长度之和

最优二叉树是带权路径长度最短的二叉树
WPL=7*1+5*2+2*3+4*3=35

2.构造哈夫曼树的思路
1)给定n个权值分别为{w1,w2,w3,……}的二叉树{T1,T2,T3,……},其中每棵二叉树只有一个权值为wi 的根节点,其左右子树都为空;
2)从森林中取出两棵根节点的权值最小的二叉树,作为一棵新的二叉树的左右子树,且令新的二叉树的根节点的权值为其左右子树的权值和;
3)从F中删除被选中的那两棵子树,并且把构成的新的二叉树加到F森林中
4)重复2 ,3 操作,直到森林只含有一棵二叉树为止,此时得到的这棵二叉树就是哈夫曼树


3.哈夫曼编码
对一串报文abcdabcaba”进行编码,可以先统计出a、b、c、d4个字符,出现次数分别为4、3、2、1
将a、b、c、d以出现次数为权值构造哈夫曼树
从哈夫曼树根节点开始,对左子树分配代码“0”,对右子树分配“1”,一直到达叶子节点。
如图:
a、b、c、d的编码分别为0、10、110、111
报文“abcdabcaba”转换为对应的二进制码就是0101101110101100100,这就是哈夫曼编码

0 0
原创粉丝点击