像ZIP这样的文件压缩的核心步骤之一是使用先前解码的文本作为参考源。例如,编码的流可以说“接下来的219个输出字符与5161字节前的解码流中的字符相同。”这样可以用3个字节左右来表示219个字符。 (ZIP还有更多内容,例如霍夫曼压缩,但我只谈到了参考匹配。)
我的问题是字符串匹配算法的策略是什么。即使查看zlib等源代码,似乎也无法得到压缩匹配算法的良好描述。
问题可以陈述为:给定一个文本块,比如30K的文本块,和一个输入字符串,找到30K文本块中与输入字符串前面完全匹配的最长参考。当进行迭代时,算法必须高效,即文本块将通过从前面删除一些字节并向后添加新的字节来进行更新,并执行新的匹配。
我对讨论如何实现算法更感兴趣,而不是源代码或库。(zlib的源代码非常好!)我怀疑可能有几种不同的方法,存在不同的权衡取舍。