我的压缩器使用频率表构造一个霍夫曼树,然后编码并将频率表和编码保存到文件中。
解压缩程序从文件中读取频率表,重建霍夫曼树,然后解码保存在文件中的编码。
问题在于,当两个频率相同时,压缩器和解压缩器会创建两个不同的霍夫曼树,生成不同的码字,虽然解码因为它们不同而有效但是有效。
我该怎么办才能打击这个?
问候。
注意:我是用Java编写的。
答案 0 :(得分:1)
解压缩器不会从文件中读取频率表,重建霍夫曼树,然后解码保存在文件中的编码。压缩器应保存单词编码表,即“堆栈” - 000“flow”--- 000,然后解压缩器只读取编码表以得到代码字。
答案 1 :(得分:1)
您应该检查Canonical Huffman代码:http://en.wikipedia.org/wiki/Canonical_Huffman_code。
首先它解决了你的问题。其次,它允许您仅传输代码大小差异而不是代码表或(通常更糟)频率表。如果在创建Huffman树期间对符号进行排序,请确保使用稳定的排序算法。
这里有一个Java实现示例:https://code.google.com/p/kanzi/source/browse/java/src/kanzi/entropy/HuffmanEncoder.java