J.Ziv和A.Lempel在1978年首次发表了介绍第二类词典编码算法的文章。在他们的研究基础上,Terry A.Wlch在1984年发表了改进这种编码算法的文章。因此把这种编码方法称为LZW压缩算法。
LZW算法又叫“串表压缩算法”就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。 LZW压缩算法是Unisys的专利,有效期到2003年,所以对它的使用已经没有限制了。
两个重要概念:
前缀(prefix):一个词组的前面一个字符 ,比如 ab,前缀为a,8f前缀为8;
后缀(suffix):反之,为后一个字符,比如 ab,后缀为b,8f后缀为f;
算法流程:
对于字符串ababbacb。初始字典为{a, b, c}。
步骤 | 前缀 | 后缀 | 词 | 存在对应码 | 输出 | 码 |
---|---|---|---|---|---|---|
1 | a | (, a) | ||||
2 | a | b | (a, b) | no | a | 256 |
3 | b | a | (b, a) | no | b | 257 |
4 | a | b | (a, b) | yes | ||
5 | 256 | b | (256, b) | no | 256 | 258 |
6 | b | a | (b, a) | yes | ||
7 | 257 | c | (257, c) | no | 257 | 259 |
8 | c | b | (c, b) | no | c | 260 |
把输出来的和最后一个后缀连在一起则是:a,b,256,257,c,b这6个字符,那么就达到了压缩的目的。
对应生成的码表则是:
256 | 257 | 258 | 259 | 260 |
---|---|---|---|---|
(a, b) | (b, a) | (256, b) | (257, c) | (c, b) |
解压缩时,将输出字符串按照码表对应转化。a,b,256(ab),257(ba),c,b,即ababbacb,解压成功。