定义和原理
从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径长度。树的路径长度就是从树根到每一结点的路径长度之和。
带权路径长度WPL最小的二叉树称做赫夫曼树。—最优二叉树
构造赫夫曼树的赫夫曼算法描述:
1.根据给定的n个权值{ w1,w2,...,wn }构成n棵二叉树的集合F={ T1,T2,...,Tn },其中每棵二叉树 Ti 中只有一个带权为 wi 根结点,其左右子树均为空。
2.在F中选取两棵根结点的权值最小的树作为做右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上的根结点的权值之和。
3.在F中删除这两棵树,并将新得到的二叉树加入到F中。
4.重复步骤2,3,直到F中只含一棵树为止,这棵树便是赫夫曼树。
赫夫曼编码
赫夫曼研究最优树的目的是为了结局当年远距离通信(主要是电报)的数据传输的最优化问题。
假设六个字母的频率为A 27,B 8,C 15,D 15,E 30,F 5,合起来正好100,也就是说,我们可以重新按照赫夫曼树来规划它们。下图作图为构造赫夫曼树的过程的权值显示,有图为将权值左分支改为0,右分支改为1的赫夫曼树。
所以,这六个字母用其从树根到叶子所经过路径的0或1来编码,可以得到下表的定义:
字母 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
二进制字符 | 01 | 1001 | 101 | 00 | 11 | 1000 |
注:若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码前缀,这种编码称为前缀编码。
在解码时,要用到赫夫曼树,即发送方和接收方需要约定好同样的赫夫曼编码规则。
一般地,设需要编码的字符集为{ d1,d2,..,dn },各个字符在电文中出现的次数或频率集合为{ w1,w2,...,wn },以 d1,d2,...,dn 作为叶子结点,以 w1,w2,...,wn 作为相应叶子结点的权值来构造一棵赫夫曼树。规定赫夫曼树的左分支为0,右分支代表1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码,这就为赫夫曼编码。