标签:数据结构
第二步:取头两个最小权值的结点作为一个新结点N1的两个孩子,相对较小的是左孩子。新结点的权值为两个叶子权值的和。如下图:
第三步:将N1替换A和E,新序列为:N115,B15,D30,C40。
第四步:重复步骤2,将N1与B作为新结点N2的两个孩子,N2的权值为15+15=30。如下图:
第五步:将N2替换N1和B,新序列为:N230,D30,C40。
第六步:重复步骤2。将N2和D作为新结点N3的两个孩子,N3的权值为30+30=60,如下图:
第七步:将N3替换N2和D,新序列为:C40,N360。
第八步:重复步骤2,将C与N3作为新结点T的两个孩子,T是根节点,至此完成赫夫曼树的构造。如下图:
图中的二叉树的WPL = 40*1 + 30*2 + 15*3 + 10*4 + 5*4 = 205。经过上面步骤构造出来的二叉树就是最优的赫夫曼树。
1.定义
假设需要编码的字符集为{d1,d2,...dn},各个字符在电文中出现的次数或频率集合为{w1,w2,...,wn},以d1,d2,...,dn作为叶子结点,以w1,w2,...,wn作为相应叶子结点的权值来构造一棵赫夫曼树。规定:赫夫曼树的左分支代表0,右分支代表1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码,这就是赫夫曼编码。
字母 |
A |
B |
C |
D |
E |
F |
二进制字符 |
000 |
001 |
010 |
011 |
100 |
101 |
编码之后的二进制数据流为“001000011010000011101100100011”,对方接收时同样按照3位一组解码。现在假设这6个字母出现的频率不同,A 27%,B %8,C 15%,D 15%,E 30%,F 5%。下面将27、8、15、15、30、5分别作为A、B、C、D、E、F的权值构造赫夫曼树,如下图:
将该图(图B)中赫夫曼树的权值左分支改为0,右分支改为1,如下图C:
现在将这6个字母用从根节点到叶子所经过路径的0或1来编码,得到的编码表如下:
字母 |
A |
B |
C |
D |
E |
F |
二进制字符 |
01 |
1001 |
101 |
00 |
11 |
1000 |
将“BADCADFEED”再次编码得到“1001010010101001000111100”,共25个字符,与之前编码得到的30个字符相比大约节约了17%的存储和传输成本。
在解码时,用同样的赫夫曼树,即发送方和接收方约定好同样的赫夫曼编码规则。当接收方接收到“1001010010101001000111100”时,比对图C中的赫夫曼树,由1001正好走到字母B,如下图:
然后是01,则从根结点走到字母A,如下图:
其余的字母也可相应成功解码。
标签:数据结构
原文地址:http://blog.csdn.net/u012637501/article/details/44477963