当前位置: 首页 > news >正文

用Java实现Huffman编码

文章目录

  • 前言
  • 一、实现思路
  • 二、准备Huffman结点
  • 三、主要实现


前言

在使用http1.1协议传输数据的时候,会有一些固定的字段,比如cookie、编码方式、接收的数据类型,另外会有一些大量重复的字段造成请求报文过于冗长,为了解决这个问题,在http2.0的时候,采用了二进制对请求报文进行编码,同时客户端和服务端维护一张静态表和静态表,对我们的请求报文进行二进制编码,同时采用Huffman编码进行压缩。

Huffman编码是一种编码方式,对出现频次更高的字段采取更短的编码,Huffman编码要求每个字符的编码不能是其他字符编码的前缀,这篇文章就是准备记录一下用Java实现Huffman编码。

一、实现思路

将出现的字符和字符出现的频次一一映射,将所有字符放进优先队列,优先队列的堆顶存放的是频次最小的字符,弹出频次最小的的两个字符,申请一个新的根节点,新的根节点左子结点是最小频次的字符,右子结点是第二小频次的字符,频次为左子节点和右子结点频次的和,将新结点加入优先队列重复上述过程
在这里插入图片描述

二、准备Huffman结点

public class Node {//编码字符private char data;//频次private int freq;//左子节点private Node left;//右子节点private Node right;
}

三、主要实现

public static void main(String[] args) {char[] charArray = { 'a', 'b', 'c', 'd', 'e', 'f' };int[] charFreq = { 45, 13, 12, 16, 9, 5 };PriorityQueue<Node> priorityQueue = new PriorityQueue<>(6, new Comparator<Node>() {@Overridepublic int compare(Node o1, Node o2) {return o1.getFreq() - o2.getFreq();}});for (int i = 0; i < 6; i++) {Node node = new Node();node.setData(charArray[i]);node.setFreq(charFreq[i]);priorityQueue.add(node);}Node root = null;while (priorityQueue.size() > 1) {Node newNode = new Node();Node left = priorityQueue.peek();newNode.setLeft(left);priorityQueue.poll();Node right = priorityQueue.peek();newNode.setRight(right);priorityQueue.poll();newNode.setFreq(left.getFreq() + right.getFreq());root = newNode;priorityQueue.add(newNode);}printCode(root, "");}public static void printCode(Node root, String code) {if (root.getLeft() == null && root.getRight() == null && Character.isLetter(root.getData())) {System.out.println(root.getData() + ": " + code);return;}printCode(root.getLeft(), code + "0");printCode(root.getRight(), code + "1");}//运行结果//a: 0//c: 100//b: 101//f: 1100//e: 1101//d: 111

http://www.lryc.cn/news/145505.html

相关文章:

  • day-04 基于UDP的服务器端/客户端
  • FFmpeg rtp rtp_mpegts的区别
  • 【链表OJ】相交链表 环形链表1
  • DevOps之自动化测试
  • Java 程序打印 OpenCV 的版本
  • ChatGPT⼊门到精通(2):ChatGPT 能为我们做什么
  • 线程和进程的区别是什么?
  • 力扣27.移除元素
  • 指针(个人学习笔记黑马学习)
  • vue 路由动态加载
  • 电脑识别不了固态硬盘怎么办?
  • QCustomPlot 绘制卡顿问题
  • uni-app开发小程序,radio单选按钮,点击可以选中,再次点击可以取消
  • 【Qt专栏】实现单例程序,禁止程序多开的几种方式
  • 力扣26. 删除有序数组中的重复项
  • 【机器学习】鸢尾花分类-逻辑回归示例
  • Flink CDC介绍
  • Java集合sort排序报错UnsupportedOperationException处理
  • 安防监控/磁盘阵列存储/视频汇聚平台EasyCVR调用rtsp地址返回的IP不正确是什么原因?
  • Spring boot开启定时任务
  • package.json相关知识记录
  • VueRouter使用详解(5000字通关大全)
  • vue axios实现下载文件及responseType:blob注意事项
  • StringBuilder类分享(1)
  • Qt 打开文件列表选择文件,实现拖拽方式打开文件
  • [C/C++]天天酷跑游戏超详细教程-上篇
  • 5G NR:RACH流程 -- Msg1之选择正确的PRACH时频资源
  • 在vue3项目中编辑的时候,解决对话框里边的数据和列表中的数据联动了。深复制
  • 循环结构(个人学习笔记黑马学习)
  • ceph中PGLog处理流程