对一个文件重复应用不同的压缩算法是否有效?

Is it effective to repeatedly apply different compression algorithms to one file?

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

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

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

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

查看 here 了解更多信息。

没有
我们使用"weight"一个文件的单位是byte.
字节只是更基本单位的倍数。

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

现在如果你想爬上一座 20 米高的山,体重 50 公斤,你至少需要 E = mgh = 50 · 9.81 · 20 = 9810 J.
无论你做什么,你至少需要 那种能量,否则你将无法到达那里 1.
也可以有更多的能量,最低9810J。

同样的道理也适用于信息。一个文件携带的消息需要 至少 X 位信息才能被明确理解。
大多数文件包含的信息量比最少的信息量要多,因为文件被设计得易于处理。
这就像一个人在英语中说 "I am going out" 而不是 "going out"。两者都给出相同的信息,但一个更容易处理但时间更长。

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

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

我们这样给一个字符串s分配一个权重:我们考虑所有的算法A在处理a,new,字符串 Ma 输出 s.
我们将每个 AMa 编码为一个字符串,并将 K(s) 设置为字符串的长度此类字符串的 最短
K(s)称为s最小描述符,表示生成s所需的最小信息=32=]s。

如果 K(s) 小于长度 s 则称 s 可压缩.
我们现在证明有 不可压缩的 字符串。

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

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


1我们这里只涉及简单的牛顿物理学。

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

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

Algorithm compress00:

If the first two bits in the file are 00, replace those two bits with a single 0 bit - in this case, the file is 1 bit shorter. Otherwise, prepend a 1 to the file - in this case, the file is 1 bit longer.

该算法很容易逆向(即,输出可以明确解压缩)并且它可以将文件缩短或延长 1 位。想象一个由 4 个压缩器组成的家族:compress00, compress01, compress10, compress11,它们都具有相同的行为,除了,例如,compress01 如果文件以 01 开头则缩短文件,否则延长文件,等等对于其他压缩机。

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

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