与赫夫曼树的一些概念
赫夫曼树又叫作最优二叉树,它的特点是带权路径最短。
首先需要说明几个关于路径的概念:
- 1)路径:路径是指从树中一 个结点到另一个结点的分支所构成的路线。
- 2)路径长度:路径长度是指路径上的分支数目。
- 3)树的路径长度:树的路径长度是指从根到每个结点的路径长度之和。
- 4)带权路径长度:结点具有权值,从该结点到根之间的路径长度乘以结点的权值,就是该结点的带权路径长度。
- 5)树的带权路径长度(WPL):树的带权路径长度是指树种所有叶子结点的带权路径长度之和。
赫夫曼树的构造方法
给定n个权值,用这n个权值来构造赫夫曼树的算法描述如下:
- 1)将这n个权值分别看作只有根结点的n棵二叉树,这些二叉树构成的集合记为F。
- 2)从F中选出两棵根结点的权值最小的树(假设为a、b)作为左、右子树,构造一棵新的二叉树(假设为c),新的二叉树的根结点的权值为左、右子树根结点权值之和。
- 3)从F中删除a、b,加入新构造的树C.
- 4)重复进行2)、3)两步,直到F中只剩下一棵树为止,这棵树就是赫夫曼树。
图解(图中结点下面的数字代表该结点的权值):
赫夫曼树的特点
- 1)权值越大的结点,距离根结点越近。
- 2)树中没有度为1的结点。这类树又叫作正则(严格)二叉树。
- 3)树的带权路径长度最短。
赫夫曼编码
赫夫曼编码是对赫夫曼树的一种应用,赫夫曼编码用在文件压缩等方面。
下面用一个例子说明赫夫曼编码是如何对文件进行压缩的。如有一串字符“S=AAABBACCCDEEA”,自己选三位长度的二进制为各个字符进行编码,设置的编码规则如下:
A | B | C | D | E |
000 | 001 | 010 | 011 | 100 |
根据上面的表可以将S串编码为:
T(S)=000000000001001000010010010011100100000
并将其存储在计算机种,用的时候按照上表进行解码得到S串。
上面的T(S)的长度为39,想办法将这个编码串变短些,就可以使用赫夫曼编码的方法来解决。
首先统计各个字符在字符串中的出现次数,如下表:
A | B | C | D | E |
5次 | 2次 | 3次 | 1次 | 2次 |
以字符为根节点,以对应的出现次数为权值,构造一棵赫夫曼树,如下图:
则对A-E的赫夫曼编码规则如下表:
A | B | C | D | E |
0 | 110 | 10 | 1110 | 1111 |
则串S的编码为:H(S)=00011011001010101110111111110。
上述由赫夫曼树导出每个字符的编码,进而得到对整个字符串的编码的过程称为赫夫曼编码。
H(S)串长度为29,比T(S)串短多了,会节约空间。
赫夫曼n叉树
赫夫曼二叉树是赫夫曼n叉树的一种特例, 对于结点数目大于等于2的待处理序列,都可以构造赫夫曼二叉树,但却不一定能构造赫夫曼n叉树。当发现无法构造时,需要补上权值为0的结点让整个序列凑成可以构造赫夫曼n叉树的序列。
如序列A(1)、B(3)、 C(4)、 D(6) (括号内为 权值),就不能直接构造赫夫曼三叉树,需要补上一 个权值为0的结点。此时新结点序列为: H(0)、 A(1)、 B(3)、C(4)、 D(6),这样就可以类比赫夫曼二叉树的构造方法,每次挑选权值最小的三个结点构造一棵三叉树, 以此类推,直到所有结点都被并入树中。
图解: