霍夫曼编码

哈夫曼树(Huffman Tree)


路径:若一棵树中存在一个结点序列k1,k2,…,kj,使得ki是ki+1的双亲(1≤i<j),则称此结点序列是从k1到kj 的路径。

路径长度(Path Length):两个结点之间的路径长度 PL是连接两结点的路径上的分支数。树的路径长度是各叶结点到根结点的路径长度之和。

带权路径长度(Weighted Path Length, WPL)

树的带权路径长度是树的各叶结点所带的权值与该结点到根的路径长度的乘积的和。


霍夫曼树(最优二叉树)


带权路径长度达到最小的二叉树即为霍夫曼树。在霍夫曼树中,权值大的结点离根最近。


霍夫曼算法


(1)由给定的n个权值 {w0, w1, w2, …, wn-1},构造具有 n棵二叉树的森林 F = { T0, T1, T2, …, Tn-1},其中每棵二叉树 Ti 只有一 个带权值 wi 的根结点, 其左、右子树均为空。

(2)重复以下步骤, 直到 F中仅剩下一棵树为止:

①在F 中选取两棵根结点的权值最小的二叉树,做为左、右子树构造一棵新的二叉树。置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。

② 在F中删去这两棵二叉树。

③ 把新的二叉树加入F。


霍夫曼编码 主要用途是实现数据压缩。

设给出一段报文:CASTCASTSATATATASA

字符集合是 { C, A, S, T },各个字符出现的频度(次数)是 W={ 2, 7, 4, 5 }。

若给每个字符以等长编码A : 00T : 10C : 01S : 11

则总编码长度为( 2+7+4+5 ) * 2 = 36

若按各个字符出现的概率不同而给予不等长编码,可望减少总编码长度。

各字符出现概率为{ 2/18, 7/18, 4/18, 5/18},化整为{ 2, 7, 4, 5 }.

以它们为各叶结点上的权值, 建立霍夫曼树。左分支赋0,右分支赋1,得霍夫曼编码(变长编码)。A : 0T : 10C : 110S : 111

它的总编码长度:7*1+5*2+( 2+4 )*3 = 35。比等长编码的情形要短。

总编码长度正好等于霍夫曼树的带权路径长度WPL。霍夫曼编码是一种无前缀编码。解码时不会混淆。


你可能感兴趣的:(霍夫曼编码)