赫夫曼树和赫夫曼编码

来源:互联网 发布:mac dock透明 编辑:程序博客网 时间:2024/05/17 04:23

赫夫曼树:

1、先把有权值的叶子节点按照从小到大的顺序排成一个有序序列,即:A(5),E(10),B(15),D(30),C(40)。

2、取前两个权值最小的结点即A(5)和E(10),作为一个新的结点N1的两个子节点,结点权值较小的作为左结点,即A为左结点,E为右结点,N1的权值为两个结点权值的和,即5+10=15。

3、将N1替换A和E,放到原序列里,重新排序,即:N1(15),B(15),D(30),C(40)。重复步骤2,取出N1(15),B(15),组成新的结点N2,N2权值为30。

4、将N2替换N1和B插入到序列里,即N2(30),D(30),C(40),重复步骤2,取出N2(30),D(30),组成新的结点N3,N3权值为60。

5、剩下N3(60)和C(40),将他俩组成新的结点T,C为左结点,N3为右结点。生成赫夫曼树如下图所示:

 

 

赫夫曼编码:

假设6个字母频率为A  27,B  8,C  15,D  15,E  30,F  5,合起来正好是100%,将他们排成赫夫曼树如下所示:

将权值左分支改为0,右分支改为1,如下图所示:

此时,我们对六个字母用其从跟到叶子结点所经过的路径的0和1来编码,可以得到如下:

A:01

B:1001

C:101

D:00

E:11

F:1000

双方约定好赫夫曼树后,也可以根据赫夫曼编码来解码,等到源码。