LZ77数据压缩算法详解
1. 数据压缩与解压缩原理
在使用LZ77算法进行数据压缩时,在任意时刻,前瞻缓冲区(look - ahead buffer)和滑动窗口(sliding window)之间存在两种情况:
- 存在一定长度的匹配短语。
- 完全没有匹配项。
当存在至少一个匹配时,我们将最长匹配编码为短语标记(phrase token)。短语标记包含三部分信息:
- 滑动窗口中匹配开始的偏移量。
- 匹配的符号数量。
- 匹配后前瞻缓冲区中的第一个符号。
当没有匹配时,我们将未匹配的符号编码为符号标记(symbol token)。符号标记仅包含未匹配的符号本身,实际上并没有实现压缩,甚至会因为多包含一位而导致轻微的膨胀。
生成编码了n个符号的适当标记后,我们将n个符号从滑动窗口的一端移出,并在另一端用从前瞻缓冲区移出的相同数量的符号替换。然后,我们重新填充前瞻缓冲区。这个过程确保滑动窗口始终只包含最新的短语。滑动窗口和前瞻缓冲区维护的短语的确切数量取决于它们的大小。
在实际应用中,典型的滑动窗口大小约为4K(4096字节),前瞻缓冲区通常小于100字节。
解压缩数据时,我们通过解码标记并以类似于压缩过程的方式更新滑动窗口。解码每个标记时,我们将标记编码的符号复制到滑动窗口中。遇到短语标记时,我们参考滑动窗口中的适当偏移量并查找指定长度的短语;遇到符号标记时,我们生成标记中存储的单个符号。
下面是一个使用LZ77压缩字符串“ABABCBABABCAD”的示例:
|步骤|原始数据|压缩数据|
| ---- | ---- | ---
超级会员免费看
订阅专栏 解锁全文
1222

被折叠的 条评论
为什么被折叠?



