huffan壓縮演算法在大學的教材重點講過, 實現起來相對輕鬆。主體思想是用較短的編碼表示頻率較高的位元組, 用較長的編碼表示頻率較少的位元組, 使得總體的編碼最短。由於哈夫曼編碼不是定長編碼, 所以必須得滿足任何乙個位元組b1的編碼不是另乙個位元組b2編碼的字首。待編碼的位元組都在哈夫曼樹的葉子節點上,所以哈夫曼編碼滿足字首編碼的條件。
記錄一下實現步驟和自己犯過的錯誤:
1. 統計每個位元組出現的頻率。
2. 根據位元組頻率, 構建哈夫曼樹。
3. 對每個位元組編碼。 注意這裡是從元素到根節點的逆向編碼過程, 需要特殊處理。
如果熟悉整個過程,解碼比較容易。
注意:1. 構建哈夫曼樹時, 哈夫曼樹節點最多有256*2-1=511個,可以按實際數目分配, 也可以一次性分配511個,最好不要直接在棧上分配, 如果沒有對齊位元組, 可能會崩棧。
2. 什麼時候按實際資料個數分配, 什麼時候一次性分配511個呢?這個需要考慮。因為解壓檔案時需要重現哈夫曼樹,故壓縮時需要把這些節點資訊寫入檔案中。我實現的時候是採用按實際個數分配的。
利用哈夫曼編碼的缺點:
1. 慢, 這個是硬傷, 沒有辦法, 需要2次遍歷整個檔案, 我實現的時候是乙個個位元組的讀入, 編碼的時候也是乙個個位元組的寫入。當然也可以實現緩衝機制,一次讀多個位元組, 編碼的時候一次寫入多個位元組。
2. 並不是對所有檔案都能壓縮, 對某些檔案進行壓縮的時候,發現檔案反而變長。 比喻說對jpg檔案壓縮, 發現檔案變長了。原因是jpg已經用過了一次哈夫曼編碼, 由於需要寫入哈夫曼樹的所有節點,檔案變長, 也很正常。
一般的壓縮軟體會綜合使用哈夫曼壓縮演算法和lz系統演算法。比喻說zlib庫使用的deflate演算法就是同時使用了lz77演算法與哈夫曼編碼(huffman coding)的乙個無損資料壓縮演算法。
lz77演算法是另外乙個經典的演算法,lz77演算法的出現打破了之前由huffman演算法一家獨大的局面。
它是利用動態字典來壓縮資料,有時間一定要學習lz系列演算法。
源**鏈結
利用哈夫曼編碼壓縮檔案
編譯環境 ubuntu 16.04 本文主要考核如何以c實現積體電路測試向量檔案的無失真壓縮。在通常的檔案儲存中,無論是二進位制格式的檔案還是文字檔案,幾乎都是等寬的編碼。比如ascii碼格式的文字檔案,每個字元由乙個ascii碼表示,寬度為8bit。然而,從磁碟空間利用率的角度看,這並不是一種效率...
哈夫曼樹和哈夫曼編碼(檔案壓縮)
哈夫曼樹 huffman tree 帶權路徑長度 wpl 設二叉樹有n個葉子結點,每個葉子結點帶有權值wk,從根節點到每個葉子結點的長度為lk,則每個葉子結點帶權路徑長度之和就是 wk lk 求和 最優二叉樹或哈夫曼樹 wpl最小的二叉樹 哈夫曼樹的構造 每次把權值最小的兩棵二叉樹合併 1 huff...
哈夫曼編碼檔案壓縮解壓
哈夫曼編碼檔案壓縮解壓 沒整懂這份 竟然只能壓縮文字檔案,而且內容不能包含中文,不能解壓大於 8 k 的zip壓縮檔案 還有就是如果使用哈夫曼編碼壓縮的內容重複率不高,壓縮的效果不明顯,如果內容的重複率高壓縮的效果好點 呼叫封裝 public static byte hufmanzip byte b...