Gzip/Deflate 是否识别模式

Does Gzip/Deflate recognize patterns

我正在研究 Gzip 的内部工作原理,我了解到它使用了 Huffman Coding and LZ77 的组合。

我也意识到一个Gzip文件被分成块,每个块都有一个为它构建的字典。然后将频繁出现的相似数据替换为指向字典中位置的指针。

所以短语 "horses race other horses" 会将单词 horses 替换为指针。

但是,如果我有一个 32 位整数数组,但它只存储最多 24 位的数字怎么办?为了争论起见,可以说这些 24 位数字是非常随机的,很难压缩,也很难在其中找到重复。

这将使每个整数的前 8 位成为易于压缩的 0 字符串,但每个字符串都需要一个指针,并且每个指针仍占用一定量的数据。即使是 1 位指针(我知道这比实际可能的要小)仍然会占用原始 space 的 12.5%。

当数组可以很容易地简化为“24 位”数组并具有基本模式识别时,这似乎有些多余。

所以我的问题是:

Gzip 是否包含任何比字典指针更好地压缩文件的机制?

Gzip 压缩少量重复数据以及随后难以压缩的少量数据的效果如何?

每个 deflate 块都没有 "dictionary built for it"。为每个放气块构建的是一组用于 literal/length 符号和距离符号的霍夫曼代码。

您引用的字典只是 32K 字节的未压缩输入,紧接在当前正在压缩的字节之前。而已。每个length/distance对可以引用最后32K中的一个3到258字节的字符串。这与放气块无关,并且此类引用通常返回一个或多个块。

Deflate 无法很好地尝试压缩三个随机字节、零字节、三个随机字节、零字节的序列......不会有有用的重复字符串,其中 deflate 只能对 Huffman 编码文字,零更频繁。它会将 0 编码为两位,因为它们出现的概率略高于 25%,而其余文字至少各占 8.25 位。对于此数据,平均每字节约 6.7 位或压缩率为 0.85。事实上 gzip 在这个数据上给出了大约 0.86。

如果您想压缩该序列,只需删除零字节!然后您就完成了,无法以 0.75 的比率进一步压缩。