【问题标题】:gzipped file is smaller than Shannon limit?gzip压缩文件小于香农限制?
【发布时间】:2021-10-22 11:30:00
【问题描述】:

我有一个大小为 664KB 的文本文件(使用 ls -l)。据我了解,不能将文件压缩为小于Shannon Source Coding limit 的任何内容,而不会导致信息丢失。 我在这里使用了一个程序来计算文本文件的平均香农熵(4.36)并将其乘以它的字符数。我得到 371KB

然后,我使用了据我了解是无损的 bzip2,发现它把文件压缩到 171K。据我了解,没有什么可以压缩小于香农限制而不会丢失信息,那么bzip如何无损压缩比它小的文件呢?我是否遗漏了一些关于操作系统如何编码文件的信息?

The text file I used for this experiment is MIT Classic's The Republic by Plato.

The program I used to calculate shannon entropy is this one。它给了我与我用来交叉检查它的另一个程序相同的结果。

【问题讨论】:

  • 如果您所做的只是逐字节对数据进行熵编码,则该限制将适用。但这不是这些算法所做的。他们还对数据执行各种转换,并对结果进行编码。 |例如,考虑 256 字节的线性序列,其值从 0 到 255。(如 0,1,2,3,4...,254,255)。那是什么熵?现在 delta 代码首先(计算连续字节之间的差异) - 你会得到一个 0,然后是很多 1。现在转换后的数据的熵是多少?
  • 或者,假设我们有相同的序列连续重复 100 次。一旦前 256 个字节被编码,您可以通过说“重复最后 256 个字节 99 次”来处理其余的字节。这就是基于 LZ 的算法所做的那种转换。
  • 要在实践中看到这一点,请尝试随机打乱文件中的字符并测量压缩后的大小(甚至多次)。

标签: algorithm unix compression


【解决方案1】:

的确,通常我们不能比香农熵更好地压缩(假设没有损失),而且确实所有 zip 编码都是无损的。

但是,有几点必须考虑。

对于香农熵(与某种对数熵相反),假设信息的统计模型。

在某些特定情况下(并非完全随机,遵守某些规则..),可能没有统计模型可以完美地处理我们可以拥有的所有先验知识。

但是,这不是这里最重要的问题。通过查看您使用的代码,似乎唯一考虑的统计信息是每个字符的频率。这隐含地假设字符之间没有相关性。

很明显,这是一个非常严格的假设,当然对于文本文件无效。

很明显,您的压缩算法能够从相邻字符之间的相关性中受益。

【讨论】:

    【解决方案2】:

    这完全取决于模型。

    您计算中使用的模型是每个字节值都有一些独立的概率。这称为“0 阶”,因为每个字节位置的概率取决于前面的零个字节。

    更复杂的模型将使用来自前面字节的信息来生成当前字节的概率分布。 bzip2 使用其他字节的上下文,所有通用无损压缩器(如 gzip 和 xz)也是如此。

    顺便说一句,pigz 有一个 -H--huffman 选项,它执行 0 阶压缩(仅限霍夫曼编码),并且将接近您正在计算的 0 阶香农限制。

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多