LZ77算法的说明网上很多,本文为个人见解,仅供参考。
本人认为LZ77算法其实是字典压缩的一个变种,与字典压缩不同的是,它的字典是动态生成的并且只有一个,一般选取一定数量的最近压缩过数据。保存这些数据的结构叫做滑动窗口,所以LZ77有被常称作滑动窗口算法。至于这么生成字典的原因,其实很简单,因为我们认为一个要压缩的字符串很有可能与上下文相关,也就是说很有可能在刚压缩的字符串中出现过。要压缩的字符串会与滑动窗口中的字符匹配并用三元组的形式来表示(不懂请看例子),以下的一个LZ77的压缩例子,能很好的说明此算法的流程,这个例子网上有,本文只是更通俗易懂的展现之。
有一个要压缩的串abcdbbccaaabaeaaabaee
假设前面10个字符已经被压缩,并且设置滑动窗口为10个字符。
窗口 | 未压缩 | 相同字符串 | 相同字符串起始位置 | 相同字符串长度 | 相同字符串后一字符 | 压缩码 |
abcdbbccaa | abaeaaabaee | ab | 0 | 2 | a | (0,2,a) |
dbbccaaaba | eaaabaee | null | 0 | 0 | e | (0,0,e) |
bbccaaabae | aaabaee | aaabae | 4 | 6 | e | (4,6,e) |
压缩码为(0,2,a)(0,0,e)(4,6,e)
算法其实原理就是这,至于后续工作请查阅其他资料。