0%

LZ77算法

LZ77和哈夫曼编码区别?适用场景上有有什么不同?

哈夫曼编码是基于统计的数据压缩编码,需要先获得信息源的字符出现频率,然后再进行压缩。

但是,如果信息源是流式传输的,就没办法预先做统计,需要换一种思路。

LZ77利用数据的重复结构信息来进行数据压缩,是基于字典的压缩算法,可以做流逝压缩。

GZIP压缩的过程就是先用LZ77算法进行流式压缩,再对结果做哈夫曼编码压缩。

为什么叫LZ77?

由以色列的两位大神Jacob Ziv与Abraham Lempel在1977年发表的论文《A Universal Algorithm for Sequential Data Compression》中提出。

LZ77算法思想概述

核心思想:利用短语表示数据的重复结构信息来进行数据压缩。

LZ77算法一般称为“滑动窗口压缩”,算法的核心是在前面的历史数据中寻找重复字符串。

通过滑动窗口实现动态字典,用前面出现过的字符串作为字典通过映射(与前一个字符串的距离和字符串长度)替代后面重复出现的字符串。

重复现象是具有局部性的,它的基本假设是,如果一个字符串要重复,那么也是在附近重复,远的地方就不用找了,因此设置了一个滑动窗口。

其方式就是把数据中一些可以组织成短语(最长字符)的字符加入字典,然后再有相同字符出现采用标记来代替字典中的短语,如此通过标记代替多数重复出现的方式以进行压缩。

滑动窗口越大,压缩的效果越好,因为编码的短语越多,但是压缩速度越慢,因为要计算的短语数量越多。

基于字典是什么意思?

滑动窗口内的字符都是已经出现过的字符,已经出现过的字符会编码为字典短语,后面前向缓冲窗口中的字符如果和字典中的短语相同,就用距离和字符串长度来表示,以达到压缩的目的。

LZ77压缩效果

大多数情况下LZ77压缩算法的压缩比相当高。

实际压缩率和选择的滑动窗口大小、前向缓冲区大小、数据熵有关系。

LZ77缺点

压缩过程是比较耗时,因为要花费很多时间寻找滑动窗口中的短语匹配。

不过解压过程很快,因为每个标记都明确告知在哪个位置可以读取了。

什么特征的文本用LZ77压缩效果好?

压缩就是用更短的符号来表示重复出现的字符串。

压缩就是寻找文本的内容分布概率,将出现频率高的部分代替成更短的形式。

内容越是重复,就可以压缩的更小。

内容如果毫无重复,就很难压缩。

LZ77详细原理

参见: Linux(程序设计):28—数据流压缩原理(Deflate压缩算法、gzip、zlib)

为什么GZIP在用LZ77压缩过后还要进行哈夫曼编码?

LZ77编码后得到的是,距离(distance)和长度(length),还有未匹配到短语字典的原始字符(literal)。

比较短的距离和长度可能是频繁出现的,就可以用变长编码来压缩,且文本已经确定下来不会变动,可以做词频统计,就可以用到哈夫曼编码了。

参考资料