Compression 为什么数据只能压缩一次?

Compression 为什么数据只能压缩一次?,compression,Compression,因此,压缩过程将获取一块二进制数据a,并输出一块较小的二进制数据B。B的哪些特征使其无法再次执行此过程?已经压缩的数据不能再次压缩是不正确的。如果您获取一个由一百万个零组成的文件并使用压缩,则得到的压缩文件是1010字节。如果再次压缩压缩文件,它将进一步减少到仅75字节 $ python >>> f = open('0.txt', 'w') >>> f.write('0'*1000000) >>> f.close() >>> $ wc -c 0.txt 1000000 0.txt $ gzip

因此,压缩过程将获取一块二进制数据
a
,并输出一块较小的二进制数据
B
B
的哪些特征使其无法再次执行此过程?

已经压缩的数据不能再次压缩是不正确的。如果您获取一个由一百万个零组成的文件并使用压缩,则得到的压缩文件是1010字节。如果再次压缩压缩文件,它将进一步减少到仅75字节

$ python >>> f = open('0.txt', 'w') >>> f.write('0'*1000000) >>> f.close() >>> $ wc -c 0.txt 1000000 0.txt $ gzip 0.txt $ wc -c 0.txt.gz 1010 0.txt.gz $ mv 0.txt.gz 0.txt $ gzip 0.txt $ wc -c 0.txt.gz 75 0.txt.gz $python >>>f=打开('0.txt','w') >>>f.写入('0'*1000000) >>>f.关闭() >>> $wc-c0.txt 1000000 0.txt $gzip 0.txt $wc-c0.txt.gz 1010.txt.gz $mv 0.txt.gz 0.txt $gzip 0.txt $wc-c0.txt.gz 75 0.txt.gz
压缩不可能工作两次的原因是压缩过程消除了冗余。当冗余较少时,更难进一步压缩文件。

压缩的工作原理是识别模式并说“此模式在这里、这里和这里,因此我将存储它一次,并记住在解压缩时将其放在那里和那里”


大多数模式都会在第一次压缩时被捕获。在压缩之后,您可以实现进一步的压缩,但是。。。剩下的模式不多了。

数据有一种称为熵的东西:每一个新位提供的新信息量。例如,
10101010101010101010
具有较低的熵,因为您不需要下一位来知道接下来会发生什么。一个完美的压缩算法会压缩到最大熵,因此每一位都会给出信息,因此无法删除,从而使大小最小化。

首先,这只适用于无损压缩。有损压缩(如jpg)理论上可以反复应用。当然,每次压缩材料的质量都会下降


对于无损压缩,我们可以将压缩看作一个例程,它获取一些数据并将其转换为另一种形式(a->B)。因为它是无损的,所以我们必须能够取B,然后取A来获得这个问题的非常学术的答案,看看!如果你和我一样,这篇文章会让你头疼

一个简单的答案是:假设你可以一次又一次地压缩,比如说每次压缩10倍。你可以把维基百科压缩到1GB,然后是100M,然后是10M。。。这样做9次,您将减少到一个字节。如果维基百科中的所有信息都可以压缩到一个字节,人们就不需要编写它了,他们只需要扩展256个字节中的一个,其中一个就是维基百科的内容:)


更合理的回答是:文本是多余的:这些字节中的信息可以表达得更紧密一些。维基百科的文章提到,例如,“q”后面几乎总是跟“u”“E”比“T”更常出现。等等类似地,在程序中,通常0比任何其他数字更容易找到。这种一致性可以被利用和“挤出”。但一旦你这样做了一次,原来的冗余大部分就消失了。压缩后的文件几乎没有任何“浪费位”。

您可以随心所欲地压缩数据,但效果可能不是您想要的。在第一级压缩之后,如果在其上运行相同的算法,它可能不会进行足够的压缩以使其具有价值

考虑一下,以下是您的数据:

10010011001001

我将使用一个组合的压缩器通过nybble(4位)标记数据,如下所示:

如果为1001,则压缩为101,因为没有Nyble从101开始,1001出现两次 如果为0011,则压缩为110,因为没有Nyble从110开始,0011发生两次

压缩后:

101 110 1110 0100 110 101 或 101101100100100110001

这在现实世界中实际上不起作用,但正如您所想象的,您可以再次压缩它,因为它仍然是二进制数据

下一次压缩将执行以下操作:

如果为1011,则压缩为111

压缩后: 111 111 1001 0011 0101 或 111111010011101

但正如你所看到的,不再有重复的Nybles,所以我使用的压缩机将没有任何剩余的压缩


同样,这不是一个真正的压缩器,只是一个简单的理解概念的方法。

这并不是说它只能压缩一次,而是有一个最小的大小,你可以压缩任何数据,然后再开始丢失数据位(就像你处理低质量的jpg或MP3文件那样)。现在的大多数压缩算法都很好,一次就可以让你在几%的范围内完成,所以第二次真的不值得,因为这是不可能的

为了在不阅读太多理论的情况下理解最小尺寸,请考虑一个有两个可能答案的问题:是和否。可以得出这个结果的最小值是一个位,其中0=否,1=是(反之亦然)。即使这样,也做出了一系列假设(例如,接收数据的人已经理解了这种编码)

在更复杂的层面上,所有其他数据也是如此。在有八个可能答案的情况下,所有答案的概率都相等(这一点很重要),最小大小为三位-允许八个选项的最小位数(000001010011100101110111)


在某些情况下,您可以做一些聪明的事情来减少它(例如,对于非常常见的答案,您使用的比特数较少,而代价是需要的比特数比不太常见的答案可能需要的比特数多,但总体平均数较低)但最终还是有一个存储信息所需的最小存储量。

拿一张纸折叠,你已经将它压缩了50%。 现在再做一次,继续尝试。注意它是如何变得越来越难,并且在某个时候你必须停止

数据压缩也受到同样的限制。当然,你可以再压缩一次,然后你就会