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)
這能夠被看做一個文件的壓縮極限。