【问题标题】:Huffman code Explanation Java霍夫曼代码解释 Java
【发布时间】:2017-04-18 04:58:12
【问题描述】:

我是 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());
    }

}

【问题讨论】:

  • 将打印语句添加到代码中或使用调试器并逐行运行,直到您认为自己理解为止
  • 有人能解释一下为什么这家伙使用 Stringbuffer 和可比性吗?
  • 不应将 Stackoverflow 用作社区努力来理解您发现的一些随机代码,抱歉。请尝试运行代码并弄清楚

标签: java comparable huffman-code stringbuffer


【解决方案1】:

这家伙为什么要用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?

并且,阅读霍夫曼编码维基百科页面(您可以这样做以了解算法),它提到编码的最佳结构是有序的。我个人不知道算法,但我建议不要从你不理解的互联网上复制代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多