注:本文仅讨论无损压缩
数据压缩算法一直朝着更高的压缩率方向突破,同时也在压缩率和压缩时间上做出权衡。
美剧《硅谷》中的初创公司魔笛手就是一个以数据压缩为核心的公司,在第三季里面杜撰的数据压缩算法可以将数据压缩到几乎不占空间,这是可能的吗?事实上这是不可能的,数据是不可能无限压缩至无穷小的。 很多人应该思考过这样一个问题,能否对压缩之后的文件进行再压缩,这样经过很多次压缩之后文件将变得几乎不占大小。实际实验之后发现文件不仅没有变小反而变大了一点。为什么这是行不通的呢? 假设任意原信息A经过压缩后变为一个几乎无穷小的信息B,不妨设B为一个字节,而两个字节所能表示的不同信息就只有
28
个,这256中不同的表示肯定不能够还原到任意的信息上去,这就推出了矛盾,所以将任意信息无限压缩是不可能的。 香农在信息论中引入了一个词语叫熵(出自热力学里面),用来度量信息的不确定度,表示信息的多少。对于一串很长的重复的信息,比如:“哈哈…(省略95个哈)…哈哈哈哈”,我们可以用“100个哈”这个语句以及对应的规则来表示这条信息,可以看出并不是数据越长所包含的信息就越多,长的数据可能包含很多冗余,而数据压缩的目的就是消除冗余。 数据压缩的基本思想是替换的思想,就是将出现频率较多的数据用别的数据替换掉。
上面说明了将任意信息压缩至无穷小是不可能的,但对于某些信息确实可以压缩至很小,这需要去发现数据中的模式,通过数据和规则还原原来的信息。比如前面的“哈哈”的例子。接下来再举一个例子:π小数点后有无穷位,如果给一个不知道是π的人看这一串数字,数据量是很大的,但经过压缩后就变成了π这个数据和生成它的规则了(这个规则也是需要被数据化的)。
那么现在问题来了,现在给出一串数据,我们怎么将它进行压缩呢,它能被压缩到多大程度或者说它是否能被压缩。我认为对于“一串数据能被压缩”这个命题是不能被证伪的。这是容易理解的,如果我们找到了一种压缩方法将它压缩那么我们可以说它是可以压缩的,但如果我们一直没找到一种方法我们却不能断定它不能进行压缩。鉴于此,我们也不能对一个数据的压缩极限给出一个下界。
数据压缩的一般思路就是替换,经典的算法有赫夫曼编码,就是利用统计中的冗余,将出现较多的序列用较短的的序列替代,而出现次数较少的用长的序列替代。