1992年,美国佐治亚州的WEB Technology公司,宣布作出了重大的技术突破。算法
该公司的DataFiles/16软件,号称能够将任意大于64KB的文件,压缩为原始大小的16分之一。业界议论纷纷,若是消息属实,无异于压缩技术的革命。编码
许多专家尚未看到软件,就断言这是不可能的。由于根据压缩原理,你不可能将任意文件压缩到16分之一。事实上,有一些文件是没法压缩的,哪怕一个二进制位,都压缩不掉。递归
后来,事实果真如此,这款软件历来没有正式发布。没过几年,就连WEB Technology公司都消失了。字符串
那么,为什么不是全部的文件均可以被压缩?是否存在一个压缩极限呢,也就是说,到了必定大小,就无法再压缩了?it
首先,回答第一个问题:为何WEB Technology公司的发明不多是真的。原理
反证法能够轻易地证实这一点。假定任何文件均可以压缩到n个二进制位(bit)之内,那么最多有2n种不一样的压缩结果。也就是说,若是有2n+1个文件,必然至少有两个文件会产生一样的压缩结果。这意味着,这两个文件不可能无损地还原(解压缩)。所以,获得证实,并不是全部文件均可以压缩到n个二进制位如下。软件
很天然地,下一个问题就是,这个n究竟是多少?二进制
要回答一个文件最小能够压缩到多少,必需要知道压缩的原理。im
压缩原理其实很简单,就是找出那些重复出现的字符串,而后用更短的符号代替,从而达到缩短字符串的目的。好比,有一篇文章大量使用"中华人民共和 国"这个词语,咱们用"中国"代替,就缩短了5个字符,若是用"华"代替,就缩短了6个字符。事实上,只要保证对应关系,能够用任意字符代替那些重复出现 的字符串。技术
本质上,所谓"压缩"就是找出文件内容的几率分布,将那些出现几率高的部分代替成更短的形式。因此,内容越是重复的文件,就能够压缩地越小。好比,"ABABABABABABAB"能够压缩成"7AB"。
相应地,若是内容毫无重复,就很难压缩。极端状况就是,遇到那些均匀分布的随机字符串,每每连一个字符都压缩不了。好比,任意排列的10个阿拉伯数字(5271839406),就是没法压缩的;再好比,无理数(好比π)也很难压缩。
压缩就是一个消除冗余的过程,至关于用一种更精简的形式,表达相同的内容。能够想象,压缩过一次之后,文件中的重复字符串将大幅减小。好的压缩算法,能够将冗余降到最低,以致于再也没有办法进一步压缩。因此,压缩已经压缩过的文件(递归压缩),一般是没有意义的。
知道了压缩原理以后,就能够计算压缩的极限了。
上一节说过,压缩能够分解成两个步骤。第一步是获得文件内容的几率分布,哪些部分出现的次数多,哪些部分出现的次数少;第二步是对文件进行编码,用较短的符号替代那些重复出现的部分。
第一步的几率分布通常是肯定的,如今就来考虑第二步,怎样找到最短的符号做为替代符。
若是文件内容只有两种状况(好比扔硬币的结果),那么只要一个二进制位就够了,1表示正面,0表示表示负面。若是文件内容包含三种状况(好比球赛的结果),那么最少须要两个二进制位。若是文件内容包含六种状况(好比扔筛子的结果),那么最少须要三个二进制位。
通常来讲,在均匀分布的状况下,假定一个字符(或字符串)在文件中出现的几率是p,那么在这个位置上最多可能出现1/p种状况。须要log2(1/p)个二进制位表示替代符号。
这个结论能够推广到通常状况。假定文件有n个部分组成,每一个部分的内容在文件中的出现几率分别为p1、p2、...pn。那么,替代符号占据的二进制最少为下面这个式子。
log2(1/p1) + log2(1/p2) + ... + log2(1/pn)
= ∑ log2(1/pn)
这能够被看做一个文件的压缩极限。