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 ...
随机推荐
- Ubuntu里的若干问题解决方案
1. Ubuntu里出现两个屏幕,并且其中一个是“未知显示器”,无法去除时,可以尝试使用该命令:sudo apt-get install bumblebee-nvidia 2.虚拟机上Ubuntu开机 ...
- Servlet作业1-实现注册登录
1,注册功能 注册页面zhuce.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &q ...
- JAVA1种C++3种继承方式
JAVA中只有一种public继承
- lightoj 1370 欧拉函数
A - Bi-shoe and Phi-shoe Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & % ...
- nefu 117 素数定理
小明是一个聪明的孩子,对数论有着很浓烈的兴趣.他发现求1到正整数10n 之间有多少个素数是一个很难的问题,该问题的难以决定于n 值的大小.现在的问题是,告诉你n的值,让你帮助小明计算小于10n的素数的 ...
- editplus-查找替换的正则表达式应用
editplus查找替换的正则表达式应用 表达式 说明 \t 制表符. \n 新行. . 匹配任意字符. | 匹配表达式左边和右边的字符. 例如, "ab|bc" 匹配 " ...
- win10下安装Ubuntu出现win10无法进入的情况
昨天晚上在win10上安装Ubuntu Kylin16.04系统,结果发现重启的时候进不去windows系统了,而且报的错误是 /EndEntire file path: /ACPI(a0341d,0 ...
- Casually have a look
1. 用红盘子吃饭能助你减肥.教授告诉我们:“红色是一种原始的危险信号,它同时也会使盘中的食物看上去不那么诱人,所以你也会吃得更少.” 2. 要减肥请关电视.教授说:“如果你需要减肥,请在吃饭时把电视 ...
- springmvc使用RSA算法加密表单
今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以 ...
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2271 Solved: 935[Submit][Stat ...