因此,压缩过程需要一大块二进制数据A
,并输出较小的二进制数据块B
。 B
的哪些特征使其无法再次完成此过程?
答案 0 :(得分:16)
数据有一种称为熵的东西:每个新位给出的新信息量。例如,10101010101010101010
具有低熵,因为您不需要下一位来了解接下来会发生什么。一个完美的压缩算法会压缩到最大熵,因此每个位都会提供信息,因此无法删除,从而使大小最小。
答案 1 :(得分:11)
已经压缩的数据不能再次压缩。如果您使用包含100万个零的文件并使用gzip对其进行压缩,则生成的压缩文件为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
不太可能压缩两次工作的原因是因为压缩过程会消除冗余。如果冗余度较低,则进一步压缩文件会更加困难。
答案 2 :(得分:5)
对于这个问题的非常学术性的答案,请看Information Etropy!但是,如果你像我一样,这篇文章会让你头疼。
一个更简单的答案:假设你可以一次又一次地压缩,比如每次10倍。你可以将维基百科压缩到一个GB,然后是100M,然后是10M ......这样做9次,你就会减少到一个字节。如果维基百科中的所有信息都可以压缩到一个字节,人们就不需要编写它,他们可能只扩展了256个可能的字节中的一个,其中一个就是维基百科的内容:)
一个更明智的答案:文本冗余:这些字节中的信息可以更紧密地表达。例如,维基百科的文章提到了'q'几乎总是跟着'u'这一事实。 'E'比'T'更常出现。等等。类似地,在程序中,经常发现0比任何其他数字更频繁。这种一致性可以被利用和“挤出”。但是,一旦你完成了这一次,最初的冗余基本消失了。压缩文件几乎没有“浪费的比特”。
答案 3 :(得分:4)
首先,这仅适用于无损压缩。有损压缩(如jpg)理论上可以反复应用。当然,每次压缩材料的质量都会下降。
对于无损压缩,我们可以将压缩视为一个例程,它接收一些数据并将其转换为另一种形式(A-> B)。由于它是无损的,我们必须然后能够取B并且去A< -B。如果我们遵循这一点,那么这意味着如果我们采用4位(16个模式)的每个序列并压缩它们,我们必须得到16个不同的结果。这意味着平均而言,没有进行压缩!
压缩利用了这样的事实:对于某些类型的数据,某些数据序列不太常见。这些不太常见的形式在压缩时会变大。我们选择我们的方案的更常见的形式将变小。平均而言,消息的大小相同或更大。
更进一步,如果我们反复重新压缩相同的消息,它平均不会改变大小(再次,这是最佳情况)。
答案 4 :(得分:2)
压缩的工作方式是识别模式并说“这个模式就在这里,这里和这里,所以我会存储一次并记得将它放在那里,当我解压缩时”。
大多数模式会在第一次压缩中被捕获。压缩后可以进一步压缩,但......剩下的图案不多。
答案 5 :(得分:2)
并不是它只能被压缩一次,而是你可以在开始丢失任何数据之前压缩任何数据的最小尺寸(使用低质量jpg或MP3文件的方式)。如今大多数压缩算法都足够好,一次通过可以让你在几个百分之内,所以第二次不值得,而不是不可能。
要理解最小尺寸而不阅读太多理论,请考虑一个带有两个可能答案的问题是和否。您可以将此结果最小的是一个位,其中0 =否和1 =是(反之亦然) 。即使这已经做了一堆假设(例如,接收数据的人已经理解了这种编码)。
在更复杂的层面上,所有其他数据都是如此。在你有八个可能的答案,同样可能的答案(这很重要)的情况下,最小大小是三位 - 允许八个选项的最小位数(000,001,010,011,100,101,110) ,111)。
在某些情况下,您可以做一些聪明的事情来减少它(例如,您使用较少数量的位来获得非常常见的答案,代价是需要比不太常见但可能需要的更多但是在较低的总体平均值)但最终存在包含信息所需的最小存储量。
答案 6 :(得分:2)
拿一张纸折叠 - 你压缩了50%。 现在再做一次 - 并继续努力。注意它变得越来越难,在某些时候你必须停下来?
数据压缩受到相同的限制。当然,你可以再次压缩它,你可以节省更多的空间,但它是收益递减的明显例子 - 每一次进一步的压缩尝试都需要更多的努力来进行边际改进。
答案 7 :(得分:1)
对于任何数字N,有2 ^(N + 1)-1个不同的可能输入文件,长度为N位或更短。如果每个不同的输入文件都会产生不同的输出文件,那么对于长度为k的每个可能的输入文件,可以缩短到一些较短的长度,必须至少有一个较短的文件变长。
答案 8 :(得分:0)
您可以根据需要压缩数据,但效果可能不是您想要的。在第一级压缩之后,如果你对它运行相同的算法,它可能不会压缩到足以使其值得。
想一想,这是你的数据:
1001 0011 1110 0100 0011 1001
我将使用一个伪造的压缩器通过nybble(4位)对这些数据进行标记:
如果为1001,则压缩为101,因为没有nybble以101开始,1001会出现两次 如果为0011,则压缩为110,因为没有nybble以110开始,0011发生两次
压缩后:
101 110 1110 0100 110 101 要么 1011 1011 1001 0011 0101
这实际上并不适用于现实世界,但正如您可以想象的那样,您可以再次压缩它,因为它仍然是二进制数据。
下一次压缩会这样做:
如果是1011,压缩为111
压缩后: 111 111 1001 0011 0101 要么 1111 1110 0100 1101 01
但正如你所看到的,没有任何重复的nybbles,所以我使用的压缩器没有任何东西可以压缩。
同样,这不是一个真正的压缩器,只是理解这个概念的简单方法。
答案 9 :(得分:0)
无损压缩的问题基本上是如何更简洁地表达这些信息?例如,您可以观察到,在前面的文本中,字符“e”通常后跟一个spacEand替代该模式的不常见字符。类似地,一个后跟“t”的空格可以被一个不同的,不常见的序列所替代,并且两个“s”的序列可以同样地缩短。当UrunOutOf commN sequencesTo 替换,Ucannot进行任何furHer(或Umay haveTo switchToAdifferent模式替换策略)。