需要一些霍夫曼援助

时间:2013-05-29 05:55:03

标签: java algorithm

我正在尝试用Java实现压缩/解压缩算法,这是我目前的进展:full source code

我有两件事我不确定如何解决:

  1. 当我压缩文件时,它会为除了少量字节的文件之外的所有内容工作。一位朋友告诉我,问题是当我们压缩文件时,我们需要树,并且必须将它存储在文件本身中,从而使压缩文件因树而变大。关于如何解决这个问题的任何指示?
  2. 根本不确定如何实施减压。

2 个答案:

答案 0 :(得分:2)

问题1无法解决。例如,如果您的文件只有3个不同的字节,并且您进行霍夫曼压缩,则可以创建如下树:http://huffman.ooz.ie/?text=asd

因此,压缩文件中的树会自动大于完整的旧文件,但如果你做任何其他事情,它就不再是一个霍夫曼压缩了。对于具有许多不同字节的所有文件也是如此。 原则上:文件中更多相等的字节将在压缩后带来更好的结果

第二件事非常普遍,但是对于一些帮助,请查看以下代码:https://github.com/nayuki/Huffman-Coding/blob/master/src/nayuki/huffmancoding/HuffmanDecompress.java

答案 1 :(得分:1)

树可以以非常紧凑的方式存储。

我曾经做过一次 - 基本上我以LR模式遍历了树。所以在节点N,如果左侧分支是叶子,则写入1,然后写入此叶子编码的符号,否则只需写入0并下降到该节点。

然后对正确的分支执行相同操作 - 如果它是叶写1然后是符号,如果它是节点写0并下降到该节点。

这棵树http://huffman.ooz.ie/?text=asd(感谢Bernhard!)可以写成1[D]01[A]1[S],总共28位或4个字节(例如用[{1}}替换[D])。

以相反的方式解码表。我没有时间编写代码,但它确实有效,我相信它必须接近树的最紧凑的编码(不是我有任何证据)。