如果妳從網上下載許多程序和文件,妳可能會遇到許多ZIP文件。這種壓縮機制是壹種非常方便的發明,特別是對於網絡用戶來說,因為它可以減少文件中的總位數和字節數,使文件能夠通過緩慢的互聯網連接更快地傳輸,同時也減少了文件占用的磁盤空間。下載文件後,計算機可以使用WinZip或Stuffit之類的程序來擴展文件,並將其恢復到原始大小。如果壹切順利,擴展後的文件將與壓縮前的原始文件完全相同。乍壹看,這似乎很神秘:如何減少比特和字節的數量,並將其完好無損地恢復?當壹切水落石出的時候,妳會發現這個過程背後的基本思路其實非常簡單明了。在本文中,我們將討論這種通過簡單壓縮顯著減少文件的方法。
大多數計算機文件類型包含相當多的冗余——它們壹遍又壹遍地列出壹些相同的信息。文件壓縮程序就是為了消除這種冗余。與重復列出壹條信息不同,文件壓縮程序只列出該信息壹次,然後當它出現在原始程序中時再次引用它。
舉個例子
以大家熟悉的信息類型——文字——為例。
約翰·肯尼迪曾在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後面跟著壹個空格——在“不是”和“是什麽”中。如果compressor將這個模式寫入字典,那麽每當“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算法的“自適應”部分就是指這種重寫字典的能力。程序執行這項工作的過程實際上非常復雜。
無論使用什麽方法,這種深度搜索機制都可以比僅僅挑出單詞更高效地壓縮文件。如果我們使用上面提取的模式,然後用“_ _”代替空格,我們最終會得到下面這個更大的字典:
問__
什麽_ _ & amp害羞;
妳們
r _ _國家
_ _能為_ _妳_ _做_ _事
句子更短:
" 1 not _ _ 2345 _ _-_ _ 12354 "
句子占用18個存儲單元,詞典占用41個存儲單元。因此,我們將總文件大小從79個單位壓縮到59個單位!這只是壓縮句子的壹種方式,不壹定是最高效的方式。看看能不能找到更好的辦法!)