赫夫曼树与赫夫曼编码

来源:互联网 发布:javascript表单提交 编辑:程序博客网 时间:2024/05/16 10:25

赫夫曼树又称为最优二叉树。带权路径长度WPL最小的二叉树称为最优二叉树。从树根结点到该结点之间的路径长度与该结点上权的乘积称为结点的带权路径长度,树中所有叶子结点的带权路径长度之和称为该树的带权路径长度(WPL),通常记为:


赫夫曼(Huffman)树的特征

当叶子上的权值均相同时,完全二叉树一定是最优二叉树。否则完全二叉树不一定是最优二叉树。

② 在最优二叉树中,权值越大的叶子离根越近;反之,权值越小的结点,其到根结点的路径越长。

③ 最优二叉树的形态不唯一,但WPL最小。 

如何构造赫夫曼树?

(1)以权值分别为W1,W2...Wn的n个结点,构成n棵二叉树T1,T2,...Tn并组成森林F={T1,T2,...Tn},其中每棵二叉树 Ti仅有一个权值为 Wi的根结点;

(2)在F中选取两棵根结点权值最小的树作为左右子树构造一棵新二叉树,并且置新二叉树根结点权值为左右子树上根结点的权值之和(根结点的权值=左右孩子权值之和,叶结点的权值= Wi);

(3)从F中删除这两棵二叉树,同时将新二叉树加入到F中;

(4)重复(2)、(3)直到F中只含一棵二叉树为止,这棵二叉树就是Huffman树。


在电文编码,图片压缩编码等算法中,希望编码总长尽可能短。如果对每个字符设计长度不等的编码,且让电文中出现次数较多的字符采用尽可能短的编码,则总编码长度便可减少。如果设计A、B、C、D的编码分别为0、00、1、01,则电文‘ABACCDA’的电文可以转换为总长为9的字符串‘0000011010’,但是,这样的电文无法翻译,利用传送过去的字符串中前4个字符的字串‘0000’就有多种译法,或是‘AAAA’,或‘ABA’,也可以是‘BB’等。因此,若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称为前缀编码

可以利用二叉树来设计二进制的前缀编码。如下图。

如何得到使电文长度最短的二进制前缀编码呢?设计电文长度最短的二进制前缀编码即为以n种字符出现的频率作权,设计一棵赫夫曼树的问题,由此得到的二进制前缀编码便称为赫夫曼编码。

构造赫夫曼树和赫夫曼编码的C语言描述:


1 0