【问题标题】:Huffman code in binary(java)?二进制(java)中的霍夫曼代码?
【发布时间】:2018-06-20 03:27:36
【问题描述】:

我已经成功构建了我的霍夫曼树,并且我有一个方法可以遍历树并将每个字符的霍夫曼代码保存为 1 和 0 的字符串:

    public void encode(HuffmanNode node, String aux) {

    if (!node.isLeaf()) {
        if (node.getLeft() != null) {
            aux = aux + "0";
            encode(node.getLeft(), aux);
        }
        if (node.getRight() != null){
            aux = aux + "1";
            encode(node.getRight(), aux);
        }
    } else {
        //building a character-code pair and add to keyMap
        keyMap.put(new Character(node.getCh()), aux);
    }
}

其中 keyMap 是将每个字符映射到其 Huffman 码的 HashMap。

但是,将 Huffman 代码保存为字符串只会增加编码文件的大小而不是压缩它,因为您需要 0 和 1 的字符串来表示单个字符。那么有没有办法将代码保存为二进制位而不是字符串?提前谢谢。

【问题讨论】:

    标签: java huffman-code


    【解决方案1】:

    不要使用String 来存储二进制结果,使用java.util.BitSet

    它完全符合您的要求,允许您按索引位置设置各个位。

    当您准备好提取二进制值时,您可以使用toByteArray()

    【讨论】:

    • 嘿,谢谢你的提示。我尝试了 BitSet,它工作得非常好。一个问题是,BitSet 在被填充时会增加一倍的大小,但是没有足够的字符来填充额外的位,所以在解压缩时我总是会在最后得到一行不需要的文本。反正有这个吗?
    • 跟踪你实际使用了多少位,四舍五入到 8,然后从字节数组中只取那么多字节。您还应该将未压缩消息的长度作为数据流的前缀包含在内,以便解压缩器可以知道完整消息何时被解压缩。
    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多