前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >哈夫曼编码

哈夫曼编码

作者头像
晚上没宵夜
发布于 2022-05-09 13:12:25
发布于 2022-05-09 13:12:25
40700
代码可运行
举报
运行总次数:0
代码可运行

离开了校园,连手机流量都要省着用,然后突发奇想的思考如何才能节省传输大小

1. 哈夫曼树

构建最短带权路径长度的二叉树,叫做哈夫曼树,也叫最优树(权重越大的结点离树根越近)

1.1 基本定义

  • 路径:树中的一个节点到另一个节点之间的通路
  • 路径长度:某路径中所经过的节点数量
  • 节点的权:给节点赋值,这个值称为节点的权
  • 节点的带权路径长度:根节点到某节点的路径长度 * 该节点的权
  • 树的带权路径长度:树中所有叶子节点的带权路径长度之和,记作 "WPL"

1.2 构建步骤

  • 选出两个最小权值作为左右子树,新建其父节点(虚线),权值为左右子树权值之和
  • 从权值队列中删除第一步的左右子树的权值,添加第一步新增的二叉树到权值队列
  • 重复第一、二步,直到构建完权值队列中所有节点

1.3 构建图示

WPL:9 * 1 + 6 * 2 + 4 * 3 + 1 * 3 = 36

2. 哈夫曼编码

哈夫曼编码是一种编码方式,其可以对信息进行压缩,而从提高存储,传输的效率

2.1 基本定义

  • 等长编码:任何字符的编码长度都相同,比如ASCII。虽读写方便,但浪费资源,且有前缀码问题
  • 无前缀编码:任一个编码都不是其他任何编码的前缀。[01,10,11,100,101]中10是100的前缀,因此不是无前缀编码

2.2 构建步骤

  • 根据权值构建哈夫曼树
  • 将哈夫曼树的左树标 0,右树标记1,根节点不计算
  • 将权值替换为对应的字符
  • 列出字符对应的二进制

2.3 构建图示

假设字符A、B、C、D对应的权值为1、9、4、6

(4)

字符

编码

A

000

B

1

C

001

D

01

2.4 哈夫曼编码应用

通过哈夫曼编码传输文本、图片,查看前后对比

2.4.1 哈夫曼编码 java 实现
代码语言:javascript
代码运行次数:0
运行
复制
/**
 * @author Howl
 * 哈夫曼编码
 */
public class HuffmanCode {
    /**
     * 哈夫曼树结点结构
     */
    private static class Node implements Comparable<Node> {
        /**
         * 权值、二进制编码0、1、左右孩子
         */
        int weight;
        String code;
        Node left;
        Node right;

        Node(int weight) {
            this.weight = weight;
        }

        Node(int weight, Node left, Node right) {
            this.weight = weight;
            this.left = left;
            this.right = right;
        }

        @Override
        public int compareTo(Node o) {
            return Integer.compare(this.weight, o.weight);
        }
    }

    /**
     * 根节点、存储全部节点
     */
    private Node root;
    private static Node[] nodes;

    /**
     * 构建哈夫曼树
     * 建树是从最小权值开始的,所以借助小根堆
     */
    public void createHuffman(int[] weights) {

        // 构建小根堆,弹出是最小的元素
        Queue<Node> nodeQueue = new PriorityQueue<>();
        nodes = new Node[weights.length];
        for (int i = 0; i < weights.length; i++) {
            nodes[i] = new Node(weights[i]);
            nodeQueue.add(nodes[i]);
        }

        // 节点队列只剩一个节点结束,即根节点构建完成
        while (nodeQueue.size() > 1) {

            // 弹出权值最小的两个结点
            Node left = nodeQueue.poll();
            Node right = nodeQueue.poll();

            // 创建新节点作为两结点的父节点
            Node parent = new Node(left.weight + right.weight, left, right);
            nodeQueue.add(parent);
        }

        // 哈夫曼树根,遍历要用,优先级队列GC
        root = nodeQueue.poll();
        // 实现编码
        encode();
    }

    /**
     * 输入字符下标,输出对应的哈夫曼编码
     */
    public String convertHuffmanCode(int index) {
        return nodes[index].code;
    }

    /**
     * 递归填充二进制编码
     */
    private void encode() {
        encode(root, "");
    }

    private void encode(Node node, String code) {
        if (node == null) {
            return;
        }
        node.code = code;
        encode(node.left, node.code + "0");
        encode(node.right, node.code + "1");
    }

    /**
     * 测试
     */
    public static void main(String[] args) {

        // 字符及其对应权值
        char[] chars = {'A', 'B', 'C', 'D', 'E', 'F'};
        int[] weights = {2, 3, 7, 9, 18, 25};

        HuffmanCode huffManCode = new HuffmanCode();
        huffManCode.createHuffman(weights);
        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i] + ":" + huffManCode.convertHuffmanCode(i));
        }
    }
}
2.4.2 传输实现
  • 将原文进行哈夫曼编码,记录字符及其对应的编码,保存文件为 HuffmanCode
  • 将原文的字符用哈夫曼编码代替,保存文件为 HuffmanText
  • 将上面两个文件发送给对方
  • 对方根据这两份文件就可以解码出原文

3. 开源压缩框架

3.1 图片

Thumbnailator是专门压缩图片的,使用非常简洁

代码语言:javascript
代码运行次数:0
运行
复制
// 图片压缩
Thumbnails.of("C:\\Users\\Howl\\Desktop\\InPic.png")	// 输入图片地址
    .scale(1)											// 和原尺寸大小,即长度,1是原大小
    .outputQuality(0.5)									// 和原图的质量
    .outputFormat("jpg")								// 输出格式,png为高保真不会压缩
    .toFile("C:\\Users\\Howl\\Desktop\\OutPic");		// 输出地址
}

参考:

程序员小灰

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
一文读懂https中密钥交换协议的原理及流程
http与https区别:HTTP 由于是明文传输,所以在安全性上存在以下三个风险:
绿盟科技研究通讯
2022/06/06
8.7K0
一文读懂https中密钥交换协议的原理及流程
HTTP面试题 - HTTPS优化
本节介绍HTTPS优化是一个不小的话题,关于优化的讨论是在其他软硬件合理配置的前提下进行的,而关于HTTPS,我们常常会想它肯定要比HTTP要慢,实际上一个优化良好的HTTPS有时候要比HTTP要快很多。
阿东
2022/12/06
7100
HTTP面试题 - HTTPS优化
Linux下Nginx配置SSL以及301重定向
Nginx配置文件,位置/etc/nginx/sites-enabled下的default文件
no怕不了木
2023/10/26
1.1K0
HTTP与HTTPS的区别,详细介绍[通俗易懂]
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
全栈程序员站长
2022/07/01
5K0
HTTP与HTTPS的区别,详细介绍[通俗易懂]
详解 HTTP2.0 及 HTTPS 协议
众所周知, HTTP协议是没有安全加密的协议,因为使用明文传输,所以使用HTTP协议的站点很容易会被窃听、篡改,劫持;而伴随着互联网的发展,网络上承载了越来越多也越来越重要的数据,金融,商业,支付,机密数据等等,数据安全的重要性越来越凸显,越来越多的网站通过启用HTTPS来保障web数据传输的安全性。此外,HTTP2.0 作为新一代的WEB协议,以重量级的新特性带来更好,性能更高的web服务体验。本文基于运维视角在阐述解析HTTP2.0协议相比较HTTP1.1的优点的同时讲述HTTPS协议的原理,并结合实际业务场景作为案例,目的是可以通过本文掌握HTTP2.0及HTTPS协议,了解原理,具备定位排查问题,调优的能力。
玖柒的小窝
2021/11/28
4.4K0
详解 HTTP2.0 及 HTTPS 协议
HTTPS安全优化配置最佳实践指南简述
描述: 当下越来越多的网站管理员为企业站点或自己的站点进行了SSL/TLS配置, SSL/TLS 是一种简单易懂的技术,它很容易部署及运行,但要对其进行安全部署的情况下通常是不容易。
全栈工程师修炼指南
2022/09/29
2.9K0
HTTPS安全优化配置最佳实践指南简述
从零到一快速搭建个人博客网站(域名自动跳转www,二级域名使用)(二)
本篇文章是对上篇文章从零到一快速搭建个人博客网站(域名备案 + https免费证书)(一)的完善,比如域名自动跳转www、二级域名使用等。
yangwq
2021/02/05
3K0
HTTPS 基本原理和配置 - 2
这里有一些基本的原语(或叫做指令),你可以使用:ssl_certificate、ssl_certificate_key、ssl_protocols 和ssl_ciphers。
东风微鸣
2022/04/22
9000
HTTPS 基本原理和配置 - 2
HTTPS你不要这么慢了
选择支持AES-NI特性的CPU,该CPU在指令级别优化了AES算法,加速了数据的加解密过程。
shysh95
2021/11/25
1.4K0
HTTPS你不要这么慢了
HTTPS 基本原理和配置 - 1
〇、概述 作为概述,以下是本文要讲的内容。HTTPS 是什么? 每个人都可能从浏览器上认出 HTTPS,并对它有好感。然后再讲一遍基础知识,再详细讲一下协议版本,密码套件(Cipher Suites)
东风微鸣
2022/04/22
7640
HTTPS 基本原理和配置 - 1
016.Nginx HTTPS
超文本传输安全协议HTTPS(Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定。
木二
2020/07/22
1K0
【RSA】HTTPS中SSL/TLS握手时RSA前后端加密流程
SSL/TLS层在网络模型的位置,它属于应用层协议。接管应用层的数据加解密,并通过网络层发送给对方。
天天Lotay
2023/03/16
1.5K0
【RSA】HTTPS中SSL/TLS握手时RSA前后端加密流程
HTTPS 握手会影响性能吗?废话,肯定会
由裸数据传输的 HTTP 协议转成加密数据传输的 HTTPS 协议,给应用数据套了个「保护伞」,提高安全性的同时也带来了性能消耗。
小林coding
2022/10/27
1.3K0
HTTPS 握手会影响性能吗?废话,肯定会
深入理解SSL协议:从理论到实践
这是一篇关于SSL协议的技术文章,有理论知识,但又兼具一定的实战性,文章的主要内容分享了SSL协议的核心概念、工作原理、常见的应用场景,以及就https这种实际应用场景,又着重分享具体的工作原理以及如何实现https访问网站。无论你是信息安全技术的初学者,还是专业人士,相信这篇文章都能给你带来一些帮助或启示。如果有失误之处,烦请在评论区指出,以便共同成长和进步。
大漠天涯
2024/03/28
3.2K0
如何在Linux服务器部署自己的网站?
1、下载 Nginx,下载地址:http://nginx.org/download/nginx-1.6.2.tar.gz
执行上下文
2022/07/26
2.8K0
透视HTTPS建造固若金汤的城堡
为什么有 HTTPS?因为 HTTP 不安全! 现在的互联网已经不再是 “田园时代”,“黑暗森林” 已经到来。上网的记录会被轻易截获,网站是否真实也无法验证,黑客可以伪装成银行网站,盗取真实姓名、密码、银行卡等敏感信息,威胁人身安全和财产安全。
Bug开发工程师
2020/09/22
5220
透视HTTPS建造固若金汤的城堡
真正“搞”懂HTTPS协议17之TLS握手
  经过前两章的学习,我们知道了通信安全的定义以及TLS对其的实现~有了这些知识作为基础,我们现在可以正式的开始研究HTTPS和TLS协议了。嗯……现在才真正开始。
zaking
2023/02/16
2.9K0
真正“搞”懂HTTPS协议17之TLS握手
CentOS7中Nginx免费开启https
名词解释 HTTPS(超文本传输安全协议)是一种互联网通信协议,可保护用户计算机与网站之间传输的数据的完整性和机密性。用户在访问网站时都希望获得安全私密的在线体验。 Lets Encrypt 是由 Internet Security Research Group (ISRG) 开发的免费开放的证书颁发机构。Lets Encrypt 颁发的证书如今几乎得到所有浏览器的信任。 前提条件 你有一个指向你的公共服务器 IP 的域名。在本教程中,我们将使用rumenz.com. 你已经安装 Nginx 安装Certb
玖柒的小窝
2021/10/21
7080
CentOS7中Nginx免费开启https
传输安全HTTPS
为什么要有 HTTPS?简单的回答是:“因为 HTTP 不安全”。HTTP 怎么不安全呢?
真正的飞鱼
2023/03/13
5840
传输安全HTTPS
【HTTP】HTTPS TLS 1.2
在个人过去的读书笔记中已经介绍过一次,在这一篇文章中介绍了HTTP1.1的缺点,以及SSL、TLS的历史,之后介绍了有关SSL加密的主要加密方案:公开密钥加密 和 共享密钥加密,最后简单介绍了HTTPS的交互过程,但是书中的过程比较粗,这节我们讲细一点点。
阿东
2022/09/12
1.3K0
相关推荐
一文读懂https中密钥交换协议的原理及流程
更多 >
目录
  • 1. 哈夫曼树
    • 1.1 基本定义
    • 1.2 构建步骤
    • 1.3 构建图示
  • 2. 哈夫曼编码
    • 2.1 基本定义
    • 2.2 构建步骤
    • 2.3 构建图示
    • 2.4 哈夫曼编码应用
      • 2.4.1 哈夫曼编码 java 实现
      • 2.4.2 传输实现
  • 3. 开源压缩框架
    • 3.1 图片
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档