为什么压缩压缩文件不会减小其大小?

Dio*_*ogo 5 compression zip binary-files

基于压缩文件是一个新的二进制文件的想法,为什么我不能通过一次又一次地压缩它来减小 Zip 的大小——直到生成一个非常小的结果文件?

Syn*_*ech 8

基于压缩文件是一个新的二进制文件的想法,为什么我不能通过再次压缩它并连续压缩到一个非常小的文件来减小它的大小?

因为压缩是在寻找模式和减少相似数据的基础上工作的。

例如,RLE(运行长度编码)是一种简单的压缩方法,其中检查数据并将类似数据的运行压缩如下:

AAABCEEEJFFYYYYYYYYYYOOAAAAGGGGGAAA

becomes

3ABC3EJ2F10YOO4A5G3A
Run Code Online (Sandbox Code Playgroud)

如您所见,通过仅用数据和出现次数的计数替换重复数据,您可以将这个特定示例从 35 个字节减少到 20 个字节。这并不是一个巨大的减少,但它仍然小了 42%。此外,这是一个很小的、人为的例子;更大的、真实的例子可以有更好的压缩。(OO被留下来是因为用它替换它2O不会保存任何东西。)

文本文件通常可以很好地压缩,因为它们往往有很多可以压缩的模式。例如,单词the在英语中很常见,因此您可以删除单词的每个实例,并使用一个仅单个字节(甚至更少)的标识符。您还可以使用类似、、、等的单词部分压缩更多内容。cAKEbAKEshAKEundertAKE

那么为什么不能压缩已经压缩的文件呢?因为当您进行初始压缩时,您删除了 patterns

查看压缩的 RLE 示例。你怎么能进一步压缩它?没有要压缩的相同数据的运行。事实上,当您尝试压缩已压缩的文件时,通常会得到更大的文件。例如,如果您强制对上面的示例进行重新编码,您可能会得到如下结果:

131A1B1C131E1J121F11101Y2O141A151G131A
Run Code Online (Sandbox Code Playgroud)

现在,压缩数据(运行计数)本身被视为数据,因此您最终会得到一个比开始时更大的文件。

可以尝试使用不同的压缩算法,因为一个压缩算法的输出可能是不同算法的素数,但这通常不太可能。

当然,这完全是关于无损压缩,解压后的数据必须与原始数据完全相同。使用有损压缩,您通常可以删除更多数据,但质量会下降。此外,有损压缩通常使用某种基于模式的方案(它不仅丢弃数据),因此您最终仍会达到根本找不到模式的地步。