【问题标题】:Is it effective to repeatedly apply different compression algorithms to one file?对一个文件重复应用不同的压缩算法是否有效?
【发布时间】:2016-11-29 09:05:52
【问题描述】:

我知道通过重复应用一种算法来无限压缩文件是不可能的。

但是无论文件的结构是什么,是否可以通过重复应用不同的算法来继续压缩文件?

【问题讨论】:

标签: compression computer-science theory


【解决方案1】:

是的,你可以 - 直到文件最终变为空 - 但当然你只是将熵从文件本身转移到压缩算法的选择中(并转移到选择哪种压缩算法的记录)。

例如,让我定义以下压缩器,它查看文件中的前两位,然后对这些位进行编码,然后输出文件的其余部分不变。

算法compress00:

如果文件中的前两位是00,则替换这两位 有一个 0 位 - 在这种情况下,文件短 1 位。 否则,在文件前面加上 1 - 在这种情况下,文件是 1 位 更长。

这种算法很容易可逆(即,输出可以明确解压缩),它可以将文件缩短或延长 1 位。想象一个有 4 个压缩器的系列:compress00, compress01, compress10, compress11,它们都具有相同的行为,除了例如,compress01 如果文件以 01 开头则缩短文件,否则延长文件,其他压缩器以此类推。

现在请注意,每个至少有两位的文件都以 00、01、10 或 11 开头 - 所以在重复压缩过程的每个阶段,您可以选择将文件压缩 1 位的算法。重复应用此过程会将文件减少到单个位(您可以为 1 位文件定义一些额外的行为以减少到 0 位)。

当然,此方法的一个非常小的缺点是,要有效地解压缩,您需要记住在每个步骤中选择了哪些压缩器。

【讨论】:

  • 尝试估计记住压缩器序列所需的熵,你会发现一个很好的惊喜:) 这就是为什么 Sipser 在字符串描述符中明确包含算法的原因。说真的,这根本不是“小”缺点!
  • @MargaretBloom - 也许,但你可能错过了一两个隐含的开玩笑。尽管如此,它仍然是对 OP 问题的明确措辞的有效答案!此外,您可以争辩说,记住压缩器序列所需的熵可以存储在某个边带位置,该位置可能不是问题中定义的“大小”的一部分,例如,在文件扩展名中。
【解决方案2】:

没有。
我们用来“加权”文件的单位是字节
字节只是更基本单位 bit 的倍数。

“bit”这个词虽然来自“Binary digit”,但实际上是一个度量单位,就像焦耳等等。
有点衡量可测量的最小信息量,就像e是最小的电荷。
当我们说一个文件的大小为 2 MiB 时,我们是在说有 220 + 3 = 8.388.608 位信息。

现在,如果你想爬上 20 米高、体重 50 公斤的山,你需要至少 E = mgh = 50 · 9.81 · 20 = 9810 J.
不管你做什么,你都需要至少那种能量,否则你就达不到目标1
您也可以拥有更多能量,最低为 9810 J。

同样的道理也适用于信息。文件中包含的消息需要至少 X 位信息才能明确理解。
大多数文件包含的信息量超过了最少量的信息,因为文件易于处理。
这就像一个人用英语说“我要出去”而不是“出去”。两者都提供相同的信息,但一个更容易处理但时间更长。

因此,我们可以直观地删除文件的冗余,从而减小文件大小,直到达到最小值 X
在达到最小值后继续删除位将意味着删除有用的信息,防止原始文件被恢复(阅读:解压缩)。
这实际上是通过 有损 算法完成的,例如 MP3、JPEG 等。

字符串不能被无限压缩的直觉很容易证明。
我们遵循 Sipser 的 Introduction to Theory of Computation 第 6.4 章的方法。

我们以这种方式为字符串 s 分配权重:我们考虑所有算法 A,当处理一个新的字符串 Ma 输出s
我们将每个 AMa 编码为一个字符串,并将 K(s) 设置为 shortest 的长度
K(s)被称为s最小描述符,表示生成所需的最小信息s

如果K(s)小于s的长度s就说可压缩
我们现在表明存在 不可压缩 字符串。

假设 s 的长度为 n。有 2n 个可能的此类字符串。
如果 s 是可压缩的,那么它的最小描述符长度最多为 n-1
有 1 + 2 + 4 + 8 + ... + 2n-1 = 2n - 1 个这样的描述符。
由于每个描述符都唯一地定义了一个字符串,并且描述符少于长度为 n 的字符串,因此某些长度为 n 的字符串是不可压缩的。
由任意 n 个任意长度的不可压缩字符串存在。

简而言之,如果我们继续压缩,我们最终会得到一个不可压缩的文件。 在实践中,一个好的压缩算法应该在第一步去除大部分冗余而不添加大量信息。
这就是为什么压缩 jpeg(一种已经压缩的格式)不会产生与压缩文本文件相同的结果。 这也解释了为什么加密文件看起来是随机的,所以没有任何冗余,不能很好地压缩。


1 我们这里只处理简单的牛顿物理。

【讨论】:

  • 公平地说,OP 允许使用多种不同的算法。在这种情况下,来自 ITC 的上述关于可压缩性限制的证明不适用:因为现在每个描述符都可以定义 多个 字符串,具体取决于使用的算法。实际上,使用的描述符现在是一个元组(描述符,算法),并且可以在选择算法时隐藏任意数量的信息。例如,请参阅我对一系列简单算法的回答,这些算法可以重复选择并应用于压缩 any 文件。
  • ...当然,有一个小问题要记住使用了哪种算法,但如果 OP 有很好的记忆力,也许这不是问题: )
  • @BeeOnRope 描述符包含算法 A 的编码,实际上是一个 TM。连续应用不同的算法仍然是一种算法,所以我们最多需要一个描述符。这个证明是普遍有效的,这就是计算理论的力量。 :)
  • 当然,但是你证明的东西与 OP 所要求的不同,因此它并不直接适用于 OP 的问题! OP 明确询问“小文件”,即他们感兴趣的描述符是输出字符串,与解码它的 TM 分开。他们没有在文件大小中包含压缩器的大小(因为大多数人没有 - 如果我说“嘿,我要给你发送一个 20k 的 gzip 压缩文件,文件本身将是 20k,并且不会包含系统上 gzip 二进制文件的大小)。
  • @BeeOnRope 您仍然需要 TM。现在,如果您使用 gzip 作为 TM,您可以在许多不同的文件上使用它,如果您使用特定的程序,例如压缩器序列,它只能在单个文件上使用。因此,您必须为每个文件发送一个新序列。无论如何,很抱歉在我下面的评论中错过了半开玩笑:)
【解决方案3】:

你可以,但它没有任何区别。大多数压缩算法都是基于减少冗余来运行的,但有些算法效率更高,因此速度更慢。

现在,当您应用第一个算法时,它会减少这些冗余,因此应用第二个算法并没有太大区别。

查看here了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多