LZ77算法理论

发布时间:2023-07-25 14:58:28

英文介绍文档:https://archive.ph/F4pg7
很短,看一遍10~20分钟应该够了。

1. 算法用到的术语:

  • Input stream

    • 要被压缩的字符序列
  • Character

    • 输入流中的基本数据元素
  • Coding position

    • 输入流中现在正在被编码的那个字符的位置(lookhead buffer的开始位置)。
  • Lookhead buffer

    • 从coding position到输入流末尾的字符序列。
  • Window

    • 大小为W,能够容纳W个字符,从coding position往回数,也就是已经处理的最后W个字符。
  • Pointer

    • 指向window中的匹配(点),同时指定了匹配的length。

2. 压缩原理

算法在window中搜寻和lookhead buffer开始处最长的匹配,然后输出一个指向匹配的pointer。

由于可能一个字符都没匹配到,所以输出不可能值包含pointer。LZ77用这样的方式解决这个问题:在每个pointer后,输出在lookhead buffer中匹配了的后面的第一个字符。如果没有匹配,输出一个null-pointer和coding position处的字符。

3. 编码算法

  1. 把coding position设置到输入流的开始处

  2. 找到window中与lookahead buffer最长的匹配

  3. 输出(P, C)对:

    • P 是pointer,指向window中的匹配
    • C是lookahead buffer中第一个未匹配的字符。
  4. 如果lookahead buffer不为空,将coding position(和window)前向移动L+1个字符,然后返回到步骤2。

4. 一个例子

编码的过程在下面的表(图)中。

  • Step是编码的步数。每次编码算法产生输出算作一步。在LZ77中,发生在编码的第3步。
  • Pos指明 coding position。输入流中的第一个字符的coding position为1.
  • Match是在window中最长的匹配。
  • Char 是lookahead buffer中匹配了的后面第一个字符。
  • Output以(B, L) C的格斯打印输出:
    • (B, L)是指向匹配(Match)的pointer(P)。它给出了解码时的指令:在window中往回B个字符处,拷贝L个字符到输出流。
    • C就是字面上的字符。

LZ77算法理论_第1张图片

5. 解码

以在编码时同样的方式维护window。每次读一个(P, C)对时,输出window中P所指的匹配序列,然后输出字符C。

6. 实用特点

这个算法的压缩率对很多类型的数据都很好,但是编码可能相当耗时,因为要做太多的lookahead buffer和window之间的比对。另一方面来说,解码非常简单且快速。编码和解码的内存需求很低。内存中保存的唯一的结构是window,它通常在4 ~ 64K的大小。

你可能感兴趣的:(算法,数据结构,文档/手册,算法)