哈夫曼代码解释Java
我是java新手,我正在尝试通过使用在线代码来理解哈夫曼编码。我正在混乱的代码,以了解它是如何工作的,因为我没有找到任何关于如何实现哈夫曼代码。 我需要理解为什么在这段代码中,这个家伙在Huffman树类和字符串缓冲区中使用Compariable。 如果有人知道任何关于哈夫曼编码的在线解释,甚至是算法,请。 我真的需要理解这个代码。 PS:英语不是我的母语,所以很抱歉给你带来任何困惑。 多谢各位哈夫曼代码解释Java,java,comparable,huffman-code,stringbuffer,Java,Comparable,Huffman Code,Stringbuffer,我是java新手,我正在尝试通过使用在线代码来理解哈夫曼编码。我正在混乱的代码,以了解它是如何工作的,因为我没有找到任何关于如何实现哈夫曼代码。 我需要理解为什么在这段代码中,这个家伙在Huffman树类和字符串缓冲区中使用Compariable。 如果有人知道任何关于哈夫曼编码的在线解释,甚至是算法,请。 我真的需要理解这个代码。 PS:英语不是我的母语,所以很抱歉给你带来任何困惑。 多谢各位 import java.util.*; public class HuffmanCode {
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);
}
}
}
哈夫曼节点:
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;
}
}
主要内容:
那家伙为什么用Stringbuffer
因为与串联字符串相比,使用一个字符串构建字符串更可取
等等
StringBuilder与StringBuffer有些不同
可比
因为使用了优先级队列。它需要这个接口
而且,阅读哈夫曼编码维基百科页面(你可以这样做来理解算法),它提到编码的最佳结构是有序的。我个人不知道算法,但我建议不要从你不懂的互联网上复制代码
那家伙为什么用Stringbuffer
因为与串联字符串相比,使用一个字符串构建字符串更可取
等等
StringBuilder与StringBuffer有些不同
可比
因为使用了优先级队列。它需要这个接口
而且,阅读哈夫曼编码维基百科页面(你可以这样做来理解算法),它提到编码的最佳结构是有序的。我个人不知道算法,但我建议不要从你不懂的互联网上复制代码 向代码中添加打印语句或使用调试器并逐行运行它,直到您认为您理解为止。有人能解释一下为什么这家伙使用Stringbuffer和comparable吗?Stackoverflow不应该被用作理解您发现的一些随机代码的社区努力,抱歉。请试着运行代码并计算出它比向代码中添加打印语句要好,或者使用调试器并逐行运行它,直到您认为您理解为止。有人能解释一下为什么这家伙使用Stringbuffer和comparable吗?Stackoverflow不应该被用作社区努力来理解您发现的一些随机代码,对不起。请尝试运行代码并找出它
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());
}
}