采用状态转移矩阵方式的快速哈夫曼解码算法

  为了最大程度地减少每个 Web 请求和响应传输的数据量,HTTP/2协议使用HPACK格式对标头进行编码,并使用 Hoffman 算法对其文字值进行编码。

  采用逐位读取并解码的哈夫曼算法似乎在性能方面是有些问题的。而采用一次读取多位的快速霍夫曼解码则可以大幅提升解码性能。采用状态转移矩阵方式实现的哈夫曼算法首先需要创建一个状态转移矩阵,在解码的时候,根据这个状态转移矩阵一次读取n个bits并通过查找状态转移矩阵来实现快速解码。

  首先,让我们通过一个非常简单的例子来如果来构建这个状态转移矩阵。假设,我们需要处理的字母表为 A、B、C、D 和 E,它的哈夫曼编码如下:

特点哈夫曼表
A00
01
C100
D101
11

  我们根据上面的哈夫曼表来构建一个解码状态转义矩阵,并且这里假设解码器一次读取 2 位的霍夫曼位序列。下图是我们需要填写的表结构。

PATHIDSYMLFT00011011
//0------

   上表中的每一行代表一个状态记录。第一列 PATH 将用于注释,我们将在其中存储当前读取的位,以便我们知道哪个序列引用了哪个表行。每个字符代码的读取始终从标有 的根行开始//。该列ID将存储行的唯一编号。第一行标有0。该列SYM将存储解码出来的字符(例如A)。字段LFT将存储有关剩余位bits数。剩余位是指到达完整位块(在我们的例子中为 2 位)还需要多个位。例如,字母 C 和 D 的剩余部分为 1,因为要达到整数位数(在我们的例子中为 2 位 * N),还需要 1 位。字母 A、B 和 E 没有剩余。其余列表示 2 位的读取块,其所有可能值范围为00(0) 到11(3)。
  最后四列00、01、10、11分别代表在当前状态下面,碰到后续读取的00、01、10、11四种bit特位的时候,将当前状态如何转移到新的状态。

  下面根据哈夫曼编码表来示例解码状态转移表的数据填充过程。如前所述,我们一次读取 2 位霍夫曼代码。让我们看看如何向表中插入第一个字母 A 的数据。

  字母A用代码表示00。由于第一列中没有//00此代码的路径,因此我们使用新的ID.在第一行的列00中我们写入新建立的状态ID=1的 。由于我们读取了字母 A 的所有位,因此我们也在该SYM列中写入字符 A。

PATHIDSYMLFT00011011
//0--1---
//001A0----

  然后我们对字母 B 重复此过程。字母 B 用代码 表示01。由于此代码没有路径//01,因此我们使用新的ID,在第一行的列01中我们写入新建立的行的ID=2 。由于我们读取了字母 B 的所有位,因此我们还将字符 B 写入该SYM列。

PATHIDSYMLFT00011011
//0--12--
//001A0----
//012B0----

  字母 C 的处理过程有些不同,因为它的位数是正好能够被2整除。首先,我们读取前 2 位位并将它们插入表中,过程与之前相同,新增一行//10 ID=3的行,并且第一行的10列设置为3。之后,我们读取剩余的位,同时假设丢失位的所有可能变化都存在。这标有X。由于缺少一位,我们在列中注明这一点LFT

PATHIDSYMLFT00011011
//0--123-
//001A0----
//012B0----
//103--44--
//100X4C1----

&emps; 接下去继续对字母 D 和 E 重复该过程。最终的表格应如下所示:

PATHIDSYMLFT00011011
//0--1236
//001A0----
//012B0----
//103--4455
//100X4C1----
//101X5D1----
//116E0----

请注意,将标有 X 的变体替换为实际可能的路径是正确的。

PATHIDSYMLFT00011011
//0--1236
//001A0----
//012B0----
//103--4455
//10004C1----
//10014C1----
//10105D1----
//10115D1----
//116E0----

  以上就把解码的状态转移矩阵建立好了,它在解码过程中起着至关重要的作用。下面利用这个状态转移矩阵来看看解码的过程。

  作为示例,我们按以下顺序使用字符序列:A、D 和 B。

ADB = 0010101

  解码的时候,解码器通过一次读取 2 位进行解码,初始状态是//,即ID=0的状态。首先,我们读取序列中的前两位00。在转移矩阵的第一行中ID=0,我们需要检查该状态下碰到00将转移到哪一个状态,我们看到下一个状态是1,//0行的状态,而该行记录了SYM=A,LFT=0,表示输出字符A,因为LFT=0表示没有遗留的字符,所以状态重新回到//

  对于接下来的 2 位,解码去重复该过程读取10。在//状态的10列中我们看到下一个状态ID是3,于是进入状态//10,然后继续处理接下来的 2 位10。查看//10状态下面的10列,可以看到下一个状态ID是5,于是进入状态//1010,这个状态的SYSM=D,代表输出字母 D。而在这里我们可以看到 列的值LFT=1,意味着有一个剩余 1个bit。这意味着为了继续读取位,我们必须向后移动一位并在那里继续该过程。

  最后我们将自己重新回到状态初始状态//,因为前面剩余了一个bit 0,本次只要读取一个bit即可,于是我们读取到了01,而01对应的是状态ID=2的状态//01,对应于字符B,所以输出字母B,如此完成了整个解码过程。

00XXXXX => A
XX10XXX => continue
XXXX10X => D
XXXXX01 => B

   通过使用之前创建的一次读取 2 位的状态转换矩阵,我们成功地将哈夫曼序列进行了解码。考虑到单个字符的最短霍夫曼代码为 5 位长,为了获得速度和所用资源之间的最佳比例,每次读取 4 位是最佳选择,利用上述介绍的过程,我们完全可以构造一个一次读取4位的状态转移矩阵。一次读取更多位意味着更快的解码,但同时也意味着需要更大的转换表从而占用更高的内存。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习——过拟合

一、过拟合得表现 模型在训练过程中,除了会出现过拟合现象,还有可能出现欠拟合的情况。相比而言,后者通常发生在建模前期,只要做好特征工程一般可以解决模型欠拟合问题。下图描述了模型在训练数据集上的三种情况: 其…

二阶响应曲面分析

文章目录 一、二阶响应曲面介绍1.1 什么时候用二阶响应曲面1. 非线性关系2. 探寻极值(最大化或最小化)3. 复杂的交互作用4. 精度要求高5. 探索性分析阶段 1.2响应曲面的特征 二、实例说明2.1 二阶模型求解 参考自《实验设计与数据处理》一书 一、二阶响应…

HTML5 服务器发送事件(Server-Sent Events)

参考:HTML5 服务器发送事件(Server-Sent Events) | 菜鸟教程 一,sse介绍 Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新。 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务…

Verilog基础语法——parameter、localparam与`define

Verilog基础语法——parameter、localparam与define 写在前面一、localparam二、parameter三、define写在最后 写在前面 在使用Verilog编写RTL代码时,如果需要定义一个常量,可以使用define、parameter和localparam三种进行定义与赋值。 一、localparam …

【Linux深造日志】运维工程师必会Linux常见命令以及周边知识!

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位宝子们好啊!我是博主鸽芷咕。日志这个东西我相信大家都不陌生,在 linxu/Windows 系统…

新媒体运营-----短视频运营-----PR视频剪辑----字幕

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1. PR创建字幕2. 通过剪映来智能添加字幕3. 如何像文本对象一样,给字幕做特效4. 写字特效 1. PR创建字…

ssm079基于SSM框架云趣科技客户管理系统+jsp

客户管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本客户管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处…

Gateway基础知识

文章目录 Spring Cloud GateWay 用法核心概念请求流程两种配置方式设置日志(建议设置)路由的各种断言断言The After Route Predicate FactoryThe Before Route Predicate FactoryThe Between Route Predicate FactoryThe Cookie Route Predicate Factory…

Java使用IText根据pdf模板创建pdf文件

1.导包 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-as…

Rust之构建命令行程序(六):信息写入

开发环境 Windows 11Rust 1.77.2 VS Code 1.88.1 项目工程 这次创建了新的工程minigrep. 将错误信息写入标准错误而不是标准输出 此时&#xff0c;我们正在使用宏println!将所有输出写入终端。在大多数终端中&#xff0c;有两种输出:一般信息的标准输出&#xff08;stdout&…

docker安装【zookeeper】【kafka】【provectuslabs/kafka-ui】记录

目录 1.安装zookeeper:3.9.2-jre-172.安装kafka:3.7.03.安装provectuslabs/kafka-ui &#xff08;选做&#xff09;新环境没有jdk&#xff0c;安装jdk-17.0.10备用 mkdir -p /export/{data,apps,logs,conf,downloads}cd /export/downloadscurl -OLk https://download.oracle.…

【VScode】VScode+如何从git上面拉取代码?

目录标题 1、打开VSCode。File>New Window。2、打开集成终端&#xff08;Terminal > New Terminal 或使用快捷键Ctrl \)。3、在终端中&#xff0c;使用Git命令克隆仓库。4、打开项目。 1、打开VSCode。File>New Window。 2、打开集成终端&#xff08;Terminal > …

基于HAL库的stm32中定时器的使用--定时器中断每隔一秒进行led灯的闪烁以及定时器生成PWM

一&#xff1a;什么是定时器 &#xff08;1&#xff09;stm32定时器&#xff0c;是存在于stm32单片机中的一个外设。stm32共有八个定时器&#xff0c;两个高级定时器&#xff08;TIM1、TIM8&#xff09;&#xff0c;四个通用定时器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff…

Java中的ArrayList集合

特点&#xff1a; ArrayList中的一些方法&#xff1a; 1、add(Object element):向集合的末尾添加元素 add(int index,Object element):在列表的指定位置&#xff08;从0开始&#xff09;插入指定元素 2、size():返回列表的中的元素个数 3、get(int index):返回下标为index位置的…

基于昇腾AI 使用AscendCL实现垃圾分类和视频物体分类应用

现如今&#xff0c;人工智能迅猛发展&#xff0c;AI赋能产业发展的速度正在加快&#xff0c;“AI”的需求蜂拥而来&#xff0c;但AI应用快速落地的过程中仍存在很大的挑战&#xff1a;向下需要适配的硬件&#xff0c;向上需要完善的技术支持&#xff0c;两者缺一不可。 基于此&…

SQL中的锁

一、概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资(CPU、RAM、I/0)的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0c;锁冲…

02-JVM学习记录-运行时数据区

二、运行时数据区 每个JVM只有一个Runtime实例&#xff0c;只有一个运行时数据区。 虚拟机栈、堆、方法区最重要 方法区和堆与虚拟机的生命周期相同&#xff08;随虚拟机启动而创建&#xff0c;虚拟机退出而销毁&#xff09;&#xff0c;程序计数器、虚拟机栈、本地方法栈生命…

JavaScript云LIS系统概述 前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS&#xff08;云实验室信息管理系统&#xff09;是一种结合了计算机网络化信息系统的技术&#xff0c;它无缝嵌入到云HIS&#xff08;医院信息系统&#xff09;中&#xff0c;用于连…

wps/word中字体安装教程

问题&#xff1a;下载的字体怎么导入wps/word wps或word中没有相应字体&#xff0c;怎么导入。其实方法很简单。 Step 1&#xff1a;下载字体 首先&#xff0c;在网上搜索自己喜欢的字体&#xff0c;然后下载到本地。字体的格式通常是.ttf 下面是我网上找的字体&#xff08…

Vue 3 路由机制详解与实践

一、路由的理解 路由是指导用户界面导航的一种机制。它通过映射 URL 到应用程序的不同视图组件来实现页面间的切换和导航。 二、路由基本切换效果 路由基本切换效果指的是当用户在应用程序中进行页面导航时&#xff0c;通过路由可以实现页面的切换&#xff0c;从而展示不同的…
最新文章