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());
}
}
}
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树