例題:
假設乙個文字檔案tfile中只包含7個字元,這7個字元在文字中出現的次數為
利用哈夫曼樹可以為檔案tfile構造出符合字首編碼要求的不等長編碼。
1. 將tfile中7個字元都作為葉子結點,每個字元出現次數作為該葉子結點的權值
2. 規定哈夫曼樹中所有左分支表示字元0,所有右分支表示字元1,將依次從根結點到每個葉子結點所經過的分支的二進位制位的序列作為該
結點對應的字元編碼
3. 由於從根結點到任何乙個葉子結點都不可能經過其他葉子,這種編碼一定是字首編碼,哈夫曼樹的帶權路徑長度正好是檔案tfile編碼
的總長度
通過哈夫曼樹來構造的編碼稱為哈弗曼編碼(huffman code)
用**來模擬樹的操作
程式原始碼:
#include#include#includeusing namespace std;
#define n 10 // 帶編碼字元的個數,即樹中葉結點的最大個數
#define m (2*n-1) // 樹中總的結點數目
class htnode;
class htcode;
void init(htcode hc, int n)//
//遍歷節點陣列ht中前i-1個節點,在所有父節點為0的節點中找出最小的兩個節點s1,s2
void select(htnode ht, int k, int *s1, int *s2)
*s1 = i;
for(i=1; i<=k; ++i)
程式輸出
哈弗曼樹與哈弗曼編碼(實現)
歷史背景 1951年,霍夫曼在mit攻讀博士學位,他和修讀資訊理論課程的同學得選擇是完成學期報告還是期末考試。導師robert fano出的學期報告題目是 查詢最有效的二進位制編碼。由於無法證明哪個已有編碼是最有效的,霍夫曼放棄對已有編碼的研究,轉向新的探索,最終發現了基於有序頻率二叉樹編碼的想法,...
哈弗曼編碼 哈弗曼樹
哈弗曼編碼是依賴於字元使用頻率來建立的一種編碼,通過把使用頻率低的字元分配相對較多的01編碼,而使用頻率高的分配相對較低的01編碼,來建立最小的帶權路徑長度的樹,來最大化的獲得編碼儲存空間的一種編碼規則。這個樹稱為哈弗曼樹,也稱為最優二叉樹。這樣可以確定每乙個字元的編碼不可能成為其他字元編碼的坐子串...
哈弗曼編碼
include include include define my strmax 100 define infinity 1000000 typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹 typedef char huffmancode 動態分配陣列儲存赫...