字典编码本质上是将在字典中出现过的字符串使用一个索引值代替,以此来达到压缩目的。基于字典的压缩算法有很多,LZ77和LZ78是最原始的两个算法,后者是前者的变体,原理基本上相似。本文对LZ77字典编码的压缩和解压缩流程进行介绍。
一、什么是LZ77字典编码
LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年,是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77。
LZ77字典编码把整个滑动窗口分为2个区域,左侧为字典区,右侧为待编码区。
LZ77编码器在字典区查找,直到找到匹配的字符串。匹配字符串的开始位置与离字典区右边的距离称为“偏移值”,匹配字符串的长度称为“匹配长度”。LZ77在编码时,会一直在字典区中搜索,直到找到最大匹配字符串,然后输出一个三元祖(off, len, char),off表示偏移值,len表示匹配长度,char为待编码区第一个等待编码的字符。
偏移值实际上可以有两种,第一种是匹配字符串的开始位置离字典区左边的距离,第二种是匹配字符串的开始位置离字典区右边的距离,一般使用第二种。
二、LZ77编码的压缩流程
在编码前要指定滑动窗口的大小,这里设置为8,其中字典区窗口大小为5,待编码区窗口大小为3。
现在有字符串“AABCBBABC”,现在对其进行编码。
(1)编码开始,窗口初始位置如图
由上图可见,待编码区有“AAB”三个字符,此时字典区为空。现在编码第一个字符A,由于字典区为空,故匹配不到的字符串。当匹配不到字符串时,规定偏移值为0,匹配长度也为0,此时待编码区第一个等待编码的字符为A,故输出(0,0, A),然后滑动窗口右移一个单位,