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

WPL=路径*权值

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

Huffman编码实现:

  1. package HuffmanTree;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.HashMap;
  6. import java.util.LinkedList;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Queue;
  10.  
  11. import javax.xml.crypto.Data;
  12.  
  13. //Huffman树压缩
  14. public class HuffmanTree<T>{
  15.  
  16. public static Map<Object, String> map=new HashMap<Object,String>();
  17.  
  18. //创建Huffman树
  19. public static <T> Node<T> createTree(List<Node<T>> nodes) {
  20. while (nodes.size() > 1) {
  21. Collections.sort(nodes);
  22. Node<T> left = nodes.get(nodes.size() - 1);
  23. Node<T> right = nodes.get(nodes.size() - 2);
  24. Node<T> parent = new Node<T>(null, left.getWeight()
  25. + right.getWeight());
  26. parent.setLeft(left);
  27. parent.setRight(right);
  28. nodes.remove(left);
  29. nodes.remove(right);
  30. nodes.add(parent);
  31. }
  32. return nodes.get(0);
  33. }
  34.  
  35. //保存Huffman树
  36. public static <T> List<Node<T>> breath(Node<T> root) {
  37. List<Node<T>> list = new ArrayList<Node<T>>();
  38. Queue<Node<T>> queue = new LinkedList<>();
  39. queue.add(root);
  40. while (!queue.isEmpty()) {
  41. Node<T> pNode = queue.poll();
  42. list.add(pNode);
  43. if (pNode.getLeft() != null) {
  44. queue.add(pNode.getLeft());
  45. }
  46. if (pNode.getRight() != null) {
  47. queue.add(pNode.getRight());
  48. }
  49. }
  50. return list;
  51. }
  52.  
  53. //编码
  54. public static<T> void encoding(Node<T> node,String str)
  55. {
  56. if(node==null)
  57. {
  58. return;
  59. }
  60. if(node.getLeft()==null&&node.getRight()==null)
  61. {
  62. // System.out.println(node.getData()+":"+str);
  63. map.put(node.getData(),str);
  64. return;
  65. }
  66. encoding(node.getLeft(), str+"0");
  67. encoding(node.getRight(), str+"1");
  68. }
  69. }
  70.  
  71. //二叉树结点
  72. class Node <T> implements Comparable<Node<T>>{
  73.  
  74. private T data;
  75. private int weight;
  76. private Node<T> left;
  77. private Node<T> right;
  78.  
  79. public Node(T data, int weight) {
  80. this.data = data;
  81. this.weight = weight;
  82. }
  83.  
  84. @Override
  85. public String toString() {
  86. // TODO Auto-generated method stub
  87. return "data:" + this.data + ",weight:" + this.weight + "; ";
  88. }
  89.  
  90. @Override
  91. public int compareTo(Node<T> o) {
  92. // TODO Auto-generated method stub
  93. if (o.weight > this.weight) {
  94. return 1;
  95. } else if (o.weight < this.weight) {
  96. return -1;
  97. }
  98. return 0;
  99. }
  100.  
  101. public T getData() {
  102. return data;
  103. }
  104.  
  105. public void setData(T data) {
  106. this.data = data;
  107. }
  108.  
  109. public int getWeight() {
  110. return weight;
  111. }
  112.  
  113. public void setWeight(int weight) {
  114. this.weight = weight;
  115. }
  116.  
  117. public Node<T> getLeft() {
  118. return left;
  119. }
  120.  
  121. public void setLeft(Node<T> left) {
  122. this.left = left;
  123. }
  124.  
  125. public Node<T> getRight() {
  126. return right;
  127. }
  128.  
  129. public void setRight(Node<T> right) {
  130. this.right = right;
  131. }
  132. }

测试:

  1. package HuffmanTree;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Map.Entry;
  8.  
  9. public class App {
  10.  
  11. public static void main(String[] args) {
  12. // TODO Auto-generated method stub
  13. List<Node<String>> nodes = new ArrayList<Node<String>>();
  14. nodes.add(new Node<String>("A", 27));
  15. nodes.add(new Node<String>("B", 8));
  16. nodes.add(new Node<String>("C", 15));
  17. nodes.add(new Node<String>("D", 15));
  18. nodes.add(new Node<String>("E", 30));
  19. nodes.add(new Node<String>("F", 5));
  20. Node<String> root = HuffmanTree.createTree(nodes);
  21. HuffmanTree<String> h=new HuffmanTree<String>();
  22. h.encoding(root, "");
  23. Iterator<Entry<Object, String>> entries = HuffmanTree.map.entrySet().iterator();
  24. String string="";
  25. while (entries.hasNext()) {
  26. Entry<Object, String> entry = entries.next();
  27. string+=entry.getValue();
  28. System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
  29. }
  30. System.out.println("ABCDEF的编码为:"+string);
  31. }
  32. }

结果:

  1. Key = A, Value = 01
  2. Key = B, Value = 1001
  3. Key = C, Value = 00
  4. Key = D, Value = 101
  5. Key = E, Value = 11
  6. Key = F, Value = 1000
  7. ABCDEF的编码为:01100100101111000

Huffman树、霍夫曼编码的更多相关文章

  1. 哈夫曼(Huffman)树+哈夫曼编码

    前天acm实验课,老师教了几种排序,抓的一套题上有一个哈夫曼树的题,正好之前离散数学也讲过哈夫曼树,这里我就结合课本,整理一篇关于哈夫曼树的博客. 主要摘自https://www.cnblogs.co ...

  2. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  3. 霍夫曼编码(Huffman Coding)

    霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...

  4. Java数据结构(十二)—— 霍夫曼树及霍夫曼编码

    霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...

  5. 采用霍夫曼编码(Huffman)画出字符串各字符编码的过程并求出各字符编码 --多媒体技术与应用

    题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...

  6. 霍夫曼编码(Huffman)

    题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...

  7. 基于python的二元霍夫曼编码译码详细设计

    一.设计题目 对一幅BMP格式的灰度图像(个人证件照片)进行二元霍夫曼编码和译码 二.算法设计 (1)二元霍夫曼编码: ①:图像灰度处理: 利用python的PIL自带的灰度图像转换函数,首先将彩色图 ...

  8. [算法]Huffman树(哈夫曼树)

    目录 一.关于Huffman树 二.具体实现 例1:P1090 合并果子 例2:P2168 [NOI2015]荷马史诗 一.关于Huffman树 Huffman树(哈夫曼树)可以解决下述问题: 一颗\ ...

  9. Huffman Coding 哈夫曼编码

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4096079.html 使用优先队列实现,需要注意以下几点: 1.在使用priority_qu ...

随机推荐

  1. SpringBoot 对IBM MQ进行数据监听接收以及数据发送

    一.需求介绍 后端使用Spring Boot2.0框架,要实现IBM MQ的实时数据JMS监听接收处理,并形成回执通过MQ队列发送. 二.引入依赖jar包 <dependency> < ...

  2. 微信小程序在组件中获取界面上的节点信息wx.createSelectorQuery

    节点信息查询 API 可以用于获取节点属性.样式.在界面上的位置等信息. 最常见的用法是使用这个接口来查询某个节点的当前位置,以及界面的滚动位置. 示例代码: const query = wx.cre ...

  3. Web API与MVC控制器的区别

    Web API属于ASP.NET核心平台的一部分,它利用MVC框架的底层功能方便我们快速的开发部署WEB服务.我们可以在常规MVC应用通过添加API控制器来创建web api服务,普通MVC应用程序控 ...

  4. Oracle学习笔记:ASCII码转换(chr和ascii函数)

    今天get到一个骚操作,通过ascii码转换之后来进行互换编码的. select chr(ascii('f') + ascii('m') - ascii('a')) from dual; 有必要对as ...

  5. 09 redis中布隆过滤器的使用

    我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容.问题来了,新闻客户端推荐系统如何实现推送去重的? 会想到服务器记录了用户看过的所有历史记录,当推 ...

  6. linux 目录结构及VIM

    目录结构及VIM 文件系统 说明: 文件系统就是操作管理存储设备或分区上的文件的方法和数据结构,也就是存储设备上组织文件的方式. 操作系统中负责管理和存储文件信息的软件机构叫文件管理系统,简称为文件系 ...

  7. css三大特性及权重说明

    一.三大特性简述 层叠性: 后来的覆盖前面的 (长江后浪推前浪) 继承性: 子标签会继承父标签的某些样式 (跟文字有关的一般都会继承) 优先级: 设计到一个算法“css特殊性(Specificity) ...

  8. react快速上手二(使用JSX语法)

    前提: 下载依赖,配置 cnpm i babel-preset-react -D JSX语法的本质: 还是以 React.createElement 的形式来实现的,并没有直接把 用户写的 HTML代 ...

  9. 使用pycharm 编写代码 并在远程主机上运行

    一 要求 远程主机有python解释器 二 在菜单栏,File -> Settings… -> Project ×× -> Project Interpreter,点击右侧 Add按 ...

  10. oracle内核参数详解

    一.前言 在生产中,我们安装oracle数据库时,为达到最优我们需要对操作系统的内核参数进行一定的调整.主要从内存.cpu.io以及网络等方面,根据实际情况进行调整.以下参数可供大家参考,如有不当之处 ...