【发布时间】:2016-11-29 09:05:52
【问题描述】:
我知道通过重复应用一种算法来无限压缩文件是不可能的。
但是无论文件的结构是什么,是否可以通过重复应用不同的算法来继续压缩文件?
【问题讨论】:
-
这个问题可能更适合cs.stackexchange.com
标签: compression computer-science theory
我知道通过重复应用一种算法来无限压缩文件是不可能的。
但是无论文件的结构是什么,是否可以通过重复应用不同的算法来继续压缩文件?
【问题讨论】:
标签: compression computer-science theory
是的,你可以 - 直到文件最终变为空 - 但当然你只是将熵从文件本身转移到压缩算法的选择中(并转移到选择哪种压缩算法的记录)。
例如,让我定义以下压缩器,它查看文件中的前两位,然后对这些位进行编码,然后输出文件的其余部分不变。
算法
compress00:如果文件中的前两位是
00,则替换这两位 有一个 0 位 - 在这种情况下,文件短 1 位。 否则,在文件前面加上 1 - 在这种情况下,文件是 1 位 更长。
这种算法很容易可逆(即,输出可以明确解压缩),它可以将文件缩短或延长 1 位。想象一个有 4 个压缩器的系列:compress00, compress01, compress10, compress11,它们都具有相同的行为,除了例如,compress01 如果文件以 01 开头则缩短文件,否则延长文件,其他压缩器以此类推。
现在请注意,每个至少有两位的文件都以 00、01、10 或 11 开头 - 所以在重复压缩过程的每个阶段,您可以选择将文件压缩 1 位的算法。重复应用此过程会将文件减少到单个位(您可以为 1 位文件定义一些额外的行为以减少到 0 位)。
当然,此方法的一个非常小的缺点是,要有效地解压缩,您需要记住在每个步骤中选择了哪些压缩器。
【讨论】:
没有。
我们用来“加权”文件的单位是字节。
字节只是更基本单位 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。
我们将每个 A 和 Ma 编码为一个字符串,并将 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 我们这里只处理简单的牛顿物理。
【讨论】:
你可以,但它没有任何区别。大多数压缩算法都是基于减少冗余来运行的,但有些算法效率更高,因此速度更慢。
现在,当您应用第一个算法时,它会减少这些冗余,因此应用第二个算法并没有太大区别。
查看here了解更多信息。
【讨论】: