資料結構----非線性結構----哈夫曼樹及其應用
阿新 • • 發佈:2021-01-31
學習時間
2021-01-27
學習內容
哈夫曼樹
哈夫曼樹又稱最優二叉樹,是帶權路徑長度最短的樹,可用來構造最優編碼,用於資訊傳輸、資料壓縮等方面,是一種應用廣泛的二叉樹。
哈夫曼樹的基本概念
- 路徑:樹中的一個結點到另一個結點之間的分支序列構成兩個結點之間的路徑
- 路徑長度:路徑上分支的條數稱為路徑長度
- 結點的權:給樹中結點賦予一個數值,這個數值稱為結點的權
- 帶權路徑長度:結點到樹根間的路徑長度與結點的權的乘積稱為這個結點的帶權路徑長度
- 樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度的和稱為樹的帶權路徑長度,通常記作WPL
- 最優二叉樹:在葉子個數和權值確定的情況下,WPL最小的二叉樹稱為最優二叉樹,也叫哈夫曼樹
根據經驗:權值大的葉子距離根結點近,樹的WPL小
哈夫曼樹的建立
假設有n個權值,則構造出的哈夫曼樹有32313133353236313431303231363533e58685e5aeb931333365646233n個葉子結點。 n個權值分別設為 k1、k2、…、kn,則哈夫曼樹的構造規則為: (1) 將k1、k2、…,kn看成是有n 棵樹的森林(每棵樹僅有一個結點); (2) 在森林中選出兩個根結點的權值最小的樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和; (3)從森林中刪除選取的兩棵樹,並將新樹加入森林; (4)重複(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。
圖示:
哈夫曼樹儲存結構的特點
哈夫曼樹中沒有度為1的結點,這類二叉樹稱為正則二叉樹,對於n個葉子的哈夫曼樹,演算法中構建了一個n-1個度為2的結點,所以哈夫曼樹共有2n-1個結點,可以儲存在一個大小為2n-1的一維陣列中
哈夫曼編碼
哈夫曼靜態編碼
它對需要編碼的資料進行兩遍掃描:第一遍統計原資料中各字元出現的頻率,利用得到的頻率值建立哈夫曼樹,並必須把樹的資訊儲存起來,即把字元0-255(28=256)的頻率值以2-4BYTES的長度順序儲存起來,(用4Bytes的長度儲存頻率值,頻率值的表示範圍為0–232-1,這已足夠表示大檔案中字元出現的頻率了)以便解壓時建立同樣的哈夫曼樹進行解壓;第二遍則根據第一遍掃描得到的哈夫曼樹進行編碼,並把編碼後得到的碼字儲存起來。
哈夫曼動態編碼
動態哈夫曼編碼使用一棵動態變化的哈夫曼樹,對第t+1個字元的編碼是根據原始資料中前t個字元得到的哈夫曼樹來進行的,編碼和解碼使用相同的初始哈夫曼樹,每處理完一個字元,編碼和解碼使用相同的方法修改哈夫曼樹,所以沒有必要為解碼而儲存哈夫曼樹的資訊。編碼和解碼一個字元所需的時間與該字元的編碼長度成正比,所以動態哈夫曼編碼可實時進行。