霍夫曼树和霍夫曼编码

来源:互联网 发布:合金装备5原爆点优化 编辑:程序博客网 时间:2024/06/05 22:42

霍夫曼编码是最基本的压缩编码方法。

1.霍夫曼树

介绍霍夫曼树首先清楚几个概念:路径长度、带权路径长度。

路径长度:从树中一个节点到另一个节点之间的分支结构构成两个节点之间的路径,路径上分支数目称作路径长度。树的路径长度就是从树根到每一结点的路径长度之和。



二叉树a的路径长度为1+1+2+2+3+3+4+4=20,b的路径长度为1+2+3+3+2+1+2+2=16。如果考虑带权的节点,节点的带权路径长度为从该结点到树根之间的路径长度与结点权值的乘积。树的带权路径长度为树中所有叶子节点到树根之间的路径长度之和。带权路径长度WPL(Weighted Path Length of Tree)最小的二叉树称为霍夫曼树。

二叉树a的WPL=5*1+15*2+40*3+30*4+10*4=315

二叉树b的WPL=5*3+15*3+(40+30+10)*2=220

霍夫曼树的构造:

1)先把有权值的叶子节点按照从小到大的顺序排成一个有序序列,即A5,E10,B15,D30,C40

2)取头两个最小权值的节点作为一个新结点N1的两个子节点,相对小的为左孩子A,大的为右孩子E。新结点的权值为两个叶子的权值和15。

3)将N1替换A和E,插入到有序序列中,重新排序,即:N1 15,B15,D30,C40。

3)重复步骤2、3,直到结束。



此时,二叉树的带权路径长度WPL=40*1+30*2+15*3+(5+10)*4=205

2.霍夫曼编码

构造出霍夫曼树之后,霍夫曼编码就非常简单了。将霍夫曼树的左右权值分别改为0和1,就可以得到每个字符的霍夫曼编码。


A的编码为:1000
B的编码为:101
C的编码为:0
D的编码为:11
E的编码为:1001
编码中非0即1,长短不等的话很容易混淆,所以若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符编码的前缀,这种编码称为前缀编码。霍夫曼即是一种前缀编码。
0 0