您的位置:首页 > 编程语言 > Java开发

Huffman编码 java版

2015-12-29 12:00 399 查看
前些日子写的Huffman编码,一直没有上传,刚才上传BM算法时候想起来还有它,顺便一块上传吧。

public class HuffmanCode {
//树节点
static class HuffmanTreeNode{
HuffmanTreeNode father;
HuffmanTreeNode leftNode;
HuffmanTreeNode rightNode;
char c;
int value;
public HuffmanTreeNode(){}

public HuffmanTreeNode(char c,int value){
this.c=c;
this.value=value;
}
}
//计数器:记录有多少个字符出现过
static int len;
//利用数组(hash)记录每个字符出现次数
static HuffmanTreeNode[] charCounts(String text){
int[] counts = new int[256];
for(int i=0;i<text.length();i++){
if(text.charAt(i) != ' '){
counts[text.charAt(i)]++;
}
}

for(int i=0;i<counts.length;i++){
if(counts[i] != 0){
len++;
}
}
HuffmanTreeNode[] nodes = new HuffmanTreeNode[len * 2 - 1];
int j = 0;
for (int i = 0; i < counts.length; i++) {
if (counts[i] != 0) {
nodes[j++] = new HuffmanTreeNode((char) i, counts[i]);
}
}
return nodes;
}

//取到出现次数最少的两个字符的HuffmanTreeNode节点下标
static int[] getTwoSmallestNode(HuffmanTreeNode[] nodes) {
int[] mins = new int[2];
int min = Integer.MAX_VALUE, secondMin = Integer.MAX_VALUE;
for(int i=0;i<nodes.length;i++){
if(nodes[i] != null){
if(nodes[i].value < min && nodes[i].father == null){
secondMin = min;
min=nodes[i].value;
mins[0]=i;
}else if(nodes[i].value < secondMin && nodes[i].father == null){
secondMin = nodes[i].value;
mins[1] = i;
}
}
}

return mins;
}

public static void main(String[] args) {
String text="when I was young I'd listen to the radio"
+"waiting for my favorite songs"
+"when they played I'd sing along,"
+"it make me smile."
+"those were such happy times and not so long ago"
+"how I wondered where they'd gone."
+"but they're back again just like a long lost friend"
+"all the songs I love so well."
+"every shalala every wo'wo"
+"still shines."
+"every shing-a-ling-a-ling "
+"that they're starting"
+"to sing so fine";

HuffmanTreeNode[] huffmanTreeNodes = charCounts(text);
//构建huffman树
for(int i = len; i < huffmanTreeNodes.length; i++){
int[] indexs = getTwoSmallestNode(huffmanTreeNodes);
huffmanTreeNodes[i] = new HuffmanTreeNode();
huffmanTreeNodes[i].value = huffmanTreeNodes[indexs[0]].value
+ huffmanTreeNodes[indexs[1]].value;
huffmanTreeNodes[i].leftNode = huffmanTreeNodes[indexs[0]];
huffmanTreeNodes[i].rightNode = huffmanTreeNodes[indexs[1]];
huffmanTreeNodes[indexs[0]].father = huffmanTreeNodes[i];
huffmanTreeNodes[indexs[1]].father = huffmanTreeNodes[i];
}
//注意是从底部向上遍历,需要将结果转置
for (int i = 0; i < len; i++) {
StringBuffer sb = new StringBuffer();
while (huffmanTreeNodes[i] != null && huffmanTreeNodes[i].father != null) {
if (huffmanTreeNodes[i].c != 0) {
System.out.print(huffmanTreeNodes[i].c + "----");
}
if (huffmanTreeNodes[i].father.leftNode.value == huffmanTreeNodes[i].value
&& huffmanTreeNodes[i].father.leftNode.c == huffmanTreeNodes[i].c) {
   sb.append("1");

} else {
sb.append("0");
}
huffmanTreeNodes[i] = huffmanTreeNodes[i].father;
}
System.out.println(sb.reverse().toString());
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法 编码