第二步:取头两个最小权值的结点作为一个新结点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,例如以下图:
其余的字母也可对应成功解码。