LZ77算法的实现
LZ77算法其实就是一个字符串匹配的算法。就是要顺序扫描待压缩文件的每一字节,查找当前这一字节开头的串(以下称“当前串”,当前串起始地址确定,但长度不确定)是否在已扫描过的文本中出现过,以及出现的位置。
为了快速查找当前串的匹配串,需要一张哈希表来记录之前出现的字符串的位置。但是这张哈希表可能非常之庞大。因为,单是从某一字节开始的串就有长度从1,2,3,……的一系列串, 要是待压缩文件又很大,处理到最后可能哈希表的规模会爆炸性增长。
所以,必须做一些限制。
一个限制是哈希表只记录固定长度(比如3字节长)的串的位置,不过这个限制其实并不影响更长串的匹配。因为通过哈希表至少已经能找到一些可能匹配的串的起始位置了,然后再做逐字节的匹配,直到不能匹配为止,匹配的长度越长越好。
另一个限制是,只匹配当前字符串之前W个字节范围内的串,这段随着扫描向前移动的W字节范围,就是所谓的滑动窗口。由于匹配只在滑动窗口范围内进行,所以压缩效果会略受影响。
第一个限制中的“固定长度”,也叫做“最小匹配长度”。如果滑动窗口大小已经确定下来,那么这个最小匹配长度也就能计算出来。
因为匹配只在滑动窗口中进行,匹配距离最大也就是W;既然是压缩,用(距离,长度)代替当前串后应该比原来占的空间少才行,直观上想象,匹配长度越长,压缩的效果就越好,反之,匹配长度越小,压缩效果就越差,当匹配长度小于某个值时,完全起不到压缩作用。如果匹配长度用L表示,并且假设(距离,长度)在上下文中能自说明,即不需要用额外的描述符标明这是一个(距离,长度