【问题标题】:store huffman tree in java在java中存储霍夫曼树
【发布时间】:2021-02-17 16:31:23
【问题描述】:

我正在使用 Huffman 代码进行文件压缩和解压缩的项目。首先,我需要我要压缩的文件的每个唯一字符的频率。然后我用文件的字符频率的优先级队列构建了一个树。

`public static HuffmanNode buildTree(Map<Character, Integer> freq) {

    PriorityQueue<HuffmanNode> priorityQueue = new PriorityQueue<>();
    Set<Character> keySet = freq.keySet();
    for (Character c : keySet) {

        HuffmanNode huffmanNode = new HuffmanNode();
        huffmanNode.data = c;
        huffmanNode.frequency = freq.get(c);
        huffmanNode.left = null;
        huffmanNode.right = null;
        priorityQueue.offer(huffmanNode);
    }
    assert priorityQueue.size() > 0;

    while (priorityQueue.size() > 1) {

        HuffmanNode x = priorityQueue.peek();
        priorityQueue.poll();

        HuffmanNode y = priorityQueue.peek();
        priorityQueue.poll();

        HuffmanNode sum = new HuffmanNode();

        sum.frequency = x.frequency + y.frequency;
        sum.data = '-';

        sum.left = x;

        sum.right = y;
        root = sum;

        priorityQueue.offer(sum);//Inserts the specified element to the queue. If the queue is full, it returns false.
    }

    return priorityQueue.poll();
}

然后我遍历树并将其位值存储到文件中。遍历树时,左孩子为 0,右孩子为 1,并将其存储到文件中。它是压缩部分。 但是我的问题是,当我想从压缩文件中解压文件时,我无法解压它。我想我必须通过序列化来存储树,(听说过 java 的这个概念)。解压时我必须遍历树。但我不知道如何序列化或存储树。谁能帮我解决这个问题?

【问题讨论】:

    标签: java huffman-code


    【解决方案1】:

    是的,您需要在发送编码符号之前发送代码的表示,以便解码器能够理解它。

    有很多方法。最直接的就是遍历树,每遇到一个分支就发送一个 0 位;或每个叶分支一个 1 位,在您的情况下,紧随其后的是该叶的符号的 8 位。在解码器端,您可以读取这些位并重建树。描述是自终止的,因此您可以立即使用编码符号。

    【讨论】:

    • 感谢您的反馈。我正在努力解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多