在之前去馬賽克的科普中,我們知道在大多數時候,信息是不能由少變多的,除了靠聯想,這也是目前“還原”圖片馬賽克唯一的辦法。
但在我們實際使用計算機的時候,有一種我們經常使用的技術——文件的壓縮,解壓。這個過程難道不是信息的由多到少,再由少到多的過程嗎?
還真不是。
文件的信息量并沒有在壓縮的過程中減少,因此解壓時也就不存在“增多”一說。
那壓縮文件是如何做到在保留信息含量的情況下,讓文件變小的呢?
我們都知道,電腦上的數據都是以一連串的二進制信息,也就是“0”和“1”的形式存儲的。
比如電腦CPU,里面是成千上萬的晶體管,這些晶體管只有兩種狀態,通電和斷電。“0”代表斷電,“1”代表通電。
再比如硬盤中存儲的并不是我們屏幕中看到的文字或圖片,而是硬盤中的盤片,通過磁化,用磁極S和N極代表數字“0”和數字“1”來存儲信息的。
而一個“0”或“1”的大小就是一比特(Bit),8比特等于一子節(Byte),1024字節就是我們更為常見的1KB。以此類推,1024KB等于1MB,1024MB等于1GB。
知道了數據的大小后,便可以來看電腦實際上在處理的二進制編碼了。
「01000001表示字母A
01000010表示字母B
01000011表示字母C
01000100表示字母D」
這一段國際上常用的ASCII編碼中字母A-D對應的二進制表示方法。不難看出這些編碼中含有大量重復的部分,比如D前面五位數字都是「01000」,每行都有「表示字母字樣」。
而壓縮文件的原理,本質上就是通過找規律,簡化這些0和1之間的排列組合。
比如這里就可以用上「字典算法」壓縮這個文件。
字典算法,即把文本中出現頻率較多的單詞或詞匯組合做成一個對應的字典列表,并用特殊代碼來表示這個單詞或詞匯,類似我們小時候解方程時把一個等式列為未知數。
如果這里我們將「01000」列為X,「表示字母」列為Y,就可以這樣壓縮上面那段編碼:
「X001YA
X010YB
X011YC
X100YD」
換種方法解釋就是如果你說:
「我吃火鍋會拉肚子,我昨天吃火鍋了,我今天拉肚子了」
用字典算法就可以將這句話壓縮成:
「我吃A會B,我昨天A了,我今天B了」
當然,同樣的內容,其實還可以用「固定位長算法」,「RLE」等等算法來進行壓縮,但原理都是通過找規律,再進行歸納整理,這就完成了一次壓縮。
而有的時候,有的文件可以壓縮的很小,有的壓縮完卻幾乎沒有變化也是這個原因。內容相似之處較多時則容易壓縮的很小,反正則不容易壓縮。