思路:
  1. 构建小根堆
  2. 根据小根堆实现哈夫曼树
  3. 根据哈夫曼树对数据进行编码
代码实现如下:
/**
* @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使用优先级队列实现哈夫曼编码的更多相关文章

  1. java实现哈夫曼编码

    java实现哈夫曼编码 哈夫曼树   既然是学习哈夫曼编码,我们首先需要知道什么是哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫 ...

  2. Java实现哈夫曼编码和解码

    最近无意中想到关于api返回值加密的问题,譬如我们的api需要返回一些比较敏感或者重要不想让截获者得到的信息,像如果是做原创图文的,文章明文返回的话则有可能被抓包者窃取. 关于请求时加密的方式比较多, ...

  3. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

    20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...

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

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

  5. Java 树结构实际应用 二(哈夫曼树和哈夫曼编码)

     赫夫曼树 1 基本介绍 1) 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), ...

  6. java 哈夫曼编码

    //哈夫曼树类 public class HaffmanTree { //最大权值 ; int nodeNum ; //叶子结点个数 public HaffmanTree(int n) { this. ...

  7. 04-树6. Huffman Codes--优先队列(堆)在哈夫曼树与哈夫曼编码上的应用

    题目来源:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%916 In 1953, David A. Huffman published his pap ...

  8. 2018.2.14 Java中的哈夫曼编码

    概念 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造 ...

  9. 10: java数据结构和算法: 构建哈夫曼树, 获取哈夫曼编码, 使用哈夫曼编码原理对文件压缩和解压

    最终结果哈夫曼树,如图所示: 直接上代码: public class HuffmanCode { public static void main(String[] args) { //获取哈夫曼树并显 ...

随机推荐

  1. 细讲递归(recursion)

    首先先对递归进行入门. 递归是以自相似的方式重复项目的过程.在编程语言中,如果程序允许您在同一函数内调用函数,则称其为函数的递归调用. 简而言之,递归就是函数的自身调用.可以看看下面的递归使用: vo ...

  2. 020-pom.xml配置文件模板

    1 Maven 整合SSH框架之pom.xml 1 版本一 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: ...

  3. Video 视频播放防作弊和禁止下载

    1.实现效果 - 查看源码 实现视频可播放不能下载,禁止右键下载.F12源码打开链接下载 实现只在当前窗口播放,切换窗口.窗口最小化.窗口被遮挡停止播放,恢复后继续播放 在线demo:缓存完再播放 . ...

  4. 【Ionic】---Using Local Notifications In Your Ionic Framework App

    Using Local Notifications In Your Ionic Framework App 配置好ng-cordova先 <script src="lib/ngCord ...

  5. grunt项目构建

    最近想把项目里添加grunt,说白了就是前端自动化管理,具体配置如下: 用到以下几个部件: grunt-contrib-cssmin grunt-contrib-uglify grunt-contri ...

  6. Javascript 学习 Boolean

    构造函数 new Boolean(value) //构造函数 Boolean(value) //转换函数 参数 value 由布尔对象存放的值或者要转换成布尔值的值 返回值 当作为一个构造函数(带有运 ...

  7. npm下载某个版本

    如果我想要引入的是Jquery的1.7.2版本,则输入npm intall jquery@1.7.2,那么npm包管理器就会帮助你下载jquery1.7.2的版本到你当前操作目录下的node_modu ...

  8. ArcGIS数据存储的方式

    工作空间文件夹和地理数据库为存储和管理ArcGIS地理信息提供了主要容器.工作空间文件夹只是磁盘上的普通文件夹,它可保存大量的文件地理数据库.个人地理数据库.基于文件的数据集以及一系列ArcGIS文档 ...

  9. AOSP 源码下载

    网上关于这块大部分教程都是无效的,因为墙的缘故,无法使用官方提供的下载链接,我这里使用了清华大学的镜像,是能够顺利将 AOSP 下载下来.如果你还没有安装 Ubuntu,请看<VirtualBo ...

  10. MySQL入门很简单: 11 mysql函数

    1. 数学函数 2. 字符串函数 3. 日期和时间函数 4. 条件判断函数 IF(expr, v1, v2) // 如果表达式expr成立,返回结果v1,否则返回v2: IFNULL(v1, v2) ...