JPEG格式在圖片上效果良好,但對音頻和音樂文件呢?這些文件也能使用有損壓縮去壓縮,而且使用了相同的基本思想:拋棄對成品影響很小的信息。MP3和AAC等流行音樂壓縮格式通常使用和JPEG一樣的高級方法。音頻也會被劃分成塊,每個塊都會被單獨壓縮。在JPEG中,以特定方式變化的塊能用少量數(shù)字形容。不過,音頻壓縮格式也能利用與人耳有關的已知事實。特別是,有些種類的聲音對人只有很小的影響或沒有影響,因此壓縮算法能在不降低輸出質量的情況下消除這些聲音。
壓縮算法的起源
本章描述的同前把戲——用于ZIP文件中的壓縮方法之一——以LZ77算法為計算機科學家所熟知。這一算法由兩位以色列計算機科學家亞伯拉罕·倫佩爾(Abraham Lempel)以及雅各布·齊夫(Jacob Ziv)于1977年發(fā)表。
不過,要追溯壓縮算法的起源,我們需要把科學史向前推30年。我們已經了解了克勞德·香農,那位以其1948年論文創(chuàng)建信息理論領域的貝爾實驗室科學家。香農是糾錯碼故事中(第五章)的兩位主要英雄之一,但他以及他于1948年發(fā)表的論文在壓縮算法的出現(xiàn)上也扮演了重要角色。
這并非偶然。事實上,糾錯碼和壓縮算法是同一枚硬幣的兩面。兩者都來自冗余的想法,我們在第五章詳細介紹了冗余的概念。如果一個文件有冗余,它就比必要的長度長。這里重復一個第五章的簡單例子,文件可以使用單詞“.ve”來代替數(shù)字“5”。那樣的話,像“.vq”這樣的錯誤就能被輕易識別和糾正。因此,糾錯碼能被視為向消息或文件中添加冗余的原則性方法。
壓縮算法正好相反:它們會從消息或文件中移除冗余。很容易想象一個壓縮算法會注意到文件中經常使用單詞“.ve”,并用一個更短的符號取代它(甚至有可能是符號“5”),正好反轉了糾錯碼過程。在現(xiàn)實中,壓縮和糾錯并不會像這樣彼此抵消。相反,好的壓縮算法會移除低效冗余,而糾錯編碼會增加另一種更高效的冗余。因此,首先壓縮一條信息,再往里面添加一些糾錯碼非常常見。
再說回香農,他于1948年發(fā)明的重要論文除了許多卓越貢獻之外,還包含對最早期壓縮技術之一的描述。麻省理工學院教授羅伯特·法諾(Robert Fano)大約在同時發(fā)明了這一技術,這一方法現(xiàn)在以香農—法諾編碼(Shannon-Fano coding)命名。事實上,香農—法諾編碼是一種實施更短符號把戲的特殊方法,我們在本章前面描述了更短符號把戲。我們很快就會知道,香農—法諾編碼很快就被另一種算法取代,但這一方法非常有效,并存活到了今天,成為ZIP文件格式的可選壓縮方法之一。
香農和法諾都意識到,盡管他們的方法都既實用又高效,但卻不是最好的算法:香農通過算術證明了肯定有更好的壓縮技術存在,但還未找到實現(xiàn)它們的方法。同時,法諾在麻省理工教授一門信息理論的研究生課程,他將實現(xiàn)優(yōu)化壓縮的問題作為該課程學期論文的可選項之一。出人意料的是,法諾的一位學生解決了這一問題,得到了一種針對每個符號取得最佳可能壓縮的方法。這名學生就是大衛(wèi)·霍夫曼,他的技術——現(xiàn)在以霍夫曼編碼來命名——則是更短符號把戲的另一個例子?;舴蚵幋a仍然是一種基礎壓縮算法,被廣泛用于通信和數(shù)據(jù)存儲系統(tǒng)。