貪心演算法的原理:
赫夫曼編碼可以很有效地壓縮資料:通常可以節省20%~90%的空間。
根據每個字元的出現頻率,赫夫曼貪心演算法構造出字元的最優二進位制表示。
變長編碼可以達到定長編碼好得多的壓縮率,其思想是賦予高頻字元短碼字,賦予低頻字元長碼字。
字首碼:即沒有任何碼字是其他碼字的字首。字首碼可以保證達到最優資料壓縮率(證明略)
字首碼的作用是簡化解碼的過程。由於沒有碼字是其他碼字的字首,編碼檔案的開始碼字是無歧義的,我們可以簡單地識別出開始碼字,將其轉換回原字元,然後對編碼檔案剩餘部分重複這種解碼過程。
編碼樹:解碼過程需要字首碼的一種方便的表示形式,以便我們可以容易地擷取開始碼字。一種二叉樹表示可以滿足這種需求,其葉結點為給定的字元。字元的二進位制碼字從根結點到該字元葉結點的簡單路徑表示,其中0意味著「轉向左孩子」,1意味著轉向右孩子。
檔案的最優編碼方案總是對應一棵滿(full)二叉樹,即每個非葉結點都有兩個孩子結點。
現在我們只關注滿二叉樹。若c為字母表且所有字元的出現頻率均為正數,則最優字首碼對應的樹恰有|c|個葉結點,每個葉結點對應字母表中的乙個字元,且恰有|c|-1個葉結點。
構造赫夫曼編碼:
赫夫曼設計了乙個貪心演算法來構造最優字首碼,被稱為赫夫曼編碼。
我們假定c是乙個n個字元的集合,其中每個字元c屬於c都是乙個物件,其屬性c.freq給出了字元的出現頻率。演算法自底向上構造出對應最優編碼的二叉樹t,它從|c|個葉結點開始,執行|c|-1「合併」操作建立出最終的二叉樹。演算法使用乙個以屬性freq為關鍵字最小優先佇列q,以識別最低頻率的物件將其合併。當合併兩個物件時,得到的新物件頻率設定為原來的兩個物件的頻率之和。
赫夫曼編碼
include include using namespace std typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹 typedef char huffmancode 動態分配陣列儲存赫夫曼編碼 赫夫曼編碼的演算法實現 void sethuffmant...
赫夫曼編碼
用赫夫曼樹進行編碼是我們處理資料壓縮常用的方法。請同學們用赫夫曼編碼方法儲存你班同學 資料結構 課程的期終考試成績。include include include include define ok 1 define maxnn 100000 typedef struct studentstuden...
赫夫曼編碼
問題r 赫夫曼編碼 思路 對於赫夫曼來說,往左走為0,往右走為1,可以發現每一位就往下走一層。因此整體報文的長度可以用不同報文在樹中的位置來確定,也就是說,符號種類 每個符號在樹中的深度即為整體報文的長度 而ascll碼的位元位長度為符號個數 8 include include include us...