博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
哈夫曼编码算法实现
阅读量:3952 次
发布时间:2019-05-24

本文共 2362 字,大约阅读时间需要 7 分钟。

package juc;import lombok.ToString;import java.util.HashMap;import java.util.Map;import java.util.PriorityQueue;/** * @Author lyr * @create 2020/10/28 19:43 */public class Main {
/** * @param args */ public static void main(String[] args) {
// TODO Auto-generated method stub System.out.println("hello world"); double[] p = {
0.35, 0.1, 0.2, 0.2, 0.15}; char[] q = {
'a', 'b', 'c', 'd', '-'}; PriorityQueue
pq = new PriorityQueue<>((node1, node2) -> {
int x = Double.compare(node1.freq,node2.freq); if (x!=0) return x; //按照字典序排序 return Character.compare(node1.value,node2.value); }); for (int i = 0; i < p.length; ++i) {
double freq = p[i]; char value = q[i]; Node node = new Node(value, freq); node.isLeaf = true; pq.offer(node); } while (pq.size() > 1) {
Node min1 = pq.poll(); Node min2 = pq.poll(); double freq = min1.freq + min2.freq; Node root = new Node('&', freq); root.left = min1; root.right = min2; pq.offer(root); } //pq.size() ==1 Node root = pq.poll(); Map
map = printCode(new HashMap<>(),root,""); // System.out.println(map); map.forEach((node, code) ->{
System.out.println(node.value +"="+code); }); } static Map
printCode(Map
map, Node node, String parentCode) {
if(node == null) return map; if (node.isLeaf) {
map.put(node,parentCode); } printCode(map,node.left,parentCode+"0"); printCode(map,node.right,parentCode+"1"); return map; } @ToString static class Node {
double freq; Node left; Node right; char value; boolean isLeaf; @Override public int hashCode() {
int result; long temp; temp = Double.doubleToLongBits(freq); result = (int) (temp ^ (temp >>> 32)); result = 31 * result + (int) value; return result; } Node(char value, double freq) {
this.freq = freq; this.value = value; } }}

转载地址:http://auyzi.baihongyu.com/

你可能感兴趣的文章
DFRduino Nano4.0介绍及原理图
查看>>
linux板级内存管理之-物理内存描述的两种实现方法
查看>>
App 调试的几个命令实践
查看>>
“独裁”的张小龙和他的微信帝国诞生记
查看>>
linux-arm中断系统之GIC
查看>>
Linux time subsystem 详解(1) ----概述
查看>>
大牛很通俗地介绍《信号与系统》
查看>>
执行程序(例如UltraEdit)在WIN7下添加到右键菜单
查看>>
flash and root your Nexus10
查看>>
深入学习Make命令和Makefile(上)(2)
查看>>
深入学习Make命令和Makefile(下)(2)
查看>>
示波器基础系列之四——关于示波器的触发功能(下篇)
查看>>
10大玄机为你揭开炒土豆丝爽脆的秘密——尖椒土豆丝
查看>>
grep与正则表达式
查看>>
git patch 使用
查看>>
如何进行Linux Kernel 开发
查看>>
技术人攻略访谈二十九:平行世界守护者
查看>>
制作initramfs/initrd镜像
查看>>
浅析busybox查找命令和调用相应命令函数的实现流程框架
查看>>
利用linux dd和tr命令生成特定的数据
查看>>