正文

數(shù)據(jù)壓縮——有益無害(2)

改變未來的九大算法 作者:(美)約翰·麥考密克


那我們怎么才能享受免費(fèi)午餐呢?你怎么才能在不破壞的情況下,讓一塊數(shù)據(jù)或信息比起實(shí)際“真實(shí)”體積更小,并在之后完美地重構(gòu)一切東西呢?事實(shí)上,人類一直都在這么做,只不過從未想到過罷了。想一下你的每周日程。為簡單起見,讓我們假設(shè)你每天工作8小時,每周工作5天,你用一小時的區(qū)間來劃分日程。因此,5個工作日的每天都有8個可能的區(qū)間,每周一共有40個區(qū)間。然后,將你一周的日程傳輸給其他人,你必須傳輸40份信息。但如果有人打電話讓你安排下周的一個會議,你會通過列出40份分開的信息來描述自己什么時候有空嗎?當(dāng)然不會!最有可能的情況是,你會說些“周一和周二全滿,周四和周五下午1點(diǎn)到3點(diǎn)有預(yù)約,其余時間有空”之類的話。這就是一個無損數(shù)據(jù)壓縮的例子!和你談話的人能完全重構(gòu)出你下周所有40個時段的空閑情況,但你卻無須詳細(xì)列出它們。

你也許會想這種“壓縮”是取巧,因?yàn)樗Q于這一事實(shí):你的日程安排中的絕大多數(shù)區(qū)塊都相同。特別是,周一和周二全天都有預(yù)約,因此你能非??焖俚孛枋鏊鼈?,這周剩下的時間里,除了兩個時間段以外都有空,這也很容易描述。這的確是個非常簡單的例子。不管怎樣,計算機(jī)中的數(shù)據(jù)壓縮也是按照這一方法運(yùn)行的:基本思想是發(fā)現(xiàn)數(shù)據(jù)中彼此相同的部分,并運(yùn)用某種把戲更高效地描述這些部分。

這在數(shù)據(jù)包含重復(fù)片段時尤其簡單。比如,你很有可能想出一個壓縮下列數(shù)據(jù)的好方法:

AAAAAAAAAAAAAAAAAAAAABCBCBCBCBCBCBCBCBCBCAAAAAADEFDEFDEF

如果乍一看還不明顯,思考一下你會如何通過電話向某人口述這份數(shù)據(jù)。和說“A、A、A、A、……、D、E、F”不同的是,我肯定你更有可能會說“21個A,然后是10個BC,接著是6個A,最后是3個DEF”。再比如,要很快地在一張紙上記下這份數(shù)據(jù),你可能會寫“21A、10BC、6A、3DEF”。在這個例子里,你將這個包含56個字母的原始數(shù)據(jù)壓縮成了只有16個字母的字符串。這不到原體積的三分之一——不錯!計算機(jī)科學(xué)家將這種特別的把戲稱為行程長度編碼(run–length encoding),因?yàn)樗鼘⒅貜?fù)的“行程”和行程的“長度”編碼在了一起。

不幸的是,行程長度編碼只在壓縮非常特殊的數(shù)據(jù)種類上有用。它在實(shí)際中也有運(yùn)用,但大部分時候只和其他壓縮算法結(jié)合起來使用。比如,傳真機(jī)就將行程長度編碼和另一種被稱為霍夫曼編碼(Huffman coding)的技術(shù)結(jié)合起來使用,我們稍后將談到霍夫曼編碼。行程長度編碼的主要問題是,數(shù)據(jù)中的重復(fù)片段必須相鄰——換句話說,重復(fù)部分間不能有其他數(shù)據(jù)。使用行程長度編碼壓縮ABABAB很容易(只是3AB),但用相同的把戲壓縮ABXABYAB就行不通了。


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號