规范哈夫曼编码和Deflate算法

news2024/11/14 20:55:39

经过常规的哈夫曼编码以后,我们需要将每个符号对应的码字记录下来,比较容易想到的是按照字母序记录每个字母的编码,这样的好处是字母与码字的映射关系被隐式记录:
假设字母表 A = { a 1 , a 2 , a 3 , a 4 , a 5 } \mathcal{A}=\{a_1,a_2,a_3,a_4,a_5\} A={a1,a2,a3,a4,a5} P ( a 1 ) = P ( a 3 ) = 0.2 P(a_1)=P(a_3)=0.2 P(a1)=P(a3)=0.2 P ( a 2 ) = 0.4 P(a_2)=0.4 P(a2)=0.4 P ( a 4 ) = P ( a 5 ) = 0.1 P(a_4)=P(a_5)=0.1 P(a4)=P(a5)=0.1,构造的哈夫曼树如下:
在这里插入图片描述
每个码字可以由码字的长度后跟码字来表示。因此,编码将存储为 [ 2 , 01 , 1 , 1 , 3 , 000 , 4 , 0010 , 4 , 0011 ] [2, 01, 1, 1, 3, 000, 4, 0010, 4, 0011] [2,01,1,1,3,000,4,0010,4,0011]。这对于小字母表的哈夫曼编码当然是可以管理的,但是当我们的字母表非常大时,它显然会对压缩性能产生影响。

规范哈夫曼编码

规范哈夫曼编码可以大大减少编码的存储需求。在描述如何构建规范哈夫曼编码之前,我们先来看看哈夫曼树的一个属性。考虑下面的一棵哈夫曼树。我们将展示的是,如果我们只从左到右给出树上的码字的长度,就可以重建编码。例如,在这棵树中,长度为 3、4、4、2、1。
在这里插入图片描述
为了通过每个码字的长度重新生成对应的编码,我们从深度为 4(最长码字的长度)的树开始。
在这里插入图片描述
然后我们从左边开始对树剪枝,以匹配码字的长度。我们首先修剪掉最左边的两个分支,留下深度为 3 的叶子。这对应于第一个码字。接下来的两个码字的长度为 4,所以我们将接下来的两个叶子留在深度为 4 的位置。下一个码字的长度为 2,因此我们剪掉所有较低层的分支,留下深度为 2 的叶子。最后,我们对树的右半部分进行剪枝,得到长度为 1 的码字对应的叶子。
在这里插入图片描述

剪枝后的树可以在左分支和右分支上分别填充 0 和 1 来生成编码。从图中我们可以看到码字为 000、0010、0011、01、1。所以,只要知道特定顺序的码字长度就可以重新生成哈夫曼编码。

Deflate 算法

这又带来一个新的问题:我们不知道哪个码字属于哪个字母。规范过程为我们提供了一种生成隐式包含该信息的编码的方法。为了嵌入这些附加信息,我们需要对哈夫曼编码过程进行一些附加约束:

  • 给定长度的所有码字都按字典序连续产生,其顺序与它们所代表的符号相同
  • 较短的码字按字典顺序排在较长的码字前面

我们可以将这些约束合并到哈夫曼编码过程中,或者我们可以使用常规方法生成哈夫曼编码,并转换为规范哈夫曼编码。使用后一种方法更简单。为此,我们将从设计哈夫曼编码开始。从这个设计中,我们将提取码字的长度。我们将使用这些长度和规范约束来设计编码。

还是上面那个例子,字母表 A = { a 1 , a 2 , a 3 , a 4 , a 5 } \mathcal{A}=\{a_1,a_2,a_3,a_4,a_5\} A={a1,a2,a3,a4,a5},哈夫曼码字长度为 { 2 , 1 , 3 , 4 , 4 } \{2,1,3,4,4\} {2,1,3,4,4}。我们从最短到最长的顺序生成码字,记住较短的码字按字典顺序排在较长的码字之前的约束。最短的码字分配给 a 2 a_2 a2。长度为 1 的字典序最小码字为 0,因此 a2 的码字为 0。长度为 2 的码字必须为 1x 形式。只需要一个长度为 2 的代码字,即 a 1 a_1 a1 的码字,因此我们将 10 分配给 a 1 a_1 a1。长度为 3 的代码字现在必须采用 11x 的形式。我们只需要一个长度为 3 的代码字,因此, a 3 a_3 a3 的代码字是 110。有两个长度为 4 的码字, a 4 a_4 a4 a 5 a_5 a5。因此, a 4 a_4 a4 的码字是 1110, a 5 a_5 a5 的码字是 1111。现在可以仅通过发送码字长度来获得码字。与前面的编码方式不同,我们确切地知道哪个代码字属于字母表中的哪个字母,这是因为字典序的限制。

按照先长度后字典序的方法从左到右剪枝。通过查看码字长度列表,我们知道最短的是 a 2 a_2 a2 的码字,因此先剪出长度为 1 的叶子节点并为 a 2 a_2 a2 编码,接下来是 a 1 a_1 a1,等等。 a 4 a_4 a4 a 5 a_5 a5 的码字长度相同,按照字典序先产生 a 4 a_4 a4 的码字。因此,只需对长度列表进行编码就足以存储哈夫曼编码。对于大小为 5 的字母表,这并不是很大的节省;然而,当字母大小为 256 的数量级时,节省的空间会非常可观。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于数据驱动的电动车电池数据分析(一)

基于数据驱动的电动车电池数据分析(一) 欢迎关注笔者的微信公众号 笔者过去一年多的时间都在国内一家头部新能源企业实习,主要参与一些数据分析和平台研发的工作。在工作中积累了一些数据分析的经验,其中新能源领域比较多的是一…

曾经被人们看成是异想天开的产业互联网,或许终将会实现

一波还未平息,一波又起。元宇宙的热度还未彻底散去,ChatGPT已经成为了名符其实的新风口。如果用一个概念来定义现在这样一个热点和风口频出的时代的话,我想,用产业互联网或许是再合适不过的了。对此,可能有人并不认同。…

【设计模式】21.访问者模式

概述 定义: 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 结构 访问者模式包含以下主要角色: 抽象访问者(Visitor)角色:定义了对每一个元素&a…

Outlook邮箱登录不上?被阻止?这些方法教你解决

Outlook是微软的一款备受欢迎的应用软件,可以用来收发电子邮件、管理联系人信息、记日记、安排日程、分配任务等。然而最近就有很多朋友向东哥反映,有的时候没有办法正常登录outlook 邮箱,这是怎么回事呢?不用担心,今天…

揭秘可视化图探索工具 NebulaGraph Explore 是如何实现图计算的

前言 在可视化图探索工具 NebulaGraph Explorer 3.1.0 版本中加入了图计算工作流功能,针对 NebulaGraph 提供了图计算的能力,同时可以利用工作流的 nGQL 运行能力支持简单的数据读取,过滤及写入等数据处理功能。 本文将简单分享下 NebulaGr…

学习记录 --- Pytorch优化器

文章目录参考文献什么是优化器optimizer的定义optimizer的属性defaultsstateparam_groupsoptimizer的方法zero_grad()step()add_param_group()state_dict()、load_state_dict()优化一个网络同时优化多个网络当成一个网络优化当成多个网络优化只优化网络的某些指定的层调整学习率…

总结对Dva数据流向的简单理解

在刚刚接触Dva时,我最想知道的第一个问题就是: 1. Dva是什么? Dva官网文档的介绍是: dva 是体验技术部开发的 React 应用框架,将上面三个 React 工具库包装在一起,简化了 API,让开发 React 应…

[Datawhale][CS224W]图神经网络(八)

目录一、图神经网络1.1 为什么卷积神经网络 (CNN) 在图形上失败?1.2 一个GNN网络的结构如图:![在这里插入图片描述](https://img-blog.csdnimg.cn/20210606150918449.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cH…

MySQL实战解析底层---事务隔离:为什么你改了我还看不见

目录 前言 隔离性与隔离级别 事务隔离的实现 事务的启动方式 前言 和数据库打交道的时候,总是会用到事务最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱转账过程具体到程序里会有一系列的操作&#xff0…

高可用/性能

文章目录1.数据库系统架构发展(1)单库架构(2)主备架构(3)主从架构2.主从复制主从同步配置主从复制模式(1)异步复制(2)半同步复制(3)全…

用spectralayers 简单去一下人声做个伴奏

最近有个同事说有个工作要一个歌的伴奏不会下载问我能不能给下一个。问题是我五音不全,也不咋关注伴奏这方面的事儿,然后巧了,当天晚上就有个网上的大哥在群里聊天的时候说有个去人声比较给力的软件,我马上给要来了。 软件叫啥sp…

【代码随想录训练营】【Day29】第七章|回溯算法|491.递增子序列|46.全排列|47.全排列 II

递增子序列 题目详细:LeetCode.491 注意这道题求的是子序列,而不是子数组,子数组要求其数组是原数组的子集,且元素是连续的,而子序列只需要保证至少有两个元素即可,不需要关系元素是否连续。 所以一开始…

测试人员如何在测试环境数据库批量生成测试数据?方案分享

测试人员为了测试某个特定场景,往往需要在测试环境数据库中插入特定的测试数据来满足需求;性能测试时,常需要在测试环境生成大量可用测试数据来支持性能测试;建设持续集成持续交付体系时,我们往往也需要在测试环境生成…

【网络】套接字 -- TCP

🥁作者: 华丞臧. 📕​​​​专栏:【网络】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉 LeetCode刷题网站 文章…

记录一次nginx转发代理skywalking白屏 以及nginx鉴权配置

上nginx代码 #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; …

【2023】某python语言程序设计跟学第二周内容

本文说明: 案例内容为北理工python语言程序设计课程,如有不妥请联系! 目录蟒蛇绘制案例:执行结果:代码分析:举一反三:绘制一个五角星图案执行结果:turtle库根据案例简单说明&#xf…

linux(Centos)安装docker

官网地址:Install Docker Engine on CentOS 首先检查linux系统版本及内核: 安装docker要求系统版本至少为7.x版本,内核至少为3.8以上 cat /etc/redhat-release # 查看系统版本号uname -r #查看linux系统内核 检查系统是否能连上外网&#…

3.基于Label studio的训练数据标注指南:文本分类任务

文本分类任务Label Studio使用指南 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等 2.基于Label studio的训练数据标注指南:(智能文档)文档抽取任务、PDF、表格、图片抽取标注等…

NJU数电实验-1

实验一 选择器 2选1多路选择器 逻辑表达式:y(∼s&a)∣(s&b)y(\sim s\&a)|(s\&b)y(∼s&a)∣(s&b) 逻辑电路: 数据流建模 数据流建模主要是通过连续赋值语句 assign 来描述电路的功能 module m_mux21(a,b,s,y);input a,b,s;…

这是一篇很好的互动式文章,Framer Motion 布局动画

重现framer的神奇布局动画的指南。 到目前为止&#xff0c;我最喜欢 Framer Motion 的部分是它神奇的布局动画–将 layout prop 拍在任何运动组件上&#xff0c;看着该组件从页面的一个部分无缝过渡到下一个部分。 <motion.div layout /> 在这篇文章中&#xff0c;我们…