发布时间: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. 编码算法
-
把coding position设置到输入流的开始处
-
找到window中与lookahead buffer最长的匹配
-
输出(P, C)对:
- P 是pointer,指向window中的匹配
- C是lookahead buffer中第一个未匹配的字符。
-
如果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就是字面上的字符。
5. 解码
以在编码时同样的方式维护window。每次读一个(P, C)对时,输出window中P所指的匹配序列,然后输出字符C。
6. 实用特点
这个算法的压缩率对很多类型的数据都很好,但是编码可能相当耗时,因为要做太多的lookahead buffer和window之间的比对。另一方面来说,解码非常简单且快速。编码和解码的内存需求很低。内存中保存的唯一的结构是window,它通常在4 ~ 64K的大小。