1. 程式人生 > >哈夫曼(Huffman)樹和哈夫曼編碼

哈夫曼(Huffman)樹和哈夫曼編碼

選擇 其中 有一個 只有一個 bsp nbsp 例子 left style

一、哈夫曼(Huffman)樹和哈夫曼編碼

1.哈夫曼樹(Huffman)又稱最優二叉樹,是一類帶權路徑長度最短的樹, 常用於信息檢測。

定義:

結點間的路徑長度:樹中一個結點到另一個結點之間分支數目稱為這對結點之間的路徑長度。

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

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

樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和記為WPL。

例如:

技術分享圖片

對圖(a): WPL =9×2+5×2+2×2+3×2=38

對圖(b): WPL =3×2+9×3+5×3+2×1=50

對圖(c): WPL =9×1+5×2+2×3+3×3=34

總結:

路徑長度最短的二叉樹,其帶權路徑長度不一定最短;

帶權路徑最短的二叉樹,其結點權值越大離根越近;

2. 哈夫曼樹的構造

(1) 根據給定的 n個權值{W1 ,W2 ,…,Wn }構成n棵二叉樹的集合F={T1 ,T 2 ,…,Tn },其中每棵二叉樹中只有一個帶權為Wi 的根結點。

(2) 在 F中選擇兩棵根結點最小的樹作為左、右子樹構造一棵新的二叉樹T, 且置新的二叉樹的根結點的權值為其左、右子樹上根結點的權值之和。

(3) 將新二叉樹T加入二叉樹集合 F中,從二叉樹集合F中 去除原來兩棵根結點權 值最小的樹。

(4) 重復(2)和(3)步直到 F 中只含有一棵樹為止,這棵樹就是哈夫曼樹。

技術分享圖片

3. 哈夫曼編碼

樹中從根到每個葉子節點都有一條路徑,對路徑上的各分支約定指向左子樹的分支表示”0”碼,指向右子樹的分支表示“1”碼,取每條路徑上的“0”或“1”的序列作為各個葉子節點對應的字符編碼,即是哈夫曼編碼。

利用哈夫曼樹,不僅能構造出前綴編碼,而且還能使電文編碼的總長度最短。

拿圖例子來說:

A,B,C,D對應的哈夫曼編碼分別為:111,10,110,0

技術分享圖片

哈夫曼(Huffman)樹和哈夫曼編碼