霍夫曼编码 - 如果两个字母的频率相等,则可以进行不同的码字生成

时间:2014-03-12 15:35:32

标签: java compression bits huffman-code

我的压缩器使用频率表构造一个霍夫曼树,然后编码并将频率表和编码保存到文件中。

解压缩程序从文件中读取频率表,重建霍夫曼树,然后解码保存在文件中的编码。

问题在于,当两个频率相同时,压缩器和解压缩器会创建两个不同的霍夫曼树,生成不同的码字,虽然解码因为它们不同而有效但是有效。

我该怎么办才能打击这个?

问候。

注意:我是用Java编写的。

2 个答案:

答案 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