我正在尝试用Java实现压缩/解压缩算法,这是我目前的进展:full source code。
我有两件事我不确定如何解决:
答案 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])。
以相反的方式解码表。我没有时间编写代码,但它确实有效,我相信它必须接近树的最紧凑的编码(不是我有任何证据)。