Huffman树、霍夫曼编码
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
Huffman树、霍夫曼编码的更多相关文章
- 哈夫曼(Huffman)树+哈夫曼编码
前天acm实验课,老师教了几种排序,抓的一套题上有一个哈夫曼树的题,正好之前离散数学也讲过哈夫曼树,这里我就结合课本,整理一篇关于哈夫曼树的博客. 主要摘自https://www.cnblogs.co ...
- 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)
哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...
- 霍夫曼编码(Huffman Coding)
霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...
- Java数据结构(十二)—— 霍夫曼树及霍夫曼编码
霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...
- 采用霍夫曼编码(Huffman)画出字符串各字符编码的过程并求出各字符编码 --多媒体技术与应用
题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...
- 霍夫曼编码(Huffman)
题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...
- 基于python的二元霍夫曼编码译码详细设计
一.设计题目 对一幅BMP格式的灰度图像(个人证件照片)进行二元霍夫曼编码和译码 二.算法设计 (1)二元霍夫曼编码: ①:图像灰度处理: 利用python的PIL自带的灰度图像转换函数,首先将彩色图 ...
- [算法]Huffman树(哈夫曼树)
目录 一.关于Huffman树 二.具体实现 例1:P1090 合并果子 例2:P2168 [NOI2015]荷马史诗 一.关于Huffman树 Huffman树(哈夫曼树)可以解决下述问题: 一颗\ ...
- Huffman Coding 哈夫曼编码
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4096079.html 使用优先队列实现,需要注意以下几点: 1.在使用priority_qu ...
随机推荐
- SpringBoot 对IBM MQ进行数据监听接收以及数据发送
一.需求介绍 后端使用Spring Boot2.0框架,要实现IBM MQ的实时数据JMS监听接收处理,并形成回执通过MQ队列发送. 二.引入依赖jar包 <dependency> < ...
- 微信小程序在组件中获取界面上的节点信息wx.createSelectorQuery
节点信息查询 API 可以用于获取节点属性.样式.在界面上的位置等信息. 最常见的用法是使用这个接口来查询某个节点的当前位置,以及界面的滚动位置. 示例代码: const query = wx.cre ...
- Web API与MVC控制器的区别
Web API属于ASP.NET核心平台的一部分,它利用MVC框架的底层功能方便我们快速的开发部署WEB服务.我们可以在常规MVC应用通过添加API控制器来创建web api服务,普通MVC应用程序控 ...
- Oracle学习笔记:ASCII码转换(chr和ascii函数)
今天get到一个骚操作,通过ascii码转换之后来进行互换编码的. select chr(ascii('f') + ascii('m') - ascii('a')) from dual; 有必要对as ...
- 09 redis中布隆过滤器的使用
我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容.问题来了,新闻客户端推荐系统如何实现推送去重的? 会想到服务器记录了用户看过的所有历史记录,当推 ...
- linux 目录结构及VIM
目录结构及VIM 文件系统 说明: 文件系统就是操作管理存储设备或分区上的文件的方法和数据结构,也就是存储设备上组织文件的方式. 操作系统中负责管理和存储文件信息的软件机构叫文件管理系统,简称为文件系 ...
- css三大特性及权重说明
一.三大特性简述 层叠性: 后来的覆盖前面的 (长江后浪推前浪) 继承性: 子标签会继承父标签的某些样式 (跟文字有关的一般都会继承) 优先级: 设计到一个算法“css特殊性(Specificity) ...
- react快速上手二(使用JSX语法)
前提: 下载依赖,配置 cnpm i babel-preset-react -D JSX语法的本质: 还是以 React.createElement 的形式来实现的,并没有直接把 用户写的 HTML代 ...
- 使用pycharm 编写代码 并在远程主机上运行
一 要求 远程主机有python解释器 二 在菜单栏,File -> Settings… -> Project ×× -> Project Interpreter,点击右侧 Add按 ...
- oracle内核参数详解
一.前言 在生产中,我们安装oracle数据库时,为达到最优我们需要对操作系统的内核参数进行一定的调整.主要从内存.cpu.io以及网络等方面,根据实际情况进行调整.以下参数可供大家参考,如有不当之处 ...