我是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());
}
}
答案 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?
和可比的
因为使用了优先级队列。它需要那个界面。
并且,阅读Huffman编码维基百科页面(您可以做以理解算法),提到编码的最佳结构是有序的。个人而言,我不知道算法,但我建议不要将代码复制到您不理解的互联网上。