【问题标题】:How to save Huffman tree in file? [closed]如何将霍夫曼树保存在文件中? [关闭]
【发布时间】:2014-12-23 03:32:34
【问题描述】:

我正在使用 Java 进行 Huffman 编码。我不明白如何以及在哪里存储树。我知道如何制作树,然后将其保存为二进制文件,但为了解码目的,我们将再次需要同一棵树进行解码。如何将该树保存在文件中以将其附加到二进制文件中?

【问题讨论】:

  • 你的代码在哪里?哪种编程语言?
  • 如果你注意的话他说java
  • 显示一些你尝试过的代码。
  • 我正在用 java 编码。
  • 你能给我一些想法,我怎样才能将树保存在文件中,以便再次用于解码。

标签: java tree huffman-code


【解决方案1】:

将树写为一系列位:0 表示叶子,1 表示内部节点。具有 N 个叶节点和 N-1 个内部节点的二叉树(霍夫曼或其他)的输出将是 2N-1 位的序列。 (您实际上可以保存两位,因为您知道树中的第一个和最后一个节点将是叶节点,但可能不值得将算法复杂化以保存两位。)

也许最简单的方法是预先安排位:

function write_tree (top_node) {
    if is_leaf(top_node) {
        write "0"
        // optionally, write any date associated with the leaf node
        // although in practice it's easier to write the leaf data
        // to a separate output stream. That lets this stream contain
        // actual bits rather than the characters "0"/"1"
        }
    else {
        write "1"
        write_tree (top_node.left)
        write_tree (top_node.right) }}

function read_tree (bit_stream) -> returns tree
    next_bit = bit_stream.read()
    if next_bit = "0" {
        root = new leaf
        // optionally read data associated with the leaf node
        }
    else {
        root = new internal node
        root.left = read_tree (bit_stream)
        root.right = read_tree (bit_stream) }
    return root }

一开始我没有注意到你提到了Java,所以我用伪代码写了上面的代码,我相信你用Java重写不会有问题。

【讨论】:

  • 感谢您的帮助,但我在构建树和为字符分配代码方面没有遇到问题。我不明白我们如何将树保存在文件中以便可以使用相同的树来解码代码?使用链表看到我们正在制作的树在我们的内存中,那么我们如何将它保存在文件中?
  • 但这正是我给你的代码的作用!位序列精确地编码了树的 shape。读取这些位可以让您构建一棵具有完全相同形状的新树。显然,这些位将被写入文件,然后从文件中读取。在霍夫曼树中,所有内部节点的化合价为 2,所有数据都附加到叶节点(其化合价为 0)。数据可以按顺序分别写入单独的文件或同一文件的另一部分,或者按照指示在指示相应叶节点的位置正确穿插位。
  • 对不起,我不明白你的意思。谢谢,我明白了。
猜你喜欢
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多