哈夫曼编码
根据数据出现的频率对数据进行编码,从而压缩原始数据。

例如对于一个文本文件,其中各种字符出现的次数如下:

a : 10
b : 20
c : 40
d : 80
可以将每种字符转换成二进制编码,例如将 a 转换为 00,b 转换为 01,c 转换为 10,d 转换为 11。这是最简单的一种编码方式,没有考虑各个字符的权值(出现频率)。而哈夫曼编码采用了贪心策略,使出现频率最高的字符的编码最短,从而保证整体的编码长度最短。

首先生成一颗哈夫曼树,每次生成过程中选取频率最少的两个节点,生成一个新节点作为它们的父节点,并且新节点的频率为两个节点的和。选取频率最少的原因是,生成过程使得先选取的节点位于树的更低层,那么需要的编码长度更长,频率更少可以使得总编码长度更少。

import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;public class hufman {
private class Node implements Comparable<Node>{char ch;int frequency;boolean isleaf;Node left;Node right;public Node(char a,int f) {ch=a;frequency=f;isleaf=true;}public Node(Node left,Node right,int frequency) {this.left=left;this.right=right;this.frequency=frequency;}@Overridepublic int compareTo(Node o) {// TODO Auto-generated method stubreturn this.frequency-o.frequency;}
}public Map<Character,String> encode(Map<Character,Integer> frquencyChar){PriorityQueue<Node> p=new PriorityQueue();for(char c:frquencyChar.keySet()) {p.add(new Node(c,frquencyChar.get(c)));}while(p.size()!=1) {Node n1=    p.poll();Node n2=  p.poll();p.add(new Node(n1,n2,n1.frequency+n2.frequency));}return Encode(p.poll());}public Map<Character,String> Encode(Node root){Map<Character,String> m=new HashMap();Encode(root,"",m);return m;}public void Encode(Node node,String a,Map<Character,String> m) {while(node.isleaf) {m.put(node.ch, a);return;}Encode(node.left,a+"0",m);Encode(node.right,a+"1",m);}}
man.java
import java.util.HashMap;
import java.util.Map;public class Teat {public static void main(String[] args) {// TODO Auto-generated method stubMap <Character,Integer> frquencyChar=new HashMap();frquencyChar.put('a', 1);frquencyChar.put('c', 19);frquencyChar.put('2', 13);frquencyChar.put('5', 14);hufman a=new hufman();Map<Character,String> b=a.encode(frquencyChar);for(char m:b.keySet()) {System.out.println(m+b.get(m));}}}

这是一个大根堆,所以重写了Node 对象中的compareTo 函数, 继承 Comparable 接口,
首先将字符与权重加入一个map中,我理解的是构建小根堆,这样每次都是最小的现出来。相加构成节点这个样子。
重写了函数之后,compare这个函数我觉得是》0 就要交换,<0 不交换,this.fre-o.fre>0 说明后来者小,进行交换。

PriorityQueue <Integer> maxHeap = new PriorityQueue<Integer>( new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {// TODO Auto-generated method stubreturn o2.compareTo(o1);}});

还可以 通过这个样子重写进行大根堆 小根堆变换。
https://blog.csdn.net/liou825/article/details/21322403
https://blog.csdn.net/zcf1784266476/article/details/68961473

哈夫曼编码之大根堆小根堆揭西县相关推荐

  1. 贪心算法之最小堆实现霍夫曼编码

    贪心算法之最小堆实现霍夫曼编码 实现之前需要学习的地方: 如果你不了解堆.堆的插入.堆的删除,可以先看下我前面几篇博客 http://blog.csdn.net/u011068702/article/ ...

  2. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  3. 哈夫曼树以及哈夫曼编码的构造步骤

    注意:哈夫曼树并不唯一,但带权路径长度一定是相同的. 第一部分;由给定结点构造哈夫曼树 (1)8个结点的权值大小如下: (2)从19,21,2,3,6,7,10,32中选择两个权小结点.选中2,3.同 ...

  4. 7-1 哈夫曼编码 (30分)

    文章目录 7-1 哈夫曼编码 (30分) 输入格式: 输出格式: 输入样例: 输出样例: 题解 代码 7-1 哈夫曼编码 (30分) 给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给 ...

  5. 20172311-哈夫曼编码测试

    20172311-哈夫曼编码测试 哈夫曼编码与哈夫曼树 哈夫曼树 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根 ...

  6. 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码

    一. 诞生原因 找出存放一串字符所需的最少的二进制编码. 二. 构造方法 首先统计出每种字符出现的频率,即:概率.权值. 例如:频率表 A:60,    B:45,   C:13   D:69   E ...

  7. 【数据结构】哈夫曼树与哈夫曼编码

    定义 带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值wkw_kwk​,从根节点到每个叶子结点的长度为lkl_klk​,则每个叶子结点的带权路径长度之和就是:WPLWPLWPL=∑ ...

  8. 贪心算法 - 哈夫曼编码 Huffman

    转载地址  :   http://blog.csdn.net/xuefeng0707/article/details/7844834 哈夫曼编码: 一种字符编码方式,常用于数据文件压缩.压缩率通常在2 ...

  9. 数据结构(哈夫曼树,哈夫曼编码)入门篇,JAVA实现

    什么是哈夫曼树 哈夫曼树就是一种最优判定树,举个例子,如下一个判断逻辑 if(s<60) g=1; else if(s<70) g=2 else if(s<80) g=3 else ...

最新文章

  1. Android App的启动过程
  2. Android Studio failed to resolve .....
  3. Linux 进程间通信:管道、共享内存、消息队列、信号量
  4. 帮助您快速开始下一个移动APP应用模板、UI设计
  5. 2020年度“博客之星”报名开启!万元大奖等着你
  6. 通过yum install 方式安装snmp包遇到的问题,gsk7bas64-7.0-4.44.x86_64 has missing libstdc++.so.*等
  7. [Python] 字典 items()方法:同时对字典的键和值进行遍历
  8. getting start with storm 翻译 第六章 part-4
  9. vscode 字体颜色变得花里胡哨的
  10. 飞腾服务器虚拟化,基于飞腾平台的容器虚拟化技术研究
  11. 前端三件套之CSS(二)
  12. 【项目实战】IPC摄像头在线状态ping检测与告警邮件发送项目总结
  13. 直播系统app源码,简洁好看的登录页面
  14. 【JavaScript 逆向】极验四代无感验证码逆向分析
  15. HBase数据大批量导入方式总结和对比
  16. 报错Duplicate entry ‘值‘ for key ‘字段名‘的解决解决方法
  17. springcloud-netfilx(Eureka)服务注册
  18. All In One - 第3章 安全工程
  19. java爬虫学习——第一节 HttpClient使用
  20. Words for Windows

热门文章

  1. Ansible之使用角色一键部署httpd并检查部署结果
  2. 关于mysql行级锁中MVCC的一些理解
  3. BZOJ4810: [Ynoi2017]由乃的玉米田
  4. Lucene——Field.Store(存储域选项)及Field.Index(索引选项)
  5. tensorflow 之 tf.reshape 之 -1
  6. 为什么用C而不用C++
  7. 手机开机画面制作工具(LogoBuilder)
  8. Android之NDK开发
  9. WinCE启动失败的原因与解决办法分析
  10. VC socket api使用引入