Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据压缩 —— 一种基于LZ4算法的硬件加速的快速无损压缩

数据压缩 —— 一种基于LZ4算法的硬件加速的快速无损压缩

作者头像
繁依Fanyi
发布于 2023-05-07 09:52:00
发布于 2023-05-07 09:52:00
2.6K0
举报

背景

近年来,随着物联网等场景的不断发展,一些问题也逐渐的暴露了出来,就比如嵌入式设备上的 CPU时钟频率电源等资源都是有限的;对于部分设备来说可能换个时钟频率高的时钟、换个大的电池确实可以解决问题,但对于手机这种嵌入式移动设备来说,像是要做到便携、轻薄等等要求,体积就被限制住了,电源也因此被限制住了。

因此,需要一种基于硬件的压缩方法来解决这个问题。 大多数基于字典的自适应压缩方法都起源于 Lempel-Ziv 算法,就比如最快的压缩算法之一 LZ4。作者也就对 LZ4 进行了改进,并根据改进后的 LZ4 的压缩提出了一种硬件架构。

LZ4 分析

  • LZ4 是 LZ77 的一个变种算法,是 Collet 在2011年提出的固定的(fixed),面向字节(byte-oriented)的算法。
  • LZ4 的伸缩数据如图所示,它由 令牌(Token)字面量长度(Literal length)偏移量(Offset)匹配长度(Match length) 组成。
  • LZ4 和 LZ77 类似,它有一个滑动窗口,由一个搜索缓冲区和一个向前查找缓冲区组成。
  • LZ4 搜索之前没有压缩数据流中的重复数据,并用索引替换它。
  • LZ4 通过哈希表来匹配数据,从而提高了压缩速度。

令牌(Token)

令牌(Token) 长一个字节,其中前4个字节为 字面量长度(Literal Length),其后四个字节为 匹配长度(Match Length)

  • Token[3:0] 表示 匹配长度,表示 0 ~ 15 的文字长度。
  • Token[7:4] 表示 字面量长度,是比较不重要的位,匹配长度从0 ~ 15。
  • Token [7:4] 的值如果为0,则代表没有文字。
  • Token [7:4] 的值如果为15,则表示文字长度必须有从 0~255 的额外字节来表示字面量的完整长度。
  • Token [3:0] 的如果值为0,则表示最小匹配长度为4,称为min match
  • 因此,Token [3:0] 的值从0到15意味着匹配长度值从4到19。如果Token[3:0]的值为15,则匹配长度中有更多字节。

字面量长度(Literal Length)

  • Token[7:4]值为 15 时,字面值长度(Literal Length)就是额外的字节。
  • 如果字面量长度为 0~254,则没有更多的字节。如果字面量长度是 255,在下一个字面量长度中有产生更多的字节。

偏移量(Offset)

  • 偏移量(Offset)占用2字节,采用little-endian格式,它表示要复制的匹配的位置。
  • 偏移值为 1 表示当前位置为 1 byte。最大偏移量为 65535。

匹配长度(Match Length)

  • 匹配长度(Match Length)类似于上面说到的字面量长度(Literal Length)
  • Token[3:0]达到可能的最高值 15 时,额外的字节被添加到匹配长度中。

总结

  • LZ4 总是为偏移量(Match Length)分配 2字节,但其实这对压缩比的性能影响不大。
  • LZ4算法最初是为了在一般处理器上进行软件实现而提出的,因此在一些硬件上实现 LZ4 存在一定的约束。

改进的 LZ4

本文作者改进了数据格式的序列哈希计算

  • 通过指定压缩单元的大小,可以优化哈希表的大小。
  • 将压缩单元的大小设置为 4KB,可以为内存页进行优化并节省内部内存。

数据格式

这里作者改变了 LZ4 的首部(Header)偏移量(Offset),下图分别是 改进后的 LZ4 与 LZ4 的格式。

Header

Token

Literal

Length Literals

Offset

Match Length

2 Bytes

1 Byte

0-n Bytes

0-L Bytes

1-2 Bytes

0-n Bytes

Token

Literal Length

Literals

Offset

Match Length

1 Byte

0-n Bytes

0-L Bytes

2 Bytes

0-n Bytes

首部(Header)
  • 头部位于每个压缩单元的开头,包含压缩大小(Compressed Size)原始标志(Raw Flag)
  • 如果压缩后的数据大小大于原始数据大小,则原始标志(Raw Flag) 则被标记为 1原始数据将被添加在首部(Header)之后,压缩符号将不被添加,解压器也不需要解压该压缩单元。
  • 在数据根本没有压缩的最坏情况下,原始标志(Raw Flag)使解压缩程序更快。
  • 在最坏的情况下,压缩单元大小被添加到原始数据的头部大小中。
偏移量(Offset)
  • 偏移量(Offset)大小标志(Size Flag)偏移量大小(Offset Size)组成。
  • 大小标志(Size Flag)是最重要的位。如果大小标志值为 0,偏移量大小则使用 7 bit,即{offset [7], offset[6:0]}
  • 如果大小标志值为 1,偏移量大小则使用 15 bit,即{offset [15], offset[14:0]}
  • 偏移量大小表示匹配的位置,最大偏移大小值为32768。
  • 可变偏移字节长度使我们的方法比LZ4有更好的压缩比。

哈希计算

  • 哈希函数的目的 是将任意大小的数据映射到固定大小的数据。对于匹配检测,使用哈希表的搜索算法要比其他算法快得多。
  • 理想的哈希表的大小是输入数据位乘以压缩单位字节的大小。 但是,由于哈希表的大小是有限的,因此哈希计算计算输入的比特数要比输入的比特数小。
  • 哈希计算的性能取决于不同的输入得到相同结果的频率。
  • LZ4的哈希计算算法基于Fibonacci哈希原理,计算公式如下:
  • 上述公式中的IN为32位值,LZ4的哈希计算公式在硬件上实现复杂,并且计算周期长。于是作者改进了该哈希计算公式,公式如下:
  • 这里压缩单元大小为4KB,改进后的公式被 12 bit 屏蔽,仅使用位操作就可以将32位输入映射到12位。因此,一个很小的硬件资源就足以计算改进后的哈希计算公式,并且只需要一两个周期

建议的硬件架构

总模块

  • 这里作者提出了一种建议使用的硬件架构。它主要由核心模块(压缩模块和解压缩模块)高级微控制器总线体系结构(AMBA)接口组成,实现应用处理器的互连。
  • 核心模块通过高级外设总线(APB)处理器进行控制信号通信。输入数据和输出数据通过高级可扩展总线(AXI)处理。
  • 下图为总体的硬件架构:
  • 下表描述了是各个模块的数量,面积以及总面积。

模块

模块数量

面积

总面积(mm2)

Compress

1

0.01320

0.01320

Decompress

1

0.01345

0.01345

Hash Table

2

0.00515

0.01029

SRAM

8

0.00652

0.05215

AXI(DMA)

1

0.01187

0.01187

APB

1

0.00133

0.00133

压缩模块

压缩模块主要由SRAM控制组件哈希计算组件字节匹配组件流生成组件组成,下图为压缩模块的架构图。

  • 为了避免数据输入的瓶颈,压缩模块将输入数据写入8个独立的SRAM。
  • 之后压缩机从SRAM移位寄存器读取128 bit 数据。
  • 对于每个 4 byte 的输入数据,哈希计算模块计算哈希值,读取哈希表来比较和更新索引。
  • 如果在哈希表中搜索计算出来的哈希值,则移动到该位置并开始匹配字节。当匹配长度大于4时,因为哈希值已经从前面的文字计算出来了,此时可以跳过哈希计算。
  • 压缩单元最后一次数据处理完毕后,压缩机检查压缩尺寸是否大于原始尺寸。如果大于原始尺寸,压缩模块将原始标志(Raw Flag) 设置到首部(Header)并输出原始数据。
  • 当压缩内存数据时,对于未压缩的页,只将页头写入输出。在这种情况下,CPU读取头中的 原始标志(Raw Flag) ,解压时执行memcpy

解压缩模块

解压缩模块比压缩模块简单,它主要由SRAM控制组件流解析组件缓冲区组件组成。

  • 解析器流 通过从SRAM读取输入数据来解析报头和每个符号。
  • 字面量 通过复制文字长度从输入数据中获得的
  • 匹配部分 是通过匹配长度从已经解压的数据中的偏移位置复制的。
  • 如果与当前数据的偏移距离太近,后续管道可能不会写入数据。因此便有了缓冲区来保存没有写入的数据。

实验及结果

在这里,作者将提出的设计与原来的 LZ4 进行了比较,并展示了压缩比与压缩速度以及各种数据类型之间的关系,这些数据类型包括二进制数据文本数据Android应用程序包字体数据JPEG图像以及 HTML页面数据

本实验所提出设计运行在400MHz的处理环境下。数据的吞吐量也取决于总线条件,在考虑总线条件的情况下,要考虑整个模块的压缩速率。

  • 由图 【压缩比与压缩速度的关系】 可知,压缩比与压缩速率呈线性关系。
  • 较低的压缩比意味着大多数的输入字节都被处理,因此压缩速率变慢。
  • 相反地,压缩速率很快的情况下,将会跳过部分匹配的字节,压缩比会增大。
  • 总的来说,压缩速率取决于压缩比,压缩速率也与压缩比呈正比

由于在LZ4中有一个加速选项,加速值越高,压缩越快;相应的,压缩比会降低。这里便有了与LZ4各加速方案进行了比较的实验在上述两图。

总结

本文提出了一种改进的 LZ4 算法 和硬件结构。可变长的偏移量优化的哈希算法以及硬件流水线都提高了压缩速率和压缩比。

  • 该设计可实现高达3.84Gbps的压缩吞吐量和高达4的压缩比
  • 它的压缩速度比 LZ4 算法快4%,比 LZ4 算法高5%,但它的最高时钟频率比LZ4慢。
  • 文中所提出的硬件架构可以针对移动设备环境进行优化,因此它不仅可以用于压缩移动设备中的内部存储,还可以用于压缩RAM,从而有望提高内存性能
  • 该硬件架构还可以实现低电流驱动和低功耗驱动,从而提高电池寿命
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[MYSQL] lz4压缩数据结构并使用Python解析
上一篇文章我们介绍了mysql压缩页的存储格式以及解析方法. 但只考虑了zlib的情况. 对于lz4压缩的就没管它的死活了. 现在来补充下lz4格式的解析.
大大刺猬
2024/09/24
4520
[MYSQL] lz4压缩数据结构并使用Python解析
​十种常用的图像压缩算法。
数据压缩是保留相同或绝大部分数据前提下减小文件大小的过程。它的原理是消除不必要的数据或以更高效的格式重新组织数据。在进行数据压缩时,你可以选择使用有损方法或无损方法。有损方法会永久性地擦除掉一些数据,而无损方法则能保证持有全部的数据。使用哪类方法取决于你要让你的文件保持多大的精准度。本文会为你介绍6种不同的无损数据压缩算法,以及4种基于深度学习的图像/视频压缩算法。六款无损数据压缩算法无损压缩算法通常被用于归档或其他高保真目的。这些算法能够让你在确保文件可被完整恢复的同时减少文件大小。有很多种无损压缩算法供你选择。下面介绍6种常用的算法。1.LZ77LZ77算法发布于1977年。作为很多其他无损压缩算法的基础,它使用了“滑动窗口”的概念。在这个概念中,LZ77管理了一个字典。该字典使用三元组的方式:偏移量(Offset):短语起始处于文件开头之间的距离行程长度(Run length):组成短语的字符数偏离字符:表明新短语的标记符,匹配结束后,前向缓冲区中的第一个符号当文件被解析时,字典会被实时更新以反映最新的压缩数据和大小。举个例子,如果一个文件包含字符串"abbadabba",那么被压缩到字典中的项就是"abb(0,1,'d')(0,3,'a')"。你可以看下下表的拆解过程:这个例子中,被压缩后的数据并不比初始数据小多少。但一般情况下,当文件很长时,这种压缩效果就会显现出来。2. LZR LZR由Michael Rodeh于1981年提出,它是在LZ77的基础上发展而来。这个算法目标是成为LZ77的一个线性时间替换算法,但编码后Udell指针可能指向文件的任意偏移量,意味着需要耗费可观的内存,因此表现不如LZ77。3. LZSSLZSS,全称Lempel-Ziv-Storer-Szymanski,于1982年提出。它也是旨在提升LZ77的一个算法。它引入了一个方法能够检测是否真的减少了文件大小。如果未能起到压缩效果,就保持原来的输入格式。LZSS还移除了对偏离字符的使用,只使用<偏移量,长度>对。这个压缩算法广泛用于归档格式,如RAR以及网络数据的压缩。4. DEFLATEDEFLATE算法于1993年提出。作者是Phil Katz。该算法结合了LZ77或LZSS预处理器与霍夫曼编码。霍夫曼编码是1952年提出的诉法。它是一种熵编码,主要基于字符出现频度分配编码。5. LZMALZMA算法,全称是Lempel-Ziv Markov chain Algorithm(LZMA),于1998年提出,是LZ77的改进版,旨在实现.7z格式的7-ZIp文件归档。它使用链式压缩方法,在比特而非字节级别上应用修改后的LZ77算法。该压缩算法的输出稍后被算数编码进行处理以便后续进一步压缩。根据具体的实现不同,可能会引入其他的压缩步骤。6. LZMA2LZMA2算法于2009年提出,是LZMA的改良版。它提升了LZMA在多线程能力上的性能以及提升了处理不可压缩类型数据的表现。 四种基于深度学习的图像/视频压缩算法除了上面介绍的静态压缩算法,还有基于深度学习的压缩算法可供选择。1. 基于多层感知机的压缩算法多层感知机(Multi-Layer Perceptron,MLP)技术使用多层神经元来获取、处理以及输出数据。它能够被应用到数据降维任务和数据压缩。首个基于MLP的算法于1988年被提出,目前已经被应用到:二进制编码——标准的双符号编码量化——限制从连续集到离散集的输入特定领域内的转换——像素级的数据变更MLP算法利用分解神经网络上一步的输出来确定最佳的二进制码组合。后面,使用预测技术优化这个方法。预测技术能够通过反向传播基于相邻数据来提升数据准确度。 2. DeepCoder -- 基于视频压缩的深度神经网络DeepCoder是一个基于卷积神经网络(CNN)的框架,它是传统视频压缩技术的替代。该模型为预测信号和残留信号使用单独的CNN。它使用标量量化技术和一个传统的文件压缩算法——霍夫曼编码——将编码特征映射到一个二进制流中。一般认为,该模型的性能要优于著名的H.264/AVC视频编码规范。 3. 基于CNN的压缩算法CNN是分层的神经网络,通常用于图像识别和特征检测。当应用到压缩时,这些神经网络使用卷积操作来计算相邻像素点之间的相关性。CNN展示出了比基于MLP算法更好的压缩结果,提升了超分辨率下的性能以及减少了伪影。另外,基于CNN的压缩还提升了JPEG图像的品质,因为它减少了峰值信噪比(PSNR)和结构相似性(SSIM)。基于CNN的压缩通过使用熵估计法还实现了HEVC的性能。 4. 基于生成式对抗网络(GAN)的压缩算法GAN属于神经网络的一种,它使用两个神经网络彼此竞争的方式来产生更精确的分析和预测。最早基于GAN的压缩算法于2017年被提出。这些算法的文件压缩比例是其他常见方法(如JPEG、WebP等)的2.5倍。你可
小白学视觉
2024/12/05
3190
​十种常用的图像压缩算法。
模型压缩到70%,还能保持100%准确率,无损压缩框架DFloat11来了
大型语言模型(LLMs)在广泛的自然语言处理(NLP)任务中展现出了卓越的能力。然而,它们迅速增长的规模给高效部署和推理带来了巨大障碍,特别是在计算或内存资源有限的环境中。
机器之心
2025/04/30
870
模型压缩到70%,还能保持100%准确率,无损压缩框架DFloat11来了
E往无前 | 日志成本下降25%+!腾讯云大数据ES Lucene压缩编码深度优化大揭秘
《E往无前》系列将着重展现腾讯云大数据ES在持续深入优化客户所关心的「省!快!稳!」诉求,能够在低成本的同时兼顾高可用、高性能、高稳定等特性,可以满足微盟、小红书、微信支付等内外部大客户的核心场景需求。 E往无前 | 日志成本下降25%+!腾讯云大数据ES Lucene压缩编码深度优化大揭秘 导语:Lucene作为Elasticsearch的底层索引引擎,提供了灵活的数据检索能力。但在日志数据领域,Lucene现有的设计导致数据膨胀较为严重,本文介绍了关于Lucene底层文件格式的系统性优化思路。这些优化特
腾讯云大数据
2023/02/13
1.3K0
E往无前 | 日志成本下降25%+!腾讯云大数据ES Lucene压缩编码深度优化大揭秘
基于 Chiplets 设计的高压缩比SRAM模块
文档由 Nilesh Shah (ZeroPoint Technologies) 发表,探讨了未来内存和存储技术的发展方向,特别是基于Chiplets的压缩LLC缓存与内存扩展技术。
数据存储前沿技术
2025/02/11
1370
基于 Chiplets 设计的高压缩比SRAM模块
ZIP压缩算法详细分析及解压实例解释(上)
来源:esingchan - 博客园 链接:www.cnblogs.com/esingchan/p/3958962.html(点击尾部阅读原文前往) 最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据压缩,两者本质上没啥区别,在数学家看来,都是映射。 一方面在进行通信的时候,有必要将待传输的数据进行压缩,以减少带宽需求;另一方面,计算机存储数据的时候,为了减少
智能算法
2018/04/02
3.3K0
ZIP压缩算法详细分析及解压实例解释(上)
HTTP传输数据压缩
一、基础 1、HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。 HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件。 能大大减少网络传输的数据量,提高了用户显示网页的速度。当然,同时会增加一点点服务器的开销。 本文从HTTP协议的角度,来理解HTTP压缩这个概念。  2、HTTP内容编码和HTTP压缩的关联 HTTP压缩其实是HTTP内容编码的一种,在HTTP协议中,允许对内容(也就是Body部分)进行编码,可以采用gzip这样的编码。 从而
郑小超.
2018/01/26
3.5K0
gzip压缩算法
gzip,zlib,以及图形格式png,使用的是同一个压缩算法deflate。我们通过对gzip源码的分析来对deflate压缩算法做一个详细的说明:
黄规速
2022/04/14
2.2K0
Nano Transport:一种硬件实现的用于SmartNIC的低延迟、可编程传输层
摘要:传输协议可以在NIC(网卡)硬件中实现,以增加吞吐量、减少延迟并释放CPU周期。如果已知理想的传输协议,那么最佳的实现方法很简单:直接将它烧入到固定功能的硬件中。但是传输协议仍在发展,每年都有提出新的创新算法。最近的一项研究提出了Tonic,这是一种Verilog可编程硬件传输层。我们在这项工作的基础上提出了一种称为纳米传输层的新型可编程硬件传输层架构,该架构针对主导大型现代分布式数据中心应用中极低延迟的基于消息的 RPC(远程过程调用)进行了优化。Nano Transport使用P4语言进行编程,可以轻松修改硬件中的现有(或创建全新的)传输协议。我们识别常见事件和基本操作,允许流水化、模块化、可编程的流水线,包括分组、重组、超时和数据包生成,所有这些都由程序设计员来表达。
网络交换FPGA
2021/10/11
2K1
Nano Transport:一种硬件实现的用于SmartNIC的低延迟、可编程传输层
Redis 源码简洁剖析 05 - ziplist 压缩列表
压缩列表,内存紧凑的数据结构,占用一块连续的内存空间。一个 ziplist 可以包含多个节点(entry), 每个节点可以保存一个长度受限的字符数组(不以 \0 结尾的 char 数组)或者整数, 包括:
Yano_nankai
2022/03/24
5230
Redis 源码简洁剖析 05 - ziplist 压缩列表
ZIP压缩算法详细分析及解压实例解释(下)
来源:esingchan - 博客园 链接:www.cnblogs.com/esingchan/p/3958962.html(点击尾部阅读原文前往) 7、ZIP中对CL进行再次压缩的方法 这里仍然沿用Huffman的想法,因为CL也是一堆整数,那么当然可以再次应用Huffman编码。不过在这之前,PK对CL序列进行了一点处理。这个处理也是很精巧的。 CL序列表示一系列整数对应的码字长度,对于literal/length来说,总共有0-285这么多符号,所以这个序列长度为286,每个符号都有一个码字长度,当然
智能算法
2018/04/02
2.8K0
ZIP压缩算法详细分析及解压实例解释(下)
打工人必备:Hive小文件合并与数据压缩
Hive仓库表数据最终是存储在HDFS上,由于Hadoop的特性,对大文件的处理非常高效。而且大文件可以减少文件元数据信息,减轻NameNode的存储压力。但是在数据仓库中,越是上层的表汇总程度就越高,数据量也就越小,而且这些表通常会有日期分区,随着时间的推移,HDFS的文件数目就会逐步增加。
王知无-import_bigdata
2020/12/18
2.5K0
打工人必备:Hive小文件合并与数据压缩
压缩算法选型(gzip/snappy/lz4)及性能对比
通过Snappy.compress()进行压缩,压缩后的数据没有magic header
用户7255712
2021/11/21
17.3K0
开源创新应用于时间序列数据压缩
高级时间序列压缩器 (ATSC) 代表着在保持分析能力的同时优化存储成本的重大机遇。
云云众生s
2024/12/23
1530
开源创新应用于时间序列数据压缩
内存节省到极致!!!Redis中的压缩表,值得了解...
前面几周我们一起看了Redis底层数据结构,如动态字符串SDS,双向链表Adlist,字典Dict,跳跃表,整数集合intset,如果有对Redis常见的类型或底层数据结构不明白的请看上面传送门。
陈琛
2020/07/07
1.1K0
压缩列表的源码实现
压缩列表ziplist本质上就是一个字节数组,是Redis为了节约内存而设计的一种线性数据结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数。 Redis的有序集合、散列和列表都直接或者间接使用了压缩列表。当有序集合或散列表的元素个数比较少,且元素都是短字符串时,Redis便使用压缩列表作为其底层数据存储结构。列表使用快速链表(quicklist)数据结构存储,而快速链表就是双向链表与压缩列表的组合。 ziplist 压缩列表是一个特殊编码的双端链表(内存上连续),为了尽可能节省内存而设计的。ziplist 可以存储字符串或者整数值,其中整数被编码保存为实际的整数,而不是字符数组。ziplist 支持 O(1) 的时间复杂度在列表的两端进行 push 和 pop 操作。然而因为这些操作都需要对整个 ziplist 进行内存重分配(因为是一块连续的内存),所以操作的实际复杂度和 ziplist 占用的内存大小有关。在 7.0 版本里,ziplist 已经全面被 listpack 替换了(主要是因为连锁更新较影响性能)
zeekling
2022/12/10
4360
十款性能最佳的压缩算法
数据压缩是保留相同或绝大部分数据前提下减小文件大小的过程。它的原理是消除不必要的数据或以更高效的格式重新组织数据。在进行数据压缩时,你可以选择使用有损方法或无损方法。有损方法会永久性地擦除掉一些数据,而无损方法则能保证持有全部的数据。使用哪类方法取决于你要让你的文件保持多大的精准度。
Spark学习技巧
2021/03/05
7.9K0
十款性能最佳的压缩算法
Kafka 之压缩算法&Hash算法
Kafka 支持的压缩算法还挺多的,这一篇来站在Kafka的角度看一下压缩算法。就当前情况来说,支持GZIP、Snappy、LZ4 这三种压缩算法。具体是通过compression.type 来开启消息压缩并且设定具体的压缩算法。
邹志全
2019/07/31
2.1K0
Redis系列(三)底层数据结构之压缩列表
Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?
呼延十
2020/02/13
5460
LZ77 基本概述
LZ77 算法执行流程如下: 步骤 1:从输入的待压缩数据的起始位置,读取未编码的源数据,从滑动窗口的字典数据项中查找最长的匹配字符串。若结果为 T,则执行步骤 2,若结果为 F,则执行步骤 3; 步骤 2:输出函数 F(off,len,c)。然后将窗口向后滑动到 len++,继续步骤 1; 步骤 3:输出函数 F(0,0,c),其中 c 为下一个字符。并且窗口向后滑动(len + 1)个字符,执行步骤 1。
繁依Fanyi
2023/05/07
8820
LZ77 基本概述
推荐阅读
相关推荐
[MYSQL] lz4压缩数据结构并使用Python解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档