在計算機資料處理中,霍夫曼編碼使用變長編碼表對源符號(如檔案中的乙個字母)進行編碼,其中變長編碼表是通過一種評估**符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則使用較長的編碼,這便使編碼之後的字串的平均長度、期望值降低,從而達到無失真壓縮資料的目的。
例如,在英文中,e的出現機率最高,而z的出現概率則最低。當利用霍夫曼編碼對一篇英文進行壓縮時,e極有可能用乙個位元來表示,而z則可能花去25個位元(不是26)。用普通的表示方法時,每個英文本母均占用乙個位元組(byte),即8個位元。二者相比,e使用了一般編碼的1/8的長度,z則使用了3倍多。倘若我們能實現對於英文中各個字母出現概率的較準確的估算,就可以大幅度提高無失真壓縮的比例。
霍夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的路徑長度是從樹根到每一結點的路徑長度之和,記為wpl=(w1l1+w2l2+w3l3+...+wnln),n個權值wi(i=1,2,...n)構成一棵有n個葉結點的二叉樹,相應的葉結點的路徑長度為li(i=1,2,...n)。可以證明霍夫曼樹的wpl是最小的。
演算過程
進行霍夫曼編碼前,我們先建立乙個霍夫曼樹。
⒈將每個英文本母依照出現頻率由小排到大,最小在左。
⒉每個字母都代表乙個終端節點(葉節點),比較f.o.r.g.e.t五個字母中每個字母的出現頻率,將最小的兩個字母頻率相加合成乙個新的節點。如fig.2所示,發現f與o的頻率最小,故相加2+3=5。
⒊比較5.r.g.e.t,發現r與g的頻率最小,故相加4+4=8。
⒋比較5.8.e.t,發現5與e的頻率最小,故相加5+5=10。
⒌比較8.10.t,發現8與t的頻率最小,故相加8+7=15。
⒍最後剩10.15,沒有可以比較的物件,相加10+15=25。
進行編碼
1.給霍夫曼樹的所有左鏈結'0'與
霍夫曼樹
霍夫曼樹
右鏈結'1'。
2.從樹根至樹葉依序記錄所有字母的編碼
設有字符集:s=。
給定乙個包含26個英文本母的檔案,統計每個字元出現的概率,根據計算的概率構造一顆哈夫曼樹。
並完成對英文檔案的編碼和解碼。
要求:(1)準備乙個包含26個英文本母的英文檔案(可以不包含標點符號等),統計各個字元的概率
(2)構造哈夫曼樹
(3)對英文檔案進行編碼,輸出乙個編碼後的檔案
(4)對編碼檔案進行解碼,輸出乙個解碼後的檔案
(5)撰寫部落格記錄實驗的設計和實現過程,並將源**傳到碼雲
(6)把實驗結果截圖上傳到雲班課
滿分:6分。
酌情打分。
public class huffmannode
void setweight(int weight)
void setparent(int parent)
void setleftchild(int leftchild)
void setrightchild(int rightchild)
int getweight()
int getparent()
int getleftchild()
int getrightchild()
}
public class huffmancode
huffmancode(string code)
void setcharacter(string character)
void setcode(string code)
string getcharacter()
string getcode()
}
public class huffmantree
for(;start問題1:
只輸出了兩個數的編碼
問題1解決方案:
錯誤地將26個字元數刪成兩個 於是其他地方輸入多少個也沒用
改正之後就沒問題了
哈夫曼編碼測試
1.定義 給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。2.術語 01 路徑和路徑長度 定義 在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點...
哈夫曼編碼測試
設有字符集 s 給定乙個包含26個英文本母的檔案,統計每個字元出現的概率,根據計算的概率構造一顆哈夫曼樹。並完成對英文檔案的編碼和解碼。要求 1 準備乙個包含26個英文本母的英文檔案 可以不包含標點符號等 統計各個字元的概率 2 構造哈夫曼樹 3 對英文檔案進行編碼,輸出乙個編碼後的檔案 4 對編碼...
哈夫曼編碼測試
把字元從檔案中取出來,這是以前學過的io流實現的。統計出現的字元及頻率,將各個字元建立為葉子結點,頻率為結點的權值,用鍊錶儲存這些葉子結點。將所有帶權值的結點按權值從小到大排列 依次選取權值最小的結點放在樹的底部,權值小的在左邊 取出的結點相當於從這些結點的集合中剔除 生成乙個新節點作為這兩個結點的...