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

Gor*_*son 16 compression

因此压缩过程需要一大块二进制数据A并输出较小的二进制数据块B.有什么特点B使它无法再次经历这个过程?

mur*_*d99 16

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

  • +1完美陈述.值得一提的是,有2 ^ n个可能的n位字符串,但只有2 ^(n-1)个字符串的(n-1)位,因此具有最大熵(完全随机数据)的文件不可能可靠地压缩甚至1位! (3认同)

Mar*_*ers 11

不能再次压缩已经压缩的数据.如果您使用包含1百万个零的文件并使用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

之所以说它是不太可能的是压缩工作两次是因为压缩过程中去除冗余.如果冗余较少,则进一步压缩文件会更加困难.

  • 如果您可以再次压缩它,则意味着您的原始算法不是最佳的. (12认同)
  • @Bill K,我怀疑有**压缩算法对每个输入都是最佳的.这个答案的亮点在于它在解释更一般的情况时指出了例外. (6认同)
  • 好答案.作为旁注:这就是为什么SETI人说他们还没有发现任何ET信号.先进的外星人将走向越来越有效的通信,并且最佳的有效通信将没有冗余,因此无法从噪声中获取. (2认同)
  • @Bill K,@ Mark Byers - 对于那个特殊的输入不是最佳选择.压缩算法必须针对一般输入进行优化.如果它对于该输入是完全最优的,那么对于一般输入将是无用的.例如:具有特定种子的随机数生成器是一个程序,可以将10个字节"解压缩"为10个太字节.该生成器的逆是一种非常优化的压缩算法,但仅适用于该特定输入 (2认同)

Car*_*icz 5

有关这个问题的非常学术性的答案,请查看信息熵!但是,如果你像我一样,这篇文章会让你头疼.

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

一个更明智的答案:文本是多余的:这些字节中的信息可以更紧密地表达.例如,维基百科的文章提到了'q'几乎总是跟着'u'这一事实.'E'比'T'更常出现.等等.类似地,在程序中,经常发现0比任何其他数字更频繁.这种一致性可以被利用和"挤出".但是,一旦你完成了这一次,最初的冗余基本消失了.压缩文件几乎没有"浪费的比特".