1. 程式人生 > >[資料結構]哈夫曼樹、哈夫曼編碼

[資料結構]哈夫曼樹、哈夫曼編碼

哈夫曼樹又稱最優樹(二叉樹),是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼(Huffman)1952年提出,這種樹在資訊檢索中很有用。

結點之間的路徑長度:從一個結點到另一個結點之間的分支數目。

樹的路徑長度:從樹的根到樹中每一個結點的路徑長度之和。

結點的帶權路徑長度:從該結點到樹根之間的路徑長度與結點上權的乘積。

樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和,記作:

                               

    WPL為最小的二叉樹就稱作最優二叉樹或哈夫曼樹。

    完全二叉樹不一定是最優二叉樹。

    哈夫曼樹的構造

(1)根據給定的n個權值{w1,w2,...,wn}構造n棵二叉樹的集合F={T1,T2,...,Tn},其中Ti中只有一個權值為wi的根結點,左右子樹為空;
(2)在F中選取兩棵根結點的權值為最小的數作為左、右子樹以構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為左、右子樹上根結點的權值之和。
(3)將新的二叉樹加入到F中,刪除原兩棵根結點權值最小的樹;
(4)重複(2)和(3)直到F中只含一棵樹為止,這棵樹就是哈夫曼樹。

例1:

例2:

結點的儲存結構:

構造哈夫曼樹的演算法說明:

#define n                  /* 葉子總數 */
#define  m  2*n-1      /* 結點總數 */
證:由性質3,葉子結點數 n0

=n2+1,故哈夫曼樹結點總數為 n0+n2=n0+(n0-1)=2*n0-1

例3 在解某些判定問題時,利用哈夫曼樹獲得最佳判定演算法。

(a)

WPL=0.05*1+0.15*2+0.4*3+0.3*4+0.1*4=3.15

(b)(c)

WPL=0.4*1+0.3*2+0.15*3+0.05*4+0.1*4=2.05                    WPL=0.05*3+0.15*3+0.4*2+0.3*2+0.1*2=2.2

哈夫曼編碼

    從哈夫曼樹根結點開始,對左子樹分配程式碼“0”,右子樹分配程式碼“1”,一直到達葉子結點為止,然後將從樹根沿每條路徑到達葉子結點的程式碼排列起來,便得到了哈夫曼編碼。

例,對電文 EMCAD 編碼。若等長編碼,則

    EMCAD => 000001010011100 共15位

設各字母的使用頻度為 {E,M,C,A,D}={1,2,3,3,4}。用頻度為權值生成哈夫曼樹,並在葉子上標註對應的字母,樹枝分配程式碼“0”或“1”:

 

各字母的編碼即為哈夫曼編碼:  EMCAD => 000001011011 共12位