我们可以使用Tries解码霍夫曼代码吗

时间:2019-02-01 07:30:30

标签: java data-structures decoding huffman-code

给出一组字符及其对应的霍夫曼编码字符串。我们可以使用尝试对它们进行解码吗?

我有以下课程说明了我的方法。我确实在互联网上尝试了一些测试用例,但是我对发现的结果并不完全满意。

这是我在互联网'geeksforgeeks'上找到的一个测试用例,其对应的编码字符串在main方法中作为搜索函数的参数给出。这个测试用例似乎工作正常。有人可以解释为什么我们可以或为什么不能使用尝试吗?

public class HuffmanDecode {
    static class Code {
        Character c;
        Code[] children;
        boolean isEnd;
        public Code(){
            this.c = null;
            this.children = new Code[2];
            this.isEnd = false;
            for(int i = 0 ; i < 2; i++){
                children[i] = null;
            }
        }
    }

    static Code root;
    static StringBuilder str = new StringBuilder();

    public static void buildTree(String input, Code current, char ch){
        for(int i = 0 ; i < input.length() ; i++){
            char curr = input.charAt(i);
            int index = curr - '0';
            if(current.children[index] == null){
                current.children[index] = new Code();
            }
            current = current.children[index];
        }

        current.isEnd = true;
        current.c = ch;
    }

    public static String search(String input, Code current){
        for(int i = 0 ; i < input.length(); i++){
            char curr = input.charAt(i);
            int index = curr - '0';
            if(current!=null && current.isEnd){
                str.append(current.c);
                current = root;
                i--;
            }
            else if(current.children[index]!=null && !current.isEnd){
                current = current.children[index];
            }

        }
        if(current!=null && current.isEnd)str.append(current.c);
        return str.toString();
    }
    public static void main(String[] args) {
        HuffmanDecode obj = new HuffmanDecode();
        HashMap<Character, String> map = new HashMap<>();
        root = new Code();
        map.put('e',"10");
        map.put('f',"1100");
        map.put('g',"011");
        map.put('k',"00");
        map.put('o',"010");
        map.put('r',"1101");
        map.put('s',"111");

        map.forEach((key, value)->{
            obj.buildTree(value,root,key);
        });
        search("01110100011111000101101011101000111",root);
        System.out.println(str.toString());
    }
}

1 个答案:

答案 0 :(得分:3)

是的,如果Trie是二叉树,则可以用于将字符编码和解码为位表示形式。没有二进制结构的特里将无法解码,因为这样的事实是,当解析特里中每个节点的潜在字符值时,由于它们共享一个带有前缀的前缀而可能最终无法到达的字符在trie结构中由较高节点表示的字符。例如,如果B用代码001表示,而C用代码001111表示,则解码算法无法到达表示字母C的节点,这是因为无论何时到达它,它都会返回父值B。这将使得无法解码包含字母C的任何语句,因此使非二进制特里在编码或解码一组霍夫曼编码字符时无效。但是,在给定二进制特里之后,代表一个字符的每个节点都将被表示为特里内的叶子值,这意味着每个编码的字符都将具有一个“前缀代码”,以确保在其任何父节点中都没有代表任何字符-从而确保解码算法可以达到字符表示。