概念介绍
-
路径和路径长度
在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。如下图,L为路径长度。 -
结点的权
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权,如下图,W为权值。 -
带权路径长度
从根结点到该结点之间的路径长度与该结点的权的乘积。
A的带权路径长度:L1 X W1 = 15
B的带权路径长度:L2 X W2 = 40
C的带权路径长度:L3 X W3 = 30
-
树的带权路径长度
所有叶子结点的带权路径长度之和,记为WPL。即WPL = L1 X W1 + L2 X W2 + L3 X W3 = 85 -
哈夫曼树
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
如何构造哈夫曼树
- 在初始的一组数中寻找两个最小的数,构成子树,产生新的权值。注意:如果两个数相同,可以自行定义左右存放位置。
- 在新的一组数中再找出两个最小的数,构成子树。
- 依次循环,最终会构成一棵包含全部数的树,且这组数都为叶子节点。
哈夫曼编码
在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。
例如,需传送的报文为“ABBCC CDDD D",A的次数1,B的次数2,C的次数3,D的次数4,要区别4个字母,最简单的二进制编码方式是等长编码,固定采用2位二进制,共可表示4个组合。如,
A:00
B:01
C:10
D:11
当对方接收报文时再按照二位一分进行译码。但如果有8个不同字母,则需要采用3位二进制,有16个不同字母,则需要采用4位二进制。然而,传送报文时总是希望总长度尽可能短。在实际应用中,各个字符的出现频度或使用次数是不相同的,可以在设计编码时,让使用频率高的用短码,使用频率低的用长码,以优化整个报文编码。
如下图,使哈夫曼树节点的左分支标为0,右分支标为1,形成哈夫曼编码如下:
A:110
B:111
C:10
D:0
使用频率高的字母编码长度越短。
下面来分析编码长度:
ABBCC CDDD D
普通编码:00010110101011111111 20位
哈夫曼编 1101111111010100000 19位
哈夫曼编码正好可以看成哈夫曼树的带权路径长度,根据哈夫曼树的性质,所以哈夫曼编码应该是最短的。