Skip to content

压缩算法

· 6 min

压缩算法基础#

一堆数据相当于一块海绵,可以通过压缩算法来压缩其体积,但是最终不能够无限制的进行压缩,最多把海绵中的空气挤出来不能够把海绵本身完全挤没。

无损压缩算法#

无损压缩算法可以保证数据不被丢失。

常见的无损压缩算法有哈夫曼编码、字典编码、预测编码

有损压缩算法#

顾名思义,这种算法会导致数据部分损失,适用于媒体传输,对数据的完整性要求不高的场景。

常见的有损压缩算法有转换编码、量化、基于模型的压缩

LZ77压缩算法#

简介#

LZ77算法是一个无损压缩算法,是一种基于字典的压缩算法,现代很多压缩算法都是基于LZ77。

原理介绍#

定义以下几个:

待编码区域的第一个数据开始,从已编码区域中寻找这样的一个子串,使得子串和待编码区域起始位置的串相同。如果能找到这样的一个串,则返回一个组**(O,L),其中O表示两个匹配串的偏移值,即待编码区第一个数据到已编码数据**中串的第一个数据;L表示找到的串的长度。

一旦找到一整个串,就将这个待编码区的串全部放到已编码区中,并且返回那个组。

如果从第一个数据开始就没有找到对应串,则返回一个**(0,0,Byte),其中Byte是这个待编码区没有找到的串,并且将这个数据放进已编码区**。

对一个要进行编码的串,编码之后就会变成一系列的组,然后这个组本身就代表了压缩前的字符串。

简单代码实现。

解压缩#

有了一整个压缩后的串之后,就从前往后对每一个组进行解码。

缺陷#

原本的数据是一系列的字符,那么将这些字符转化成一系列的组按理说可以减少编码的字符数量。

实际上,我们想象一个字符串,其中每一个字符第一次出现时都需要以一个组(0,0,Byte)表示,那么也就是将一个字符变成了三个字符!在这里就会失去压缩的意义,因为数据竟然变多了。当然我们可以将(0,0,Byte)进行特殊处理,将其直接记为Byte。

再想象一下,如果在待编码区遇到了一个数据,这个数据在已编码区出现过,那么就用一个组来表示它,也就是一个字符变成了两个字符!和上面类似,直接用一个字符来记录它。

再一次考虑一种情况,这个待编码区的子串长度为2,那么会用两个字符的组来表示,也就是说数据量基本没有被压缩。

以上的情况告诉我们,当串的长度小于三时,压缩是没有意义的,空间并不能够被压缩

LZ78算法#

简介#

LZ78和LZ77类似,但是不是采用滑动窗口而是字典的形式。

原理介绍#

从前向后进行编码,会遇到以下三种情况,进行不同的操作。

简单实现

解压缩#

Huffman压缩算法#