【问题标题】:Does Gzip/Deflate recognize patternsGzip/Deflate 是否识别模式
【发布时间】:2018-05-27 20:32:50
【问题描述】:

我正在研究 Gzip 的内部工作原理,我知道它使用了Huffman CodingLZ77 的组合。

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

因此,短语“horses race other horses”将用指针替换单词 horses

但是,如果我有一个 32 位整数数组,但它只存储最多 24 位的数字呢?为了争论,假设这些 24 位数字非常随机,难以压缩且难以找到重复。

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

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

所以我的问题是:

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

Gzip 压缩少量重复数据的效果如何,其次是少量难以压缩的数据?

【问题讨论】:

    标签: compression gzip deflate


    【解决方案1】:

    每个 deflate 块都没有“为其构建的字典”。为每个 deflate 块构建的是一组用于文字/长度符号和距离符号的 Huffman 代码。

    您所指的字典只是紧接当前正在压缩的字节之前的 32K 字节未压缩输入。就是这样。每个长度/距离对可以引用最后 32K 中 3 到 258 个字节的字符串。这与 deflate 块无关,并且此类引用通常会返回一个或多个块。

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

    如果你想压缩那个序列,只需删除零字节!然后你就完成了,不能以 0.75 的比率进一步压缩。

    【讨论】:

    • 感谢您的回答!它真的帮助我更好地理解 gzip。我想使用 32 位字符串的原因是因为它是我的 cpu 自然使用的,所以当你有一个 24 位字符串时,你必须进行位移操作,而且管理起来更符合逻辑。不过,我想我还是那样做,谢谢!
    猜你喜欢
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2011-11-13
    • 2020-06-05
    • 2022-01-19
    • 1970-01-01
    • 2016-06-18
    相关资源
    最近更新 更多