霍夫曼代码解释Java

时间:2016-12-03 09:57:09

标签: java comparable huffman-code stringbuffer

我是java的新手,我试图通过在线使用代码来了解霍夫曼编码。我弄乱了代码以了解它是如何工作的,因为我没有找到任何关于如何实现霍夫曼代码的内容。 我需要理解为什么在这段代码中,这个人在Huffman树类和字符串缓冲区中使用了相似的东西。 如果有人知道任何有关霍夫曼在线编码或甚至算法的任何好的解释,请。 我真的需要理解这段代码。 PS:英语不是我的母语,对任何困惑都很抱歉。 谢谢

import java.util.*;

public class HuffmanCode {
    // input is an array of frequencies, indexed by character code
    public HuffmanTree buildTree(int[] charFreqs) {
        PriorityQueue<HuffmanTree> trees = new PriorityQueue<HuffmanTree>();
        // initially, we have a forest of leaves
        // one for each non-empty character
        for (int i = 0; i < charFreqs.length; i++)
            if (charFreqs[i] > 0)
                trees.offer(new HuffmanLeaf(charFreqs[i], (char)i));

        assert trees.size() > 0;
        // loop until there is only one tree left
        while (trees.size() > 1) {
            // two trees with least frequency
            HuffmanTree a = trees.poll();
            HuffmanTree b = trees.poll();

            // put into new node and re-insert into queue
            trees.offer(new HuffmanNode(a, b));
        }
        return trees.poll();
    }

    public void printCodes(HuffmanTree tree, StringBuffer prefix) {
        assert tree != null;
        if (tree instanceof HuffmanLeaf) {
            HuffmanLeaf leaf = (HuffmanLeaf)tree;

            // print out character, frequency, and code for this leaf (which is just the prefix)
            System.out.println(leaf.value + "\t" + leaf.frequency + "\t" + prefix);

        } else if (tree instanceof HuffmanNode) {
            HuffmanNode node = (HuffmanNode)tree;

            // traverse left
            prefix.append('0');
            //prefix = prefix + "0";
            printCodes(node.left, prefix);
            prefix.deleteCharAt(prefix.length()-1);

            // traverse right
            prefix.append('1');
            printCodes(node.right, prefix);
            prefix.deleteCharAt(prefix.length()-1);
        }
    }
}

霍夫曼树类:

public class HuffmanTree implements Comparable<HuffmanTree> {
    public final int frequency; // the frequency of this tree

    public HuffmanTree(int freq) {
        frequency = freq;
    }

    // compares on the frequency
    public int compareTo(HuffmanTree tree) {
        return frequency - tree.frequency;
    }
}

霍夫曼叶:

class HuffmanLeaf extends HuffmanTree {

    public final char value; // the character this leaf represents

    public HuffmanLeaf(int freq, char val) {
        super(freq);
        value = val;
    }
}

霍夫曼节点:

class HuffmanNode extends HuffmanTree {

    public final HuffmanTree left, right; // subtrees

    public HuffmanNode(HuffmanTree l, HuffmanTree r) {
        //Calling the super  constructor HuffmanTree 
        super(l.frequency + r.frequency);
        left = l;
        right = r;
    }

}

主:

public class Main {

    public static void main(String[] args) {
        String test = "Hello World";
        HuffmanCode newCode = new HuffmanCode();

        // we will assume that all our characters will have
        // code less than 256, for simplicity
        int[] charFreqs = new int[256];
        // read each character and record the frequencies
        for (char c : test.toCharArray())
            charFreqs[c]++;

        // build tree
        ////HuffmanTree tree = buildTree(charFreqs);
        HuffmanTree tree = newCode.buildTree(charFreqs);

        // print out results
        System.out.println("SYMBOL\tWEIGHT\tHUFFMAN CODE");
        newCode.printCodes(tree, new StringBuffer());
    }

}

1 个答案:

答案 0 :(得分:2)

  

为什么这个家伙使用了Stringbuffer

因为使用one构建字符串是首选的串联串。

StringBuilder vs String concatenation in toString() in Java

When to use StringBuilder in Java

等等......

StringBuilder与StringBuffer

有些不同

Why use StringBuilder? StringBuffer can work with multiple thread as well as one thread?

  

和可比的

因为使用了优先级队列。它需要那个界面。

How do I use a PriorityQueue?

并且,阅读Huffman编码维基百科页面(您可以做以理解算法),提到编码的最佳结构是有序的。个人而言,我不知道算法,但我建议不要将代码复制到您不理解的互联网上。