DEFLATE 如何优化这么多?
How does DEFLATE optimize this so much?
我正在尝试了解 deflate 算法,并且我已经阅读了 Huffman 代码以及 LZ77 压缩。我正在研究不同字符串的压缩大小,我偶然发现了一些我无法解释的东西。字符串 aaa
通过 zlib and gzip 压缩后的大小与 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
相同(36 a
s)。
在阅读这篇文章之前,我假设压缩器会做一些事情,比如存储 36*a 而不是单独存储每个字符,但我在规范中找不到任何提到的地方。
使用固定的 Huffman 代码产生相同的结果,所以我假设 space-saving 在于 LZ77,但它只使用距离-长度对。这如何允许 3 长度的字符串在不增加大小的情况下扩展 12 倍?
在中间用一个或多个 b
中断 a
的字符串会大大增加大小。如果距离-长度对正在做这项工作,为什么它在向后搜索时不能跳过 b
s 呢?还是正在使用霍夫曼编码,而我误解了固定霍夫曼编码的含义?
36 个“a”实际上是由 LZ77 编码的 运行-length,方法是将第一个“a”作为文字,然后进行距离为 1、长度为 35 的匹配。 deflate 的长度可以达到 258。
在线查找有关 LZ77、霍夫曼编码和 deflate 的教程。您可以使用 infgen 反汇编生成的压缩数据,以更深入地了解数据的表示方式。
我正在尝试了解 deflate 算法,并且我已经阅读了 Huffman 代码以及 LZ77 压缩。我正在研究不同字符串的压缩大小,我偶然发现了一些我无法解释的东西。字符串 aaa
通过 zlib and gzip 压缩后的大小与 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
相同(36 a
s)。
在阅读这篇文章之前,我假设压缩器会做一些事情,比如存储 36*a 而不是单独存储每个字符,但我在规范中找不到任何提到的地方。
使用固定的 Huffman 代码产生相同的结果,所以我假设 space-saving 在于 LZ77,但它只使用距离-长度对。这如何允许 3 长度的字符串在不增加大小的情况下扩展 12 倍?
在中间用一个或多个 b
中断 a
的字符串会大大增加大小。如果距离-长度对正在做这项工作,为什么它在向后搜索时不能跳过 b
s 呢?还是正在使用霍夫曼编码,而我误解了固定霍夫曼编码的含义?
36 个“a”实际上是由 LZ77 编码的 运行-length,方法是将第一个“a”作为文字,然后进行距离为 1、长度为 35 的匹配。 deflate 的长度可以达到 258。
在线查找有关 LZ77、霍夫曼编码和 deflate 的教程。您可以使用 infgen 反汇编生成的压缩数据,以更深入地了解数据的表示方式。