《老子到此一游系列》之 老子为什么是老子 ——综述视角解读压缩编码 第四章 LZ77 压缩算法(转发)

《老子到此一游系列》之 老子为什么是老子 ——综述视角解读压缩编码 第四章 LZ77 压缩算法(转发)

ELT.ZIP是谁?

ELT<=>Elite(精英),.ZIP为压缩格式,ELT.ZIP即压缩精英。

成员:

上海工程技术大学大二在校生 闫旭

合肥师范学院大二在校生 楚一凡

清华大学大二在校生 赵宏博

成都信息工程大学大一在校生 高云帆

黑龙江大学大一在校生 高鸿萱

山东大学大三在校生 张智腾

ELT.ZIP是来自6个地方的同学,在OpenHarmony成长计划啃论文俱乐部里,与来自华为、软通动力、润和软件、拓维信息、深开鸿等公司的高手一起,学习、研究、切磋操作系统技术…

本文的梳理来自其中的四名同学:闫旭、楚一凡、赵宏博和高云帆。

前期回顾

第一章:轻松上手——《伟大的计算原理》和《数据压缩技术调查:从数据质量、编码方案、数据类型和应用的角度》

第二章:小波变换(Wavelet Transform)——嵌入式零树小波编码EZW、无损加密后压缩(ETC)技术

第三章:Brotli 介绍——Brotli 的优势

第四章 LZ77 压缩算法

4.1 LZ77 编码简介

LZ 编码由以色列研究者 Jacob Ziv 和 Abraham Lempel 提出,是无损压缩的核心思想。LZ 是一个系列的算法,而其中最基本的就是两人在 1977年所发表的论文《A Universal Algorithm for Sequential Compression》 中提出的 LZ77 算法。

LZ77 压缩是一种基于字典及滑动窗口的无损压缩技术,广泛应用于通信传输。

LZ77 算法不同于 Huffman 编码等基于统计的数据压缩编码,需要得到先验知识——信源的字符频率,然后进行压缩。

LZ77的核心思想:利用数据的重复结构信息来进行数据压缩。
4.1 LZ77 的基本原理

LZ77 以经常出现的字母组合(或较长的字符串)构建字典中的数据项,并且使用较短的数字(或符号)编码来代替比较复杂的数据项。数据压缩时,将从待压缩数据中读入的源数据与字典中的数据项进行匹配,从中检索出相应的代码并输出。从而实现数据的压缩。

在 LZ77 方法中,词典就是先前已编码序列的一部分。编码器通过一个滑动窗口来查看输入序列,如下图所示:

这个滑动窗口包括两个部分:查找缓冲区(Search Buffer) 和 先行缓冲区(Look Ahead Buffer)

  • 查找缓冲区:包含了最近已编码序列的一部分
  • 先行缓冲区:包含待编码序列的下一部分

这里查找缓冲区包含了 8 个符号,先行缓冲区包含 7 个符号。但在实际情况中,缓冲区要大很多。

LZ77 中的相关参数解释:

  1. 匹配指针 先在 查找缓冲区 中找到移动指针,知道找到与先行缓冲区第一个字符a相匹配字符a。此时该指针与先行缓冲区的距离称为 偏移量(off) 。这里的 偏移量off 就是7。
  2. 编码器之后查看指针位置之后的符号,查看其是否与先行缓冲区的符号相匹配。从第一个符号(匹配指针以开始所指向的位置)开始,与先行缓冲区的符号匹配,匹配到的连续符号的长度称为 匹配长度(len)。例如这里,从匹配指针所指的位置开始的符号串 abra 与 先行缓冲区中的符号串 abra 相匹配,下一位查找缓冲区的 x 与 先行缓冲区 a 不匹配,所以这里的 匹配长度len 是 4.。
  3. 编码器在查找缓冲区中搜素最长匹配串。找到最长的匹配串后,编码器即可用三元组 <off,len,c> 对其进行编码。这里 off 是偏移量 ,len 是匹配长度,c 是先行缓冲区中跟在该匹配项串之后的符号的码字。例如这里 匹配串 是 abra,则先行缓冲区匹配串后的码字是 r。

4.1 LZ77 的算法

LZ77 算法执行流程如下:

  • 步骤 1:从输入的待压缩数据的起始位置,读取未编码的源数据,从滑动窗口的字典数据项中查找最长的匹配字符串。若结果为 T,则执行步骤 2,若结果为 F,则执行步骤 3;
  • 步骤 2:输出函数 F(off,len,c)。然后将窗口向后滑动到 len++,继续步骤 1;
  • 步骤 3:输出函数 F(0,0,c),其中 c 为下一个字符。并且窗口向后滑动(len + 1)个字符,执行步骤 1。

下面是代码实现:

参考文献

[1] Universal Lossless Data Compression Algorithms

https://xueshu.baidu.com/usercenter/paper/show?paperid=d5ab17267521190be0fa8acaa815aa99&site=xueshu_se&hitarticle=1

[2]一种改进的 LZ77 无损数据压缩算法设计

https://xueshu.baidu.com/usercenter/paper/show?paperid=a7f48707e934a2a3d6ff20bf81110d61&site=xueshu_se&hitarticle=1

[3] 无损数据压缩、算法比较和实现

https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CMFD&dbname=CMFD202101&filename=1020119610.nh&uniplatform=NZKPT&v=AYHUqrFSf5vzwjQ0OvGcQtr6edlzSPP0VWOuvMSWCecY2bK0v7OcHQXB_DTlr94T

[4] LZ77 Parsing, et c.

https://www.cs.helsinki.fi/u/puglisi/dct2017

缩略语列表

缩写英文中文
ACAlternating Current交流
ASWDRAdaptively Scanned Wavelet Difference Reduction自适应扫描小波差约简
ATMAsynchronous Transfer Mode异步传输模式
CRCompression Ratio压缩比
CREWCompression with Reversible Embedded Wavelets可逆嵌入小波压缩
CSSCascading Style Sheets层叠样式表
DCData Compression数据压缩
DCTDiscrete Cosine Transform离散余弦变换
DWTDiscrete Wavelet Transform离散小波变换
EBCOTEmbedded Block Coding with Optimised Truncation优化截断的嵌入式块
ECEmbedded Coding嵌入式编码
EPWICEmbedded Predictive Wavelet Image Coder嵌入式预测小波图像
ETCEncryption Then Compression加密后压缩
EZWEmbedded Zerotree Wavelets嵌入式零树小波
GWGeometric Wavelet几何小波
HVSHuman Visual System人类视觉系统
JPEGJoint Photographic Experts Group联合图像专家组
LIPList of Insignificant Pixels不重要像素列表
LISList of Insignificant Sets不重要集合列表
LSPList of Significant Pixels重要像素列表
LZWLempel-Ziv-Welch蓝波-立夫-卫曲编码法
LZMALempel-Ziv-Markov chain-Algorithm
MSEMean Square Error均方误差
MPEGMotion Pictures Expert Group动态图像专家组
PSNRPeak SignaN-to-noise Ratio峰值信噪比
RLERun Length Encoding游程编码
ROIRegion Of Interest感兴趣区域
SBSub Bands子带
SFQSpace Frequency Quantization空频量化
SPECKSet Partitioned Embedded bloCK设置分区嵌入式块
SPIHTSetPartitioning in Hierarchical Trees多级树集合分裂
SRStack Run堆栈运行
SVDSingular Value Decomposition奇异值分解
VQVector Quantization向量量化
WDRWavelet Difference Reduction小波差约简
WMSNWireless Multimedia Sensor Network无线多媒体传感器网络
WSNWireless Sensor Networks无线传感器网络

写在最后

OpenHarmony 成长计划—“啃论文俱乐部”(以下简称“啃论文俱乐部”)是在 2022年 1 月 11 日的一次日常活动中诞生的。截至 3 月 31 日,啃论文俱乐部已有 87 名师生和企业导师参与,目前共有十二个技术方向并行探索,每个方向都有专业的技术老师带领同学们通过啃综述论文制定技术地图,按“降龙十八掌”的学习方法编排技术开发内容,并通过专业推广培养高校开发者成为软件技术学术级人才。

啃论文俱乐部的宗旨是希望同学们在开源活动中得到软件技术能力提升、得到技术写作能力提升、得到讲解技术能力提升。大学一年级新生〇门槛参与,已有俱乐部来自多所高校的大一同学写出高居榜首的技术文章。

如今,搜索“啃论文”,人们不禁想到、而且看到的都是我们——OpenHarmony 成长计划—“啃论文俱乐部”的产出。

OpenHarmony开源与开发者成长计划—“啃论文俱乐部”学习资料合集

1)入门资料:啃论文可以有怎样的体验  

https://docs.qq.com/slide/DY0RXWElBTVlHaXhi?u=4e311e072cbf4f93968e09c44294987d

2)操作办法:怎么从啃论文到开源提交以及深度技术文章输出https://docs.qq.com/slide/DY05kbGtsYVFmcUhU  

3)企业/学校/老师/学生为什么要参与 & 啃论文俱乐部的运营办法https://docs.qq.com/slide/DY2JkS2ZEb2FWckhq

 4)往期啃论文俱乐部同学分享会精彩回顾: 

同学分享会No1.成长计划啃论文分享会纪要(2022/02/18)  https://docs.qq.com/doc/DY2RZZmVNU2hTQlFY  

同学分享会No.2 成长计划啃论文分享会纪要(2022/03/11)  https://docs.qq.com/doc/DUkJ5c2NRd2FRZkhF  

同学们分享会No.3 成长计划啃论文分享会纪要(2022/03/25) 

https://docs.qq.com/doc/DUm5pUEF3ck1VcG92?u=4e311e072cbf4f93968e09c44294987d

现在,你是不是也热血沸腾,摩拳擦掌地准备加入这个俱乐部呢?当然欢迎啦!啃论文俱乐部向任何对开源技术感兴趣的大学生开发者敞开大门。

后续,我们会在服务中心公众号陆续分享一些 OpenHarmony 开源与开发者成长计划—“啃论文俱乐部”学习心得体会和总结资料。记得呼朋引伴来看哦。

扫码添加 OpenHarmony 高校小助手,加入“啃论文俱乐部”微信群