思路:
  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. IBM-内存管理内幕 动态分配的选择、折衷和实现

    https://www.ibm.com/developerworks/cn/linux/l-memory/ 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一.在很多脚本语言中,您不必担心内存 ...

  2. Git提交代码到主分区

    git 提交代码,本地新建一个my分支,不从本地master分支直接上传,而是先从本地my分支上提交至本地master分支,然后本地master提交至远程master分支 上.前提是远程只有一个mas ...

  3. vue学习第四天 ------ 临时笔记

    1.驼峰写法 在html标签中,由于html的特性是不区分大小写(比如LI和li是一样的),因此,html标签中要传递的值要写成短横线式的(如btn-test),以区分大小写. 在props的数组中, ...

  4. Spring文件上传Demo

    package com.smbea.controller; import java.io.File; import java.io.FileOutputStream; import java.io.I ...

  5. AOSP 源码下载

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

  6. 【起航计划 011】2015 起航计划 Android APIDemo的魔鬼步伐 10 App->Activity->Reorder Activities 后退栈 Intent FLAG

    Reorder Activities 示例有四个相关的Activitives: ReorderOnLaunch, ReorderTwo,ReorderThree, ReorderFour.其中Reor ...

  7. 【起航计划 005】2015 起航计划 Android APIDemo的魔鬼步伐 04 App->Activity->Custom Dialog Dialog形式的Activity,Theme的使用,Shape的使用

    App->Activity->Custom Dialog 例子使用Activity 来实现自定义对话框 类CustomDialogActivity本身无任何特别之处.关键的一点是其在And ...

  8. ansible测试环境

    ip user sudo_user port usage 192.168.48.81 ansible root 29922 nagios & ansible control 192.168.4 ...

  9. bootstrap-table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)

    1.bootstrap-table 单击单行选中 $('#gzrwTable').on('click-row.bs.table', function(e, row, $element) { $('.s ...

  10. MyEclipse 相关配置操作、问题处理及快捷键说明

    MyEclipse傻瓜式安装不做介绍,试用期结束后破解操作见博客:MyEclipse 2014 破解补丁及激活步骤 以下为安装完MyEclipse后一般需要进行的一些配置,写来自己参考用.比较简陋,望 ...