我的壓縮器使用頻率表構造霍夫曼樹,然後編碼並將頻率表和編碼保存到文件中。霍夫曼編碼 - 如果兩個字母的頻率相同,可以產生不同的碼字生成
解壓縮程序從文件中讀取頻率表,重構哈夫曼樹,然後解碼保存在文件中的編碼。
問題是,當兩個頻率相同時,壓縮器和解壓縮器正在創建兩個不同的霍夫曼樹,生成不同的碼字,儘管解碼有效,但解碼因爲它們不同而中斷。
我該怎麼做才能解決這個問題?
問候。
注:我正在用Java編寫它。
我的壓縮器使用頻率表構造霍夫曼樹,然後編碼並將頻率表和編碼保存到文件中。霍夫曼編碼 - 如果兩個字母的頻率相同,可以產生不同的碼字生成
解壓縮程序從文件中讀取頻率表,重構哈夫曼樹,然後解碼保存在文件中的編碼。
問題是,當兩個頻率相同時,壓縮器和解壓縮器正在創建兩個不同的霍夫曼樹,生成不同的碼字,儘管解碼有效,但解碼因爲它們不同而中斷。
我該怎麼做才能解決這個問題?
問候。
注:我正在用Java編寫它。
解壓縮器不假設從文件讀取頻率表,重構霍夫曼樹,然後解碼保存在文件中的編碼。壓縮機應該保存「堆棧」 - 000「流量」--- 000的字編碼表,然後解壓縮器只需讀取編碼表即可獲得編碼字。
實際上我發現很難存儲這個表比頻率表小,所以我選擇了我的方法。例如,YourMethod需要Byte:CodeWordLength:CodeWord,MyMethod需要Byte:Frequency。 –
您應該檢查Canonical Huffman代碼:http://en.wikipedia.org/wiki/Canonical_Huffman_code。
首先它解決你的問題。其次,它允許您僅傳輸代碼大小差異,而不是代碼表或(通常更糟糕的)頻率表。如果在創建霍夫曼樹時對符號進行排序,請確保使用穩定的排序算法。
有一個Java實現的例子可以在這裏找到:https://code.google.com/p/kanzi/source/browse/java/src/kanzi/entropy/HuffmanEncoder.java
這是一個很好的答案,但顯然是一個更長的修復。較短的解決方法是確保壓縮機和解壓縮機方法中的頻率表都按照相同的順序排序。最初,只對解壓縮方法中的表進行了排序。壓縮機方法中的表格未排序。當頻率相同時,這有時導致創建不同的編碼,但順序不同。 –
有壓縮機將它添加到文件之前調整的頻率表? – Beta