Java Deflater 中提到的策略选项起源于 ZLIB 的 zlib (C) 实现和 (RFC 1950 https://www.rfc-editor.org/rfc/rfc1950)和放气(1951 https://www.rfc-editor.org/rfc/rfc1951), 我相信。它们几乎存在于所有实现 DEFLATE 的压缩库中。
要理解它们的含义,您需要了解一些DEFLATE http://en.wikipedia.org/wiki/DEFLATE。压缩算法结合了LZ77和Huffman编码。基础知识是:
-
LZ77 压缩的工作原理是查找重复的数据序列。实现通常使用 1k 到 32k 之间的“滑动窗口”来跟踪之前的数据。对于原始数据中的任何重复,LZ77 压缩不会在输出中插入重复数据,而是会插入“反向引用”。想象一下反向引用说“在这里,插入您在 8293 字节前看到的相同数据,17 字节”。 back-ref 被编码为这对数字:长度 - 在本例中为 17 - 和距离(或偏移量) - 在本例中为 8293。
-
霍夫曼编码用代码代替实际数据。当数据显示 X 时,霍夫曼代码显示 Y。显然,只有当替代数据比原始数据短时,这才有助于压缩。 (反例是金·凯瑞电影中的Yes Man http://www.imdb.com/title/tt1068680/,当诺姆使用“Car”作为卡尔的简称时。卡尔指出卡尔已经很矮了。)霍夫曼编码算法进行频率分析,并使用最短的替代品来代替最常出现的数据序列。
Deflate 将这些结合起来,以便可以在 LZ77 反向引用上使用霍夫曼代码。各种 DEFLATE/ZLIB 压缩器上的策略选项只是告诉库 Huffman 与 LZ77 的权重是多少。
(from zlib 手册页 http://www.zlib.net/manual.html)
...我读到的代码表明它进行 LZ77 匹配,但最多只能匹配 5 个或更少字节的序列。我猜这就是文档所说的“小值”的意思。但文档中没有提到数字 5,因此不能保证该数字不会从一个版本更改为另一个版本,或者从 ZLIB/DEFLATE 的一种实现更改为另一种实现(例如 C 版本和 Java 版本)。
据我所知,在 DEFLATE 中没有办法只做 LZ77。没有LZ77_ONLY
战略。但当然,您可以构建或获取自己的 LZ77 编码器,这将是“仅限 LZ77”。
请记住,该策略永远不会影响压缩的正确性;它只影响它的操作以及它的性能,无论是速度还是大小。
还有其他方法可以调整压缩器。一是设置LZ77滑动窗口的大小。在 C 库中,这是通过“窗口位”选项指定的。如果您了解 LZ77,那么您就会知道较小的窗口意味着更少的回溯,这意味着更快的压缩,但代价是丢失一些匹配项。这通常是压缩时转动的更有效的旋钮。
底线是,对于 80% 的情况,您不关心调整策略。您可能有兴趣摆弄窗口位,只是为了看看会发生什么。但只有当您完成了应用程序中需要执行的所有其他操作后,才可以执行此操作。
参考:
DEFLATE 的工作原理,作者:Antaeus Feldspar http://zlib.net/feldspar.html