將形成的二叉樹的左節點標0,右節點標1。把從最上面的根節點到最下面的葉子節點路徑中遇到的0,1序列串起來,得到各個符號的編碼。
可以看到,符號只能出現在樹葉上,任何乙個字元的路徑都不會是另一字元路徑的字首路徑,這樣,字首編碼也就構造成功了。
這樣一棵二叉樹在資料結構課程中稱之為huffman樹,常用於最佳判定,它是最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的帶權路徑長度記為:wpl= (w1*l1+w2*l2+w3*l3+…+wn*ln),n個權值wi(i=1,2,…n)構成一棵有n個葉結點的二叉樹,相應的葉結點的路徑長度為 li(i=1,2,…n)。huffman樹得出的wpl值最小。
2 2在對一幅大小為100,672bytes 8位bmp影象檔案進行huffman編碼過程中,作者按照以下步驟實現了的壓縮和解壓縮演算法。
1)掃瞄位**件的全部資料(對應用於調色盤的編碼),完成資料頻度的統計。
2)依據資料出現的頻度建立哈夫曼樹。
3)將哈夫曼樹的資訊寫入輸出檔案(壓縮後檔案),以備解壓縮時使用。
4)進行第二遍掃瞄,將原檔案所有編碼資料轉化為哈夫曼編碼,儲存到輸出檔案。解壓縮則為逆過程,以下是編碼和解碼的實現演算法。
a)定義資料結構node如下:
struct node
;//父節點為-1的節點是樹根
bmp huff code(bmp tree[node] parent,node);//若不為-1則遞迴
if(child≠-1);//若不為葉節點
{if(child=bmp tree[node] right);//右子節點,輸出「1」
outputbit(1);
else if(child=bmp tree[node] left);//左子節點,輸出「0」
哈夫曼壓縮
哈夫曼演算法 huffman 演算法是一種基於統計的壓縮方法。它的本質就是對文字檔案中的字元進行重新編碼,對於使用頻率越高的字元,其編碼也越短。但是任何2 個字元的編碼,是不能出現向前包含的。也就是說字元a 假設為00 的編碼的前段,不可能為字元b 則b的編碼不可能為001 因為這裡b 的編碼中包含...
哈夫曼壓縮
哈夫曼壓縮 哈夫曼壓縮是無失真壓縮的一種,一般用來壓縮文字和程式檔案。壓縮步驟 將要壓縮的檔案乙個乙個位元組地讀出來,統計每個位元組出現的次數 作為該葉子節點的權值 構建哈夫曼樹,採用優先佇列。遍歷哈夫曼樹,得到每乙個葉子節點的哈夫曼編碼。左0右1,得到的是01字串 將不足八位的01字串補0使其達到...
哈夫曼壓縮
size large 此文主要分析的是哈夫曼壓縮的重點包括統計字元頻率,建哈夫曼樹,生成碼表。哈夫曼壓縮是最常用的一種靜態無痕壓縮。以前也學習過哈夫曼的演算法結構,但是沒有自己去寫 實現,這次再學習了一遍,更加深刻理解哈夫曼壓縮的原理,如何真正實現檔案的壓縮節省記憶體資源。下面梳理下我的 和分析邏輯...