Java实现Huffman编码的示例代码

 更新时间:2023年08月30日 10:01:20   作者:Robinsyn_L  
Huffman编码是一种编码方式,本文主要介绍了Java实现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>() {
            @Override
            public 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

到此这篇关于Java实现Huffman编码的示例代码的文章就介绍到这了,更多相关Java Huffman编码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:

相关文章

  • Spring Security账户与密码验证实现过程

    Spring Security账户与密码验证实现过程

    这篇文章主要介绍了Spring Security账户与密码验证实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 浅谈Java中的this作为返回值时返回的是什么

    浅谈Java中的this作为返回值时返回的是什么

    Java中的this作为返回值时返回的是什么?下面小编就为大家介绍一下Java中的this作为返回值时返回。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 学生视角看Java 面向对象的继承本质

    学生视角看Java 面向对象的继承本质

    继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为
    2022-03-03
  • 详解SpringBoot注解读取配置文件的方式

    详解SpringBoot注解读取配置文件的方式

    这篇文章主要介绍了详解SpringBoot注解读取配置文件的方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 使用Java实现构建jenkins的多个job并返回构建结果示例

    使用Java实现构建jenkins的多个job并返回构建结果示例

    这篇文章主要介绍了使用Java实现构建jenkins的多个job并返回构建结果示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Java设计模式之命令模式

    Java设计模式之命令模式

    这篇文章介绍了Java设计模式之命令模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Maven依赖冲突的几种有效解决方法总结

    Maven依赖冲突的几种有效解决方法总结

    在项目开发中使用Maven管理Jar包时,常常会遇到Jar包依赖冲突,所以本文就给大家总结了几种解决Maven依赖冲突的有效方法,需要的朋友可以参考下
    2023-07-07
  • Jenkins源代码管理SVN实现步骤解析

    Jenkins源代码管理SVN实现步骤解析

    这篇文章主要介绍了Jenkins源代码管理SVN实现步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 在win10系统下,如何配置Spring Cloud alibaba Seata以及出现问题时怎么解决

    在win10系统下,如何配置Spring Cloud alibaba Seata以及出现问题时怎么解决

    今天教大家如何在win10系统下,配置Spring Cloud alibaba Seata以及出现问题时怎么解决,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java连接Linux服务器过程分析(附代码)

    Java连接Linux服务器过程分析(附代码)

    这篇文章主要介绍了Java连接Linux服务器过程分析(附代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论