java使用优先级队列实现哈夫曼编码
思路:
- 构建小根堆
- 根据小根堆实现哈夫曼树
- 根据哈夫曼树对数据进行编码
代码实现如下:
/**
* @Author: DaleyZou
* @Description: 使用java实现一个哈夫曼编码的小程序
* @Date: Created in 19:45 2018-9-27
* @Modified By:
*/
public class HuffmanCode {
private class Node implements Comparable<Node>{
char ch; // 字符
int freq; // 权值
boolean isLeaf; // 是否是叶子节点
Node left, right; // 父节点的左节点和右节点
// 初始化一个带权值的叶子节点
public Node(char ch, int freq){
this.ch = ch;
this.freq = freq;
this.isLeaf = true;
}
// 构建一个节点,带左右节点
public Node(Node left, Node right, int freq){
this.left = left;
this.right = right;
this.freq = freq;
this.isLeaf = false;
}
@Override
public int compareTo(Node node) {
return this.freq - node.freq;
}
}
// 构建一颗哈夫曼树
public Map<Character, String> encode(Map<Character, Integer> frequencyForChar){
PriorityQueue<Node> priorityQueue = new PriorityQueue<>();
for (Character ch : frequencyForChar.keySet()){
priorityQueue.add(new Node(ch,frequencyForChar.get(ch)));
}
while (priorityQueue.size() != 1){ // 构建小根堆
Node left = priorityQueue.poll();
Node right = priorityQueue.poll();
priorityQueue.add(new Node(left, right, left.freq + right.freq));
}
return encode(priorityQueue.poll());
}
public Map<Character, String> encode(Node root){
HashMap<Character, String> hashMap = new HashMap<>();
encode(root, "", hashMap);
return hashMap;
}
public void encode(Node root, String encoding, HashMap<Character,String> hashMap) {
if (root.isLeaf){ // 已经到叶子节点,递归结束
hashMap.put(root.ch, encoding);
return;
}
encode(root.left, encoding + "0" ,hashMap); // 编码左节点
encode(root.right, encoding + "1", hashMap); // 编码右节点
}
// 测试结果是否正确
public static void main(String[] args){
Map<Character, Integer> frequencyForChar = new HashMap<>();
frequencyForChar.put('a', 10);
frequencyForChar.put('b', 20);
frequencyForChar.put('c', 40);
frequencyForChar.put('d', 80);
HuffmanCode huffmanCode = new HuffmanCode();
Map<Character, String> encode = huffmanCode.encode(frequencyForChar);
for (Character ch : encode.keySet()){
System.out.println(ch + " : " + encode.get(ch));
}
}
}
java使用优先级队列实现哈夫曼编码的更多相关文章
- java实现哈夫曼编码
java实现哈夫曼编码 哈夫曼树 既然是学习哈夫曼编码,我们首先需要知道什么是哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫 ...
- Java实现哈夫曼编码和解码
最近无意中想到关于api返回值加密的问题,譬如我们的api需要返回一些比较敏感或者重要不想让截获者得到的信息,像如果是做原创图文的,文章明文返回的话则有可能被抓包者窃取. 关于请求时加密的方式比较多, ...
- 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码
20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...
- Java数据结构(十二)—— 霍夫曼树及霍夫曼编码
霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...
- Java 树结构实际应用 二(哈夫曼树和哈夫曼编码)
赫夫曼树 1 基本介绍 1) 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), ...
- java 哈夫曼编码
//哈夫曼树类 public class HaffmanTree { //最大权值 ; int nodeNum ; //叶子结点个数 public HaffmanTree(int n) { this. ...
- 04-树6. Huffman Codes--优先队列(堆)在哈夫曼树与哈夫曼编码上的应用
题目来源:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%916 In 1953, David A. Huffman published his pap ...
- 2018.2.14 Java中的哈夫曼编码
概念 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造 ...
- 10: java数据结构和算法: 构建哈夫曼树, 获取哈夫曼编码, 使用哈夫曼编码原理对文件压缩和解压
最终结果哈夫曼树,如图所示: 直接上代码: public class HuffmanCode { public static void main(String[] args) { //获取哈夫曼树并显 ...
随机推荐
- 案例51-crm练习新增客户使用数据字典和ajax
1 案例效果 2 使用ajax加载数据字典下拉选-后台部分 1 domain部分-BaseDict package www.test.domain; public class BaseDict { / ...
- HDU 5340——Three Palindromes——————【manacher处理回文串】
Three Palindromes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- accecc2010入门,语文
accecc2010入门 数据库:存放数据并处理的仓库. access2010数据库(扩展名为accdb,改名时不能删扩展名): 1,功能区:代替了菜单栏和工具栏的功能,不用四处查找命令.在窗口下的顶 ...
- CefSharp High DPI问题的解决
使用CefSharp控件,在部分高分辨率的电脑中(显示缩放比例非100%,而是120%或者125%等)会出现以下一些情况: 显示的页面中出现了黑边,且按钮定位也偏了,比如点击[图层]按钮,需要点击上面 ...
- 动态计算UITableViewCell高度详解 (转)
感觉挺有用的一篇文章,分析了4种解决方案.回头测试之.如果有别的方案,我会在后面补上. 原文地址:http://www.ifun.cc/blog/2014/02/21/dong-tai-ji-suan ...
- 浅谈JavaScript原型
在JavaScript中,所有函数都会拥有一个叫做prototype的属性,默认初始值为“空”对象(没有自身属性的对象). 1.原型属性 如下所示,简单地定义一个函数: function foo(a, ...
- css 两大特性:继承性和层叠性
css 有两大特性: 继承性和层叠性, 继承性 面向对象语言都会存在继承的概念,在面向对象的语言中,继承的特点:继承了父类的属性和方法.那么我们现在主要研究css,css中没有方法,所以我们仅仅继承属 ...
- 处理移动端自适应布局的方法- calc()与vw
在处理移动端自适应布局时,目前前端最流行的方法应该就是使用媒体查询,来设置HTML的字体大小,然后用rem为单位对Dom的宽高进行设置,这个方法的优势在于兼容性方面很好,劣势则在于当前市场上不同的机型 ...
- adb使用wifi无线连接调试Android设备
先上官方原文: Wireless usage adb is usually used over USB. However, it is also possible to use over Wi-Fi, ...
- Canvas 中drawImage 绘制不出图片
在使用Canvas的drawImage绘制图片时,却发现绘制不出图片,原因是图片是异步加载,图片加载完再绘制. //html <img src="1.png" /> & ...