回覆列表
-
1 # epgdo48759
-
2 # lanfengz2
假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 k1、k2、…、kn,則哈夫曼樹的構造規則為:
(1) 將k1、k2、…,kn看成是有n 棵樹的森林(每棵樹僅有一個結點);
(2) 在森林中選出兩個根結點的權值最小的樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;
(4)重複(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。
假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 k1、k2、…、kn,則哈夫曼樹的構造規則為:(1) 將k1、k2、…,kn看成是有n 棵樹的森林(每棵樹僅有一個結點);(2) 在森林中選出兩個根結點的權值最小的樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;(3)從森林中刪除選取的兩棵樹,並將新樹加入森林;(4)重複(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。哈夫曼靜態編碼:它對需要編碼的資料進行兩遍掃描:第一遍統計原資料中各字元出現的頻率,利用得到的頻率值建立哈夫曼樹,並必須把樹的資訊儲存起來,即把字元0-255(2^8=256)的頻率值以2-4BYTES的長度順序儲存起來,(用4Bytes的長度儲存頻率值,頻率值的表示範圍為0--2^32-1,這已足夠表示大檔案中字元出現的頻率了)以便解壓時建立同樣的哈夫曼樹進行解壓;第二遍則根據第一遍掃描得到的哈夫曼樹進行編碼,並把編碼後得到的碼字儲存起來。哈夫曼動態編碼:動態哈夫曼編碼使用一棵動態變化的哈夫曼樹,對第t+1個字元的編碼是根據原始資料中前t個字元得到的哈夫曼樹來進行的,編碼和解碼使用相同的初始哈夫曼樹,每處理完一個字元,編碼和解碼使用相同的方法修改哈夫曼樹,所以沒有必要為解碼而儲存哈夫曼樹的資訊。編碼和解碼一個字元所需的時間與該字元的編碼長度成正比,所以動態哈夫曼編碼可實時進行。