Huffman树指的是带权路径长度WPL最小的二叉树

WPL=路径*权值

Huffman常用于压缩编码,正常传输ABCDEF这些字母需要3位二进制树来描述,但由于一篇文章中ABCDEF这些字母出现的概率不同,用较多的二进制位数表示出现概率低的字母,而用较少的二进制位数表示概率高的字母。

Huffman编码实现:

package HuffmanTree;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue; import javax.xml.crypto.Data; //Huffman树压缩
public class HuffmanTree<T>{ public static Map<Object, String> map=new HashMap<Object,String>(); //创建Huffman树
public static <T> Node<T> createTree(List<Node<T>> nodes) {
while (nodes.size() > 1) {
Collections.sort(nodes);
Node<T> left = nodes.get(nodes.size() - 1);
Node<T> right = nodes.get(nodes.size() - 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);
} //保存Huffman树
public static <T> List<Node<T>> breath(Node<T> root) {
List<Node<T>> list = new ArrayList<Node<T>>();
Queue<Node<T>> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
Node<T> pNode = queue.poll();
list.add(pNode);
if (pNode.getLeft() != null) {
queue.add(pNode.getLeft());
}
if (pNode.getRight() != null) {
queue.add(pNode.getRight());
}
}
return list;
} //编码
public static<T> void encoding(Node<T> node,String str)
{
if(node==null)
{
return;
}
if(node.getLeft()==null&&node.getRight()==null)
{
// System.out.println(node.getData()+":"+str);
map.put(node.getData(),str);
return;
}
encoding(node.getLeft(), str+"0");
encoding(node.getRight(), str+"1");
}
} //二叉树结点
class Node <T> implements Comparable<Node<T>>{ private T data;
private int weight;
private Node<T> left;
private Node<T> right; public Node(T data, int weight) {
this.data = data;
this.weight = weight;
} @Override
public String toString() {
// TODO Auto-generated method stub
return "data:" + this.data + ",weight:" + this.weight + "; ";
} @Override
public int compareTo(Node<T> o) {
// TODO Auto-generated method stub
if (o.weight > this.weight) {
return 1;
} else if (o.weight < this.weight) {
return -1;
}
return 0;
} 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;
}
}

测试:

package HuffmanTree;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; public class App { public static void main(String[] args) {
// TODO Auto-generated method stub
List<Node<String>> nodes = new ArrayList<Node<String>>();
nodes.add(new Node<String>("A", 27));
nodes.add(new Node<String>("B", 8));
nodes.add(new Node<String>("C", 15));
nodes.add(new Node<String>("D", 15));
nodes.add(new Node<String>("E", 30));
nodes.add(new Node<String>("F", 5));
Node<String> root = HuffmanTree.createTree(nodes);
HuffmanTree<String> h=new HuffmanTree<String>();
h.encoding(root, "");
Iterator<Entry<Object, String>> entries = HuffmanTree.map.entrySet().iterator();
String string="";
while (entries.hasNext()) {
Entry<Object, String> entry = entries.next();
string+=entry.getValue();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
System.out.println("ABCDEF的编码为:"+string);
}
}

结果:

Key = A, Value = 01
Key = B, Value = 1001
Key = C, Value = 00
Key = D, Value = 101
Key = E, Value = 11
Key = F, Value = 1000
ABCDEF的编码为:01100100101111000

最新文章

  1. Javascript基础回顾 之(二) 作用域
  2. mySql 基本语法学习笔记
  3. doctype声明的重要性-------这绝对是ie的坑, 与angular无关, 我错怪你啦
  4. 尝试打开或创建物理文件 REATE FILE 遇到操作系统错误 5(拒绝访问)
  5. Matlab中@与函数调用
  6. [HIve - LanguageManual] Sort/Distribute/Cluster/Order By
  7. 2015 11 26 java 配置环境变量
  8. App Store&#160;升级问题
  9. MySQL &#39;localhost&#39; (10061)解决方法
  10. 记一次SQL性能优化,查询时间从4000ms优化到200ms.
  11. php插入上万条mysql数据最快的方法
  12. 嵌入式linux查看磁盘占用情况df -h
  13. elasticsearch 不同集群数据同步
  14. mysql 、慢查询、到底如何玩
  15. linux及安全第三周总结——20135227黄晓妍
  16. 【Network Architecture】Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning(转)
  17. [转]自己做 Visual Studio 2013 代码折叠插件
  18. webapp前端性能优化规范
  19. 第一次用python编写的小程序
  20. JQuery设置checkbox选中或取消等相关操作

热门文章

  1. abstract class 与 interface
  2. 关于@service、@controller和@transactional 在spring中的位置说明
  3. 怎样获取当前文档所有的元素节点(即html标签节点)
  4. 9-MySQL DBA笔记-测试实践
  5. WebApi 空项目生成帮助文档
  6. python 读取文件行
  7. 给datagrid一列中的数据加上单位
  8. C++ STL 之 函数对象
  9. mysql in 中使用子查询,会不使用索引而走全表扫描
  10. vue项目前端限制页面长时间未操作超时退出到登录页