Gzip源代码分析(二)

本文深入分析了Gzip压缩中的LZ77算法,探讨了滑动窗口和哈希表的实现细节。LZ77算法用于字符串匹配,通过哈希表加速查找,限制哈希表大小和匹配长度以优化压缩效果。滑动窗口在内存中保存最近的W字节数据,Gzip使用64K缓存来模拟窗口,并在处理完数据后刷新。哈希表由head[]和prev[]数组构成,处理哈希冲突并存储匹配信息。在扫描和压缩过程中,不断更新哈希表,确保有效匹配。
摘要由CSDN通过智能技术生成

LZ77算法的实现

LZ77算法其实就是一个字符串匹配的算法。就是要顺序扫描待压缩文件的每一字节,查找当前这一字节开头的串(以下称“当前串”,当前串起始地址确定,但长度不确定)是否在已扫描过的文本中出现过,以及出现的位置。

为了快速查找当前串的匹配串,需要一张哈希表来记录之前出现的字符串的位置。但是这张哈希表可能非常之庞大。因为,单是从某一字节开始的串就有长度从12,3,……的一系列串, 要是待压缩文件又很大,处理到最后可能哈希表的规模会爆炸性增长。

所以,必须做一些限制。

一个限制是哈希表只记录固定长度(比如3字节长)的串的位置,不过这个限制其实并不影响更长串的匹配。因为通过哈希表至少已经能找到一些可能匹配的串的起始位置了,然后再做逐字节的匹配,直到不能匹配为止,匹配的长度越长越好。

另一个限制是,只匹配当前字符串之前W个字节范围内的串,这段随着扫描向前移动的W字节范围,就是所谓的滑动窗口。由于匹配只在滑动窗口范围内进行,所以压缩效果会略受影响。

第一个限制中的“固定长度”,也叫做“最小匹配长度”。如果滑动窗口大小已经确定下来,那么这个最小匹配长度也就能计算出来。

因为匹配只在滑动窗口中进行,匹配距离最大也就是W;既然是压缩,用(距离,长度)代替当前串后应该比原来占的空间少才行,直观上想象,匹配长度越长,压缩的效果就越好,反之,匹配长度越小,压缩效果就越差,当匹配长度小于某个值时,完全起不到压缩作用。如果匹配长度用L表示,并且假设(距离,长度)在上下文中能自说明,即不需要用额外的描述符标明这是一个(距离,长度

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值