[資料結構]哈夫曼樹、哈夫曼編碼
結點之間的路徑長度:從一個結點到另一個結點之間的分支數目。
樹的路徑長度:從樹的根到樹中每一個結點的路徑長度之和。
結點的帶權路徑長度:從該結點到樹根之間的路徑長度與結點上權的乘積。
樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和,記作:
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
例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位