【问题标题】:How to export tree data structure for Huffman decoding/ encoding project in java?如何在 Java 中为 Huffman 解码/编码项目导出树数据结构?
【发布时间】:2016-04-18 01:45:59
【问题描述】:

我有一个项目作为任务,我还没有实施,但我已经想出了它的想法,但最后一步是我无法弄清楚的,甚至是如何实施。这就是我想要的项目:

我想使用 java 创建一个基于文本的压缩模型。我将创建一个 Huffman 编码器和解码器,并将这些程序存储在两台计算机中:PC1 和 PC2。

现在在 PC1 中,我将提供一个“data.txt”文件作为我的 Huffman 编码器程序的输入,它会创建另一个名为“binary.txt”的文件,其中包含 0 和 1。现在不是传输“data.txt”文件,而是通过电子邮件将“binary.txt”文件发送到PC2,并使用那里的解码器java程序,我将尝试重新创建“data.txt”。这样我就可以使用 Huffman 机制压缩我的文件了。

所以问题是我是 java 新手(到目前为止我并不害怕),而且我不知道如何从 PC1 导出树数据结构以及“binary.txt”文件,因为对于霍夫曼解码(稍后在 PC2 中),我将需要访问在 PC1 中创建的霍夫曼树,那么我该如何解决或创建这个项目?

还有其他更好的方法来实施这个项目吗? Hashmap 或 splay 树或任何其他数据结构?

谢谢

【问题讨论】:

  • 我不知道 Huffman 编码,但听起来您有兴趣将树结构序列化和反序列化为/从某种可传输格式(如文本文件),我猜您会随二进制文件一起发送.txt 文件。您应该看一下树遍历算法并找出一种利用这些算法的方法。这个问题也可能提供解决方案:stackoverflow.com/questions/759707/…
  • 通常当我想导出一棵树时,我会执行“有序遍历”并打印(或写入流)每个节点。 en.wikipedia.org/wiki/Tree_traversal
  • 或者另一方面,假设我创建了一个类并创建了该特定类的一个对象,然后为该特定对象设置了一个名为“length”的属性为 5。无论如何我可以在另一个java程序中使用这个值吗?同样在发布此问题后,我遇到了另一个站点,其中提到了包含头文件的内容,以防您要导出引用。对这两件事有任何想法吗?
  • @rohitkrishna094 也许您正在考虑对象序列化? javapractices.com/topic/TopicAction.do?Id=57
  • @Roman 是的,我认为这正是我所需要的。谢谢。

标签: java data-structures tree huffman-code


【解决方案1】:

如果您创建规范的霍夫曼表示,则只能传输代码长度。解码器可以根据这些重新创建树。

【讨论】:

  • 我不知道规范的霍夫曼树,但肯定会检查它,但我还有另一个疑问。如果解码器根据代码长度创建一棵树,那么它会不会比上面建议的哈希映射方法更低效?谢谢
  • Canonical Huffman 相当简单。粗略地说,它使用词汇(自然符号)顺序作为辅助键来创建霍夫曼代码。您可以通过仅编码代码长度而不是完整的树来节省一些空间。现在,如果你想更快,根本不要使用树:使用数组。编写起来有点复杂,但比树快得多。此处示例:github.com/flanglet/kanzi/blob/master/java/src/kanzi/entropy/….
【解决方案2】:

您无需将 Huffman 树导出到 binary.txt 文件中。您需要一个 Map,它将文本中的所有符号映射到 (0,1)-strings - 用于编码,并且您需要一个 reversed Map - 用于解码。您应该使用 Huffman 算法来构建树,然后 - 使用这棵树来填充地图。之后你就可以忘记树了。

因此,您的 'binary.txt' 文件必须仅包含某种形式的反转 Map,您的解码器可以理解。

【讨论】:

  • 但我项目的主要目的是将“data.txt”的大小减小到“binary.txt”的大小(霍夫曼编码的 1 和 0)。那么无论如何我可以传输这个binary.txt文件并让我的解码器读取它并解码它吗?而且,如果我使用地图,我必须将“binary.txt”和可逆地图都传输到接收器端(在我的情况下为 PC2),对吗?那么,这不会比原始的“data.txt”文件(在某些情况下)占用更多空间吗?
  • 如果文本很短,那么是的 - 反向映射占用的空间将占整个二进制文件的很大比例。但在这种情况下,压缩没有意义。对于非常长的文本,反向映射将占用二进制文件的一小部分。
  • 所以如果我有更长的文本,那么反向映射技术更容易实现对吧?但是如果我有较短的文件,有没有办法使用霍夫曼技术进行压缩,在这种情况下,压缩没有意义,但是有没有办法可以在不丢失任何数据的情况下压缩它)。
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
相关资源
最近更新 更多