【问题标题】:Decoding a bitString using Huffman code table Java使用 Huffman 码表 Java 解码 bitString
【发布时间】:2019-04-12 09:57:09
【问题描述】:

目标是使用 Huffman 码表将 bitString 转换为纯文本,

r=000
h=001
o=01
w=100
d=1010
e=1011
l=11

我将霍夫曼代码表存储在两个不同的String[] 数组中:

String[] ch = {"r", "h", "o", "w", "d", "e", "l"};
String[] b = {"000", "001", "01", "100", "1010", "1011", "11"};

根据霍夫曼码表,下面的bitString等价于字符串“helloworld”。

String bits = "001101111110110001000111010";

现在我想遍历每组位以匹配其对应的字符:

StringBuilder sb = new StringBuilder();

for(int i = 0; i < bits.length(); i++) {
    if(bits.substring(0, b[i].length()).equals(b[i])) {
        sb.append(ch[i]);
        bits = bits.substring(b[i].length());
    }
}

这里的问题是每次找到匹配项时,我都找不到“重置”循环并返回到b[0] 的方法,所以我可以从头开始检查b[i]

【问题讨论】:

标签: java encoding huffman-code bitstring


【解决方案1】:

您需要“逐位”读取源数据,并每次检查它现在是否是有效的霍夫曼代码。我建议不要使用数组,而是使用Map (或者,您可以设置一个树结构并逐步遍历它),否则性能会变得非常慢,因为您必须为大部分时间遍历整个数组时间。

这是一个使用霍夫曼代码表的示例:

import java.util.HashMap;


public class HuffmanDecoder {
    private static HashMap<String, String> huffMap = new HashMap<>();

    static {
        huffMap.put("000", "r");
        huffMap.put("001", "h");
        huffMap.put("01", "o");
        huffMap.put("100", "w");
        huffMap.put("1010", "d");
        huffMap.put("1011", "e");
        huffMap.put("11", "l");
    }

    public final static void main(String[] args) {
        char[] bits = "001101111110110001000111010".toCharArray();

        StringBuffer result = new StringBuffer();
        StringBuffer temp = new StringBuffer();
        for (int i = 0; i < bits.length; i++) {
            temp.append(bits[i]);
            String val = huffMap.get(temp.toString());
            if (val == null) {
                continue;
            }
            result.append(val);
            temp.setLength(0);
        }

        System.out.println(result);
    }
}

一旦找到有效代码,相应的解码值就会被添加到结果缓冲区中,并重置临时缓冲区。缺少的是在接收不会导致有效代码值但其实现取决于实际代码的数据时的一些错误处理,例如对于 SFF 数据(传真图像),解码器会继续读取,直到到达行尾标记。

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多