java实现Haffman编码
1、先创建一个树节点类(泛型类),为了方便使用集合的排序方法,泛型类要实现泛型接口Comparable,代码如下
package com.hjp.huffman; /**
* Created by JiaPeng on 2016/12/28.
*/
public class Node<T> implements Comparable<Node<T>> { private T data;
private int weight;
private Node<T> left;
private Node<T> right;
private String codeStr; public T getData() {
return data;
} public void setData(T data) {
this.data = data;
} public int getWeight() {
return weight;
} public void setWeight(int weight) {
this.weight = weight;
} public Node<T> getLeft() {
return left;
} public void setLeft(Node<T> left) {
this.left = left;
} public Node<T> getRight() {
return right;
} public void setRight(Node<T> right) {
this.right = right;
} public Node(T data, int weight) {
this.data = data;
this.weight = weight;
} public String getCodeStr() {
return codeStr;
} public void setCodeStr(String codeStr) {
this.codeStr = codeStr;
} @Override
public int compareTo(Node<T> o) {
if (o.weight > this.weight) {
return 1;
} else if (o.weight < this.weight) {
return -1;
}
return 0;
} @Override
public String toString() {
return "data:" + this.data + ",weight:" + this.weight + "; ";
}
}
树节点类
2、编写泛型静态方法,构造Haffman树及对树编码,代码如下
package com.hjp.huffman; import java.util.*; /**
* Created by JiaPeng on 2016/12/28.
*/
public class HuffmanTree { public static <T> Node<T> createTree(List<Node<T>> nodes) {
while (nodes.size() > 1) {
int nodesLen = nodes.size();
Collections.sort(nodes);
Node<T> left = nodes.get(nodesLen - 1);
Node<T> right = nodes.get(nodesLen - 2);
Node<T> parent = new Node<T>(null, left.getWeight() + right.getWeight());
parent.setLeft(left);
parent.setRight(right);
nodes.remove(left);
nodes.remove(right);
nodes.add(parent);
}
return nodes.get(0);
} public static <T> List<Node<T>> breath(Node<T> root) {
List<Node<T>> list = new ArrayList<Node<T>>();
Queue<Node<T>> queue = new LinkedList<Node<T>>();
queue.add(root);
StringBuilder stringBuilder = new StringBuilder();
while (!queue.isEmpty()) {
Node<T> pNode = queue.poll();
list.add(pNode);
Node<T> leftNode = pNode.getLeft();
String codeStr = pNode.getCodeStr();
if (leftNode != null) {
if (codeStr != null && !"".equals(codeStr)) {
leftNode.setCodeStr(codeStr + "0");
} else {
leftNode.setCodeStr("0");
}
queue.add(leftNode);
}
Node<T> rightNode = pNode.getRight();
if (rightNode != null) {
if (codeStr != null && !"".equals(codeStr)) {
rightNode.setCodeStr(codeStr + "1");
} else {
rightNode.setCodeStr("1");
}
queue.add(rightNode);
}
}
return list;
} }
构造树方法及编码方法
3、测试方法
package com.hjp.huffman; import com.hjp.data.JSONUtil; import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; /**
* Created by JiaPeng on 2016/12/28.
*/
public class testMain { public static void main(String[] args){
List<Node<String>> nodes = new ArrayList<Node<String>>();
nodes.add(new Node<String>("b", 5));
nodes.add(new Node<String>("a", 7));
nodes.add(new Node<String>("d", 2));
nodes.add(new Node<String>("c", 4));
Node<String> root = HuffmanTree.createTree(nodes);
List<Node<String>> huffmanList=HuffmanTree.breath(root);
Map<String,String> huffmanMap=new LinkedHashMap<String, String>();
for (int i = 0; i < huffmanList.size(); i++) {
Node<String> curNode=huffmanList.get(i);
if(curNode.getData()!=null){
huffmanMap.put(curNode.getData(),curNode.getCodeStr());
}
}
System.out.println(JSONUtil.toJson(huffmanMap));
} }
测试方法
java实现Haffman编码的更多相关文章
- 理清Java中的编码解码转换
1.字符集及编码方式 概括:字符编码方式及大端小端 详细:彻底理解字符编码 可以通过Charset.availableCharsets()获取Java支持的字符集,以JDK8为例,得到其支持的字符集: ...
- Java的默认编码
摘要: 1.Java的默认编码内容: 1.Java的默认编码 java的src.zip包中的java.nio.charset.Charset类中defaultCharset()方法说明java的编码类 ...
- ACM Haffman编码
Haffman编码 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去...).现在给你一串字符以及它们所对应的权值 ...
- java String.getBytes()编码问题——String.getBytes(charset)
String的getBytes()方法是得到一个字串的字节数组,这是众所周知的.但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组.如果你在使用这个方法时不考虑到这一点,你会发现在一个平 ...
- Delphi和JAVA用UTF-8编码进行Socket通信例子
最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收 ...
- java实现文件编码监测(转)
chardet是mozilla自动字符集探测算法代码的java移植.这个算法的最初作者是frank Tang,C++源代码在http://lxr.mozilla.org/mozilla/source/ ...
- java实现文件编码监测
java实现文件编码监测 最近在做一个文档的翻译项目,可文档的编码不知道,听头疼的.尝试了很多方法最后发现JCharDet这个工具可以轻松解决这个问题.于是作此笔记希望日后提醒自己以及帮助又需要的人. ...
- Haffman编码(haffman树)
Haffman编码 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去...).现在给你一串字符以及它们所对应的权值 ...
- windows下编译java源文件的编码错误
import java.util.Arrays;public class ArrayAsAReference{ public static void main(String[] args) { int ...
随机推荐
- HashTable、HashMap、HashSet
1. HashMap 1) hashmap的数据结构 Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: 当我们往hashmap中put元素的时候,先根据key的hash ...
- 《Spring 3.0就这么简单》 读书笔记
第一章:快速入门 开发流程: 1.创建库表 依赖jar包配置 2.事务:事务是恢复和并发控制的基本单位. 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolatio ...
- hibernate的hql查询
1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...
- json注意:
import json #dct="{'1':111}"#json 不认单引号 #dct=str({"1":111})#报错,因为生成的数据还是单引号:{'on ...
- [转]easyui tree 模仿ztree 使用扁平化加载json
原文地址:http://my.oschina.net/acitiviti/blog/349377 参考文章:http://www.jeasyuicn.com/demo/treeloadfilter.h ...
- 如何设置让iis服务器支持.apk文件的下载
随着智能手机的普及,越来越多的人使用手机上网,很多网站也应手机上网的需要推出了网站客户端,.apk文件就是安卓(Android)的应用程序后缀名,默认情况下,使用IIS作为Web服务器的无法下载此文件 ...
- 100114D
这道题用暴力水过了,蒟蒻是这么想的:枚举两个端点,找最小值,因为shift只能用一次,但是这样10^9*2.5要t,所以减掉只有一个黑点的情况,然后复杂度变为10^9*0.6 #include< ...
- 54B
The Hedgehog recently remembered one of his favorite childhood activities, - solving puzzles, and go ...
- 22 java当中的数组
class Test { public static void main(String args[]) { //数组的静态声明法 int arr[]={5,2,7,9,0}; //数组的动态声明法 i ...
- 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2473 Solved: 1211[Submit][Statu ...