乍壹看,這似乎很神秘:如何減少比特和字節的數量,並將其完好無損地恢復?當壹切水落石出的時候,妳會發現這個過程背後的基本思路其實非常簡單明了。在本文中,我們將討論這種通過簡單壓縮顯著減少文件的方法。
大多數計算機文件類型包含相當多的冗余——它們壹遍又壹遍地列出壹些相同的信息。文件壓縮程序就是為了消除這種冗余。與重復列出壹條信息不同,文件壓縮程序只列出該信息壹次,然後當它出現在原始程序中時再次引用它。
以大家熟悉的信息類型——文字——為例。
約翰·肯尼迪曾在1961的就職演說中說過以下名言:
不要問妳的國家能為妳做什麽,問問妳能為妳的國家做什麽。(不要問妳的國家能為妳做什麽,而要問妳能為妳的國家做什麽。)
這段話有17個單詞,包括61個字母,16個空格,1個破折號,1個句號。如果每個字母、空格或標點占據1個存儲單元,則文件的總大小為79個單元。為了減小文件大小,我們需要找出冗余部分。
我們立即發現:
如果忽略大小寫字母的區別,這句話幾乎有壹半是多余的。九個單詞(問,不是,什麽,妳的,國家,可以,做,為,妳)提供了幾乎所有妳需要的東西來組成壹個完整的句子。為了構造另半句,我們只需要把前半句的單詞拿出來,然後加上空格和標點符號。
大多數壓縮程序使用基於自適應字典的LZ算法來壓縮文件。“LZ”指的是這個算法的發明者萊姆佩爾和齊夫,“字典”指的是對數據塊進行分類的方法。
排列字典的機制有很多,可以簡單到壹個編號列表。當我們檢查肯尼迪的著名演講時,我們可以挑出重復的話,並把它們放在編號索引中。然後,我們直接寫數字而不是整個單詞。
因此,如果我們的字典是:
要求
什麽
妳的
國家
能
做
為
妳們
我們現在的句子應該是這樣的:
1而不是2 3 4 5 6 7 8 - 1 2 8 5 6 7 3 4
如果妳理解了這個機制,妳就可以很容易地通過使用這個字典和編號模式來重構原句。這就是計算機中的解壓縮程序在擴展下載的文件時所做的事情。妳可能也遇到過可以自己解壓的壓縮文件。要創建這樣的文件,程序員需要在壓縮文件中設置壹個簡單的解壓縮器。下載後,它可以自動重建原始文件。
但是使用這種機制可以節省多少空間呢?“1不是2345678-1 2856734”當然比“不要問妳的國家能為妳做什麽——問妳能為妳的國家做什麽”要短。,但是需要註意的是,我們需要把這個字典和文件壹起保存。
在實際的壓縮方案中,計算各種文件需求是壹個非常復雜的過程。讓我們回過頭來考慮上面的例子。每個字符和空格占用1個存儲單元,整個原句占用79個單元。壓縮句子(包括空格)占37個單位,詞典(單詞和數字)也占37個單位。換句話說,文件大小是74個單位,所以我們沒有減少太多文件大小。
但這只是壹句話!可想而知,如果肯尼迪演講的其余部分用這個壓縮程序處理,我們會發現這些詞和其他詞被重復的次數更多。而且,正如下壹節提到的,為了獲得盡可能高的組織效率,可以重寫字典。
在最後壹個例子中,我們挑選出所有重復的單詞,並把它們放在字典中。對我們來說,這是最明顯的編寫字典的方法。但是壓縮程序不這麽認為:它沒有單詞的概念——它只是尋找模式。為了盡可能減小文件大小,它會仔細選擇最佳模式。
如果從這個角度來看待這句話,最終會得到壹個完全不同的字典。
如果壓縮器掃描肯尼迪的句子,它遇到的第壹個冗余部分只有幾個字母長。在“不要問妳的是什麽”中,有壹個重復的模式,即字母T後面跟著壹個空格——在“不是”和“是什麽”中。如果壓縮程序將這個模式寫入字典,那麽每當“t”後面跟壹個空格時,它就會寫壹個“1”。然而,在這個簡短的句子中,這個模式沒有出現足夠的次數來將其作為字典中的壹個條目,因此程序最終會將其覆蓋。
接下來程序註意到的是ou,它同時出現在妳的和妳的國家。如果這是壹個很長的文檔,將這個模式寫入字典會節省很多空間——ou是英語中很常見的字母組合。但是compressor看了整句之後,馬上就找到了壹個更好的詞典詞條選擇:不僅ou重復,your and country的整個單詞也重復,而且它們實際上是作為壹個短語your country壹起重復的。在本例中,程序將使用您的國家條目覆蓋字典中的ou條目。
短語can do for也是重復的,壹次跟your,壹次跟you,所以我們發現can do for you也是重復模式。這樣我們就可以用壹個數字代替15的字符(包括空格),而妳所在的國家只允許我們用壹個數字代替13的字符(包括空格),所以程序會用r國家條目覆蓋妳所在的國家條目,然後單獨寫壹個can do for you條目。程序繼續以這種方式工作,挑出所有重復的信息,然後計算應該將哪個模式寫入字典。基於自適應字典的LZ算法的“自適應”部分就是指這種重寫字典的能力。程序執行這項工作的過程實際上非常復雜。
無論使用什麽方法,這種深度搜索機制都可以比僅僅挑出單詞更高效地壓縮文件。如果我們使用上面提取的模式,然後用“_ _”代替空格,我們最終會得到下面這個更大的字典:
問__
什麽__?
妳們
r _ _國家
_ _能為_ _妳_ _做_ _事
句子更短:
" 1 not _ _ 2345 _ _-_ _ 12354 "
句子現在占據18個存儲單元,字典占據41個單元。因此,我們將總文件大小從79個單位壓縮到59個單位!這只是壓縮句子的壹種方式,不壹定是最高效的方式。看看能不能找到更好的辦法!)
那麽這個機制到底有多好呢?文件壓縮率取決於許多因素,包括文件類型、文件大小和壓縮方案。
在世界上大多數語言中,壹些字母和單詞經常以相同的模式壹起出現。正是因為這種高冗余,文本文件的壓縮率才會高。通常,大小合適的文本文件的壓縮率可以達到50%或更高。大多數編程語言也是高度冗余的,因為它們的命令相對較少,並且命令通常采用固定的模式。對於包含大量非重復信息的文件(如圖像或MP3文件),這種機制不能用於獲得高壓縮率,因為它們不包含重復模式。
如果壹個文件有大量的重復模式,壓縮比通常會隨著文件大小的增加而增加。這壹點從我們的例子中可以看出——如果我們把肯尼迪的演講提取得更長壹些,妳會發現我們字典中的模式出現了很多次,所以妳可以通過每個字典條目節省更多的文件空間。此外,對於較大的文件,可能有壹個更通用的模式,可以創建更高效的字典。
此外,文件壓縮的效率還取決於壓縮程序使用的具體算法。有些程序可以更好地找到某些類型文件中的模式,因此可以更有效地壓縮這些類型的文件。其他壓縮程序在其字典中使用字典,這使得它們在壓縮大文件時性能良好,但在壓縮較小文件時效率較低。盡管所有這類壓縮程序都基於相同的基本思想,但它們以不同的方式執行。程序員總是試圖建立壹個更好的壓縮機制。
有損壓縮和無損壓縮
我們上面討論的壓縮類型稱為無損壓縮,因為您重新創建的文件與原始文件完全相同。所有的無損壓縮都是基於這樣壹種思想,即將壹個文件換成“更小”的形式進行傳輸或存儲,在對方收到後再恢復,以便重用。
有損壓縮則完全不同。這些程序直接刪除“不必要”的信息,並剪切文件使其變小。這種類型的壓縮廣泛用於減小位圖圖像的文件大小,因為位圖圖像的體積通常非常大。為了理解有損壓縮的工作原理,讓我們看看您的計算機如何壓縮掃描的照片。
對於這類文件,無損壓縮程序的壓縮率通常不高。雖然大多數圖片看起來都壹樣——例如,整個天空都是藍色的——但大多數像素之間存在細微差異。為了在不降低分辨率的情況下縮小圖片,您必須更改某些像素的顏色值。如果圖片包含大量的藍色天空,程序將選擇壹種可用於所有像素的藍色。然後,程序重寫該文件,天空像素的所有值都使用該信息。如果壓縮方案選擇得當,您不會註意到任何變化,但文件大小會顯著減小。
當然,對於有損壓縮,妳無法在壓縮後恢復原始文件。您必須接受壓縮程序對原始文件的重新解釋。因此,如果妳需要完整地再現原始內容(如軟件應用、數據庫和總統就職演說),就不應該使用這種壓縮形式。