無損數據壓縮算法發展史


內容豐富,閑暇時可以細品


引言

有兩種主要的壓縮算法: 有損和無損。有損壓縮算法通過移除在保真情形下需要大量的數據去存儲的小細節,從而使文件變小。在有損壓縮里,因某些必要數據的移除,恢復原文件是不可能的。有損壓縮主要用來存儲圖像和音頻文件,同時通過移除數據可以達到一個比較高的壓縮率,不過本文不討論有損壓縮。無損壓縮,也使文件變小,但對應的解壓縮功能可以精確的恢復原文件,不丟失任何數據。無損數據壓縮被廣泛的應用於計算機領域,從節省你個人電腦的空間,到通過web發送數據。使用Secure Shell交流,查看PNG或GIF圖片。

無損壓縮算法可行的基本原理是,任意一個非隨機文件都含有重復數據,這些重復數據可以通過用來確定字符或短語出現概率的統計建模技術來壓縮。統計模型可以用來為特定的字符或者短語生成代碼,基於它們出現的頻率,配置最短的代碼給最常用的數據。這些技術包括熵編碼(entropy encoding),游程編碼(run-length encoding),以及字典壓縮。運用這些技術以及其它技術,一個8-bit長度的字符或者字符串可以用很少的bit來表示,從而大量的重復數據被移除。

歷史


直到20世紀70年代,數據壓縮才在計算機領域開始扮演重要角色,那時互聯網變得更加流行,Lempel-Ziv算法被發明出來,但壓縮算法在計算機領域之外有着更悠久的歷史。發明於1838年的Morse code,是最早的數據壓縮實例,為英語中最常用的字母比如"e"和"t"分配更短的Morse code。之后,隨着大型機的興起,Claude Shannon和Robert Fano發明了Shannon-Fano編碼算法。他們的算法基於符號(symbol)出現的概率來給符號分配編碼(code)。一個符號出現的概率大小與對應的編碼成反比,從而用更短的方式來表示符號。

兩年后,David Huffman在MIT學習信息理論並上了一門Robert Fano老師的課,Fano給班級的同學兩個選項,寫一篇學期論文或者參加期末考試。Huffman選擇的是寫學期論文,題目是尋找二叉編碼的最優算法。經過幾個月的努力后依然沒有任何成果,Huffman決定放棄所有論文相關的工作,開始學習為參加期末考試做准備。正在那時,靈感爆發,Huffman找到一個與Shannon-Fano編碼相類似但是更有效的編碼算法。Shannon-Fano編碼和Huffman編碼的主要區別是構建概率樹的過程不同,前者是自下而上,得到一個次優結果,而后者是自上而下。

早期的Shannon-Fano編碼和Huffman編碼算法實現是使用硬件和硬編碼完成的。直到20世紀70年代互聯網以及在線存儲的出現,軟件壓縮才被實現為Huffman編碼依據輸入數據動態產生。隨后,1977年Abraham Lempel 和 Jacob Ziv發表了他們獨創性的LZ77算法,第一個使用字典來壓縮數據的算法。特別的,LZ77使用了一個叫做slidingwindow的動態字典。1778年,這對搭檔發表了同樣使用字典的LZ78算法。與LZ77不同,LZ78解析輸入數據,生成一個靜態字典,不像LZ77動態產生。

法律問題

LZ77和LZ78都快速的流行開來,衍生出多個下圖中所示的壓縮算法。其中的大多數已經沉寂了,只有那么幾個現在被大范圍的使用,包括DEFLATE,LZMA以及LZX。絕大多數常用的壓縮算法都衍生於LZ77,這不是因為LZ77技術更好,只是由於Sperry在1984年申請了LZ78衍生算法LZW的專利,從而發展受到了專利的阻礙,Sperry開始因專利侵權而起訴軟件提供商,服務器管理員,甚至是使用GIF格式但沒有License的終端用戶。

同時,UNIX壓縮工具使用了一個叫LZC的LZW算法微調整版本,之后由於專利問題而被棄用。其他的UNIX開發者也開始放棄使用LZW。這導致UNIX社區采用基於DEFLATE的gzip和基於Burrows-Wheeler Transform的bzip2算法。長遠來說,對於UNIX社區這是有好處的,因為gzip和bzip2格式幾乎總是比LZW有更好的壓縮比。圍繞LZW的專利問題已經結束,因為LZW的專利2003年就到期了。盡管這樣,LZW算法已經很大程度上被替代掉了,僅僅被使用於GIF壓縮中。自那以后,也有一些LZW的衍生算法,不過都沒有流行開來,LZ77算法仍然是主流。

另外一場法律官司發生於1993,關於LZS算法。LZS是由Stac Electronics開發的,用於硬盤壓縮軟件,如Stacker。微軟在開發影片壓縮軟件時使用了LZS算法,開發的軟件隨着MS-DOS 6.0一起發布,聲稱能夠使硬盤容量翻倍。當Stac Electronics發現自己的知識財產被使用后,起訴了微軟。微軟隨后被判專利侵權並賠償Stac Electronics1億2000萬美元,后因微軟上訴因非故意侵權而減少了1360萬美元。盡管Stac Electronics和微軟發生了一個那么大的官司,但它沒有阻礙Lempel-Ziv算法的開發,不像LZW專利糾紛那樣。唯一的結果就是LZS沒有衍生出任何算法。

Deflate的崛起

自從Lempel-Ziv算法被發表以來,隨着對存儲需求的不斷增長,一些公司及其他團體開始使用數據壓縮技術,這能讓他們滿足這些需求。然而,數據壓縮並沒有被大范圍的使用,這一局面直到20世紀80年代末期隨着互聯網的騰飛才開始改變,那時數據壓縮的需求出現了。帶寬限額,昂貴,數據壓縮能夠幫助緩解這些瓶頸。當萬維網發展起來之后人們開始分享更多的圖片以及其它格式的數據,這些數據遠比文本大得多,壓縮開始變得極其重要。為了滿足這些需求,幾個新的文件格式被開發出來,包括ZIP,GIF,和PNG。

Thom Henderson通過他的公司發布了第一個成功的商業存檔格式,叫做ARC,公司名為為System Enhancement Associates。ARC在BBS社區尤為流行,這是因為它是第一個既可以打包又可以壓縮的程序,此外還開放了源代碼。ARC格式使用一個LZW的衍生算法來壓縮數據。一個叫做Phil Katz的家注意到了ARC的流行並決定用匯編語言來重寫壓縮和解壓縮程序,希望改進ARC。他於1987發布了他的共享軟件PKARC程序,不久被Henderson以侵犯版權為由起訴。Katz被認定為有罪,並被迫支付版權費用以及其它許可協議費用。他之所以被認定侵權,是由於PKARC是明顯抄襲ARC,甚至於一些注釋里面的錯別字都相同。

Phil Katz自1988年之后就因許可證問題不能繼續出售PKARC,所以1989年他創建了一個PKARC的修改版,就是現在大家熟知的ZIP格式。由於使用了LZW,它被認為專利侵權的,之后Katz選擇轉而使用新的IMPLODE算法,這種格式於1993年再次被修改,那時Kata發布了PKZIP的2.0版本,那個版本實現了DEFLATE算法以及一些其它特性,如分割容量等。這個ZIP版本也是我們現在隨處可見的格式,所有的ZIP文件都遵循PKZIP 2.0格式,盡管它年代久遠。

GIF格式,全稱Graphics Interchange Format,於1987年由CompuServe創建,允許圖像無失真地被共享(盡管這種格式被限定每一幀最多256種顏色),同時減小文件的大小以允許通過數據機傳輸。然而,像ZIP格式一樣,GIF也是基於LZW算法。盡管專利侵權,Unisys沒有辦法去阻止GIF的傳播。即使是現在,20年后的今天,GIF仍然被使用着,特別是它的動畫能力。

盡管GIF沒有辦法被叫停,CompuServe需找一種不受專利束縛的格式,並於1994年引入了Portable Network Graphics (PNG) 格式。像ZIP一樣,PNG使用DEFLATE算法來處理壓縮。盡管DELLATE的專利屬於Katz,這個專利並不是強性制的,正是這樣,PNG以及其它基於DEFLATE的格式避免了專利侵權。盡管LZW在壓縮歷史的初期占據霸主位置,由於Unisys公司的好訴訟作為,LZW慢慢的淡出主流,大家轉而使用更快更高效的DEFLATE算法。現在DEFLATE是使用得最多的算法,有些壓縮世界里瑞士軍刀的味道。

除了用於PNG和ZIP格式之外,計算機世界里DEFLATE也被頻繁的用在其它地方。例如gzip(.gz)文件格式也使用了DEFLATE,gzip是ZIP的一個開源版本。其它還包括HTTP, SSL, 以及其它的高效壓縮網絡傳輸數據的技術。

遺憾的是,Phil Katz英年早逝,沒能看到他的DEFLATE算法統治計算機世界。有幾年的時間他酗酒成性,生活也於20世紀90年代末期開始支離破碎,好幾次因酒駕或者其它違法行為而被逮捕。Katz於2000年4月14號被發現死於一個酒店的房間,終年37歲。死因是酒精導致的嚴重胰腺出血,身旁是一堆的空酒瓶。

當前的一些歸檔軟件

ZIP以及其它基於DEFLATE的格式一直占據主導地位,直到20世紀90年代中期,一些新的改進的格式開始出現。1993年,Eugene Roshal發布了一個叫做WinRAR的歸檔軟件,該軟件使用RAR格式。最新的RAR結合了PPM和LZSS算法,前面的版本就不太清楚了。RAR開始在互聯網分享文件方面成為事實標准,特別是盜版影像的傳播。1996年一個叫bzip2d的Burrows-Wheeler Transform算法開源實現發布,並很快在UNIX平台上面流行開來,大有對抗基於DEFLATE算法的gzip格式。1999年另外一個開源壓縮程序發布了,以7-Zip或.7z的格式存在,7-Zip應該是第一個能夠挑戰ZIP和RAR霸主地位的格式,這源於它的高壓縮比,模塊化以及開放性。這種格式並不僅限於使用一種壓縮算法,而是可以在bzip2, LZMA, LZMA2, 和 PPMd算法之間任意選擇。最后,歸檔軟件中較新的一個格式是PAQ*格式。第一個PAQ版本於2002年由Matt Mahoney發布,叫做PAQ1。PAQ主要使用一種叫做context mixing的技術來改進PPM算法,context mixing結合了兩個甚至是多個統計模型來產生一個更好的符號概率預測,這要比其中的任意一個模型都要好。

壓縮技術

有許多不同的技術被用來壓縮數據。大多數技術都不能單獨使用,需要結合起來形成一套算法。那些能夠單獨使用的技術比需要結合的技術通常更加有效。其中的絕大部分都歸於entropy編碼類別下面,但其它的一些技術也挺常用,如Run-Length Encoding和Burrows-Wheeler Transform。

Run-Length Encoding

Run-Length Encoding是一個非常簡單的壓縮技術,把重復出現的多個字符替換為重復次數外加字符。單個字符次數為1。RLE非常適合數據重復度比較高的數據,同一行有很多像素顏色相同的漸進圖片,也可以結合Burrows-Wheeler Transform等其它技術一起使用。

下面是RLE的一個簡單例子:

輸入: AAABBCCCCDEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA輸出: 3A2B4C1D6E38A

Burrows-Wheeler Transform

Burrows-Wheeler Transform是1994年發明的技術,目的是可逆的處理一段輸入數據,使得相同字符連續出現的次數最大化。BWT自身並不做任何的壓縮操作,僅簡單地轉化數據,讓Run-Length Encoder等壓縮算法可以更有效的編碼。

BWT算法很簡單:

  1. 創建一個字符串數組。
  2. 把輸入字符串的所有排列組合塞入上述字符串數組。
  3. 按照字符順序為字符串數組排序。
  4. 返回數組的最后一列。

BWT通常處理有很多交叉重復字符的長字符串時效果很好。下面是一個有着理想輸入的例子,注意&是文件結束符:


因為交換相同的符號到一起,輸入數據在BWT處理之后得到優化后的結果,另外一個算法可以對該結果進行壓縮,比如RLE會得到"3H&3A"。盡管這個例子得到了一個較優的結果,不過現實世界中的數據它不總是這樣。

Entropy Encoding

數據壓縮中,平均來說為了表示一個字符或短語,Entropy意味着所需要的最少bit數。一個基本的entropy編碼器包括一個分析模型以及一套編碼。輸入文件被解析,並產生一個由字符出現概率組成的統計模型。然后,編碼器可以利用該統計模型去決定該給每一個字符多少個bit,從而使得最常用的字符用最短的編碼,反之最不常用的字符用最長的編碼。

Shannon-Fano Coding

這是最早的壓縮技術,於1949年由Claude Shannon和Robert Fano發明。這個技術的其中一個步驟是產生一個代表字符出現概率的二叉樹。字符以這樣一種方式排序,出現得越頻繁的字符越靠近樹的頂端,越不常見的越靠近樹的底部。

一個字符對應的編碼通過搜索Shannon-Fano來獲得,此外,左分支后面加0,右分支加1。例如,"A"是兩個左節點后接一個右節點,那么對於的編碼為"0012"。Shannon-Fano coding不總是能夠產生最優的編碼,主要是由於二叉樹是自下而上構建的。由於這個原因,使用的較多的還是對於任意輸入都能夠得到最優編碼的Huffman coding。

產生Shannon-Fano編碼的算法很簡單:

  1. 解析輸入,統計每一個字符出現的頻率。
  2. 根據是上述頻率計算字符的概率。
  3. 依據概率對字符降序排序。
  4. 為每一個字符生成一個葉節點(LeafNode)
  5. 把字符列表分為左右兩部分,使得左邊的概率與右邊的概率大致相當。
  6. 左節點加編碼"0",右節點加編碼"1"。
  7. 對兩棵子樹重復的步驟5和6,直到所有的字符節點都成為葉子節點。

Huffman Coding

Huffman Coding是另外一個entropy coding的例子,與Shannon-Fano Coding非常的相似,只是為了產生最優編碼二叉樹是自上而下構建的。

生成Huffman編碼的算法前面的三個步驟與Shannon-Fano完全相同:

  1. 解析輸入,統計每一個字符出現的頻率。
  2. 根據是上述頻率計算字符的概率。
  3. 依據概率對字符降序排序。
  4. 為每一個字符生成一個葉節點(LeafNode),節點包含概率信息P,把節點存入一個隊列Queue。
  5. While (Nodes in Queue > 1)
    • 從隊列里面取出概率最小的兩個節點。
    • 給左節點分配編碼"0",右節點分配編碼"1"。
    • 創建一個新的節點,其概率為上面步驟中的兩個節點之和。
    • 把兩個節點中的第一個設置為新建節點的左節點,第二個節點為新建節點的右節點。
    • 把新建節點存入隊列
  6. 最后一個節點就是二叉樹的根節點。

Arithmetic Coding

1979年該算法在IBM被開發出來,當時IBM正在調研一些壓縮算法,以期用於它們的大型機上。如果單論壓縮比,Arithmetic coding確實是一個最優的entropy coding技術,通常壓縮比方面Arithmetic Coding要比Huffman Coding表現得更好。然而,它卻也比其它技術復雜得多。

不像其它技術會把字符概率構建成一棵樹,arithmetic coding把輸入轉化為一個0到1之間的有理數,輸入字符的個數記為base,里面每一個不同的字符都分配一個0到base之間的值。然后,最后轉化為二進制得到最終的結果。結果也可以通過把base恢復為原來的base值,替換為對應字符而得到原輸入值。

一個基本的計算arithmetic code算法如下:

  1. 計算輸入數據里面不同字符的個數。這個數字記為base b(比如 base 2代表2二進制)。
  2. 按字符出現的順序分別給每一個字符分配一個0到b之間的值。
  3. 使用步驟2中德值,把輸入中的字符替換為對應的數字(編碼)。
  4. 把步驟3中得到的結果從b進制轉化為2進制。
  5. 如果解碼需要的話,記錄輸入的字符總個數。

下面是一個編碼操作的例子,輸入為"ABCDAABD":

  1. 找到共有4個不同的字符輸入, base = 4, length = 8。
  2. 按出現順序為不同的字符賦值: A=0, B=1, C=2, D=3。
  3. 用編碼替換字符,得到“0.012300134”,注意最前面的"0."是為了得到小數而加上去的。最后的4表示base=4。
  4. 把“0.012300134”從4進制轉化為2進制,得到“0.011011000001112”。最后的2表示base=2。
  5. 在結果中標識輸入的總字符數為8。

假設字符為8個bit表示,輸入共需要64個bit空間,然而對應的arithmetic coding只有15個bit,壓縮比為24%,效果顯著。這個例子展示了arithmetic coding是如何良好的壓縮固定字符串的。

壓縮算法

Sliding Window Algorithms

LZ77

LZ77發表於1977年,是名副其實的壓縮算法開山之作。它首次引入'sliding window'的概念,相較幾個主要的壓縮算法,壓縮比都有非常明顯的提高。LZ77維護了一個字典,用一個三元組來表示offset,run length和分割字符。offset表示從文件起始位置到當前Phase的起始位置的距離,run length記錄當前Phase有多少個字符,分割符僅用於分割不同的Phase。Phase就是offset到offset+length之間的子串減掉分隔符。隨着文件解析的進行,基於sliding window字典會動態的變化。例如,64MB的sliding window意味着四點將包含64M的輸入數據的信息。

給定一個輸入為"abbadabba",那么輸出可能像"abb(0,1,'d')(0,3,'a')",如下圖所示:


盡管上述的替換看起來比原數據還要大,當輸入數據更大一些的時候,效果會比較好。

LZR

LZR是LZ77的修改版本,於1981年由Michael Rodeh發明。這個算法目標是成為LZ77的一個線性時間替換算法。然而,編碼后Udell指針可能指向文件的任意offset,意味着需要耗費可觀的內存。加之壓縮比表現也差強人意(LZ77好得多),LZR算是一個不成功的LZ77衍生算法。

DEFLATE

DEFLATE於1993年由Phil Katz發明,是現代絕大多數壓縮任務的基石。它僅僅結合了兩種算法,先用LZ77或LZSS預處理,然后用Huffman編碼,快速的得到不錯的壓縮結果。

DEFLATE64

DEFLATE64是DEFLATE的一個有專利的擴展,把字典的大小提高到64K(名字隨之),從而允許在sliding window里面有更大的距離。相比於DEFLATE,DEFLATE64在性能和壓縮比方面都有提高。然而,由於DEFLATE64的專利保護以及相較DEFLATE並沒有特別明顯的提高,DEFLATE64很少被采用。相反一些開源算法如LZMA被大量的使用。

LZSS

LZSS,全稱Lempel-Ziv-Storer-Szymanski,於1982年由James Storer發表。LZSS相較LZ77有所提高,它能檢測到一個替換是否真的減小了文件大小。如果文件大小沒有減小,不再替換輸入值。此外,輸入段被(offset, length)數據對替換,其中offset表示離輸入起始位置的bytes數量,length表示從該位置讀取了多少個字符。另外一個改進是去除了"next character"信息,僅僅使用offset-length數據對。

下面是一個輸入為" these theses"簡單的例子,結果為" these(0,6)s",僅僅節省了一個Byte,不過輸入數據大的時候效果會好得多。


LZSS依然被用在許多使用廣泛的歸檔格式中,其中最知名的是RAR。LZSS有時也被用於網絡數據壓縮。

LZH

LZH發明於1987年,全稱為"Lempel-Ziv Huffman"。它是LZSS的一個衍生算法,利用Huffman coding壓縮指針,壓縮效果有微小的提高。然而使用Huffman coding帶來的提高實在是很有限,相較於使用Huffman coding帶來的性能損失,不足為取。

LZB

LZB同樣發明於1987年,同樣是LZSS的衍生算法。如LZH一樣,LZB也致力於通過更加有效的編碼指針以達到更好的壓縮效果。它的做法是隨着sliding window變大,逐步的增大指針的數量。它的壓縮效果確實比LZSS和LZH要好,不過因為額外的編碼步驟,速度上比LZSS慢得多。

ROLZ

ROLZ全稱"Reduced Offset Lempel-Ziv",它的目標是提高LZ77的壓縮效果,通過限制offset的大小,從而減少為offset-length數據對編碼的數據量。這項LZ77的衍生技術於1991年首次出現在Ross Williams的LZRW4算法里面。其它的實現包括BALZ,QUAD,和 RZM。高度優化的ROLZ能夠達到接近LZMA的壓縮比,不過ROLZ不太流行。

LZP

LZP全稱"Lempel-Ziv + Prediction"。它是ROLZ算法的一個特殊案例,offset減小到1。有幾個衍生的算法使用不同的技術來實現或加快壓縮速度,或提高壓縮比的目標。LZW4實現了一個數字編碼器達到了最好的壓縮比,不過犧牲了部分速度。

LZRW1

Ron Williams於1991年發明了這個算法,第一次引入了Reduced-Offset Lempel-Ziv compressiond的概念。LZRW1能夠達到很高的壓縮比,同時保持快速有效。Ron Williams也發明另外幾個基於LZRW1改進的衍生算法,如LZRW1-A, 2, 3, 3-A, 和4。

LZJB

Jeff Bonwick於1998年發明了Lempel-Ziv Jeff Bonwick算法,用於Solaris操作系統的Z文件系統(ZFS)。它被認為是LZRW算法的一個衍生算法,特別是LZRW1,目標是改進壓縮速度。既然它是被用於操作系統,速度顯得尤為重要,不能因為壓縮算法的原因而使得磁盤操作成為瓶頸。

LZS

Lempel-Ziv-Stac算法於1994年由Stac Electronics發明,用於磁盤壓縮軟件。它是LZ77的一個修改版本,區分了輸出的文字符號與offset-length數據對,此外還移除了分隔符。功能上來說,LZS與LZSS算法很相似。

LZX

LZX算法於1995年由Jonathan Forbes和Tomi Poutanen發明,用於Amiga計算機。LZX中X沒有什么特殊的意義。Forbes於1996年把該算法出售給了微軟,並且受雇於微軟,那那兒該算法被繼續優化並用於微軟的cabinet(.CAB)格式。這個算法也被微軟用於壓縮Compressed HTML Help (CHM) 文件,Windows Imaging Format (WIM) 文件,和 Xbox Live Avatars。

LZO

LZO於1996年由Markus發明,該算法的目標是快速的壓縮和解壓縮。它允許調整壓縮級別,並且在最高級別下仍僅需64KB額外的內存空間,同時解壓縮僅需要輸入和輸出的空間。LZO功能上非常類似LZSS,不過是為了速度,而非壓縮比做的優化。

LZMA

Lempel-Ziv Markov chain Algorithm算法於1998年首次發表,是隨着7-Zip歸檔軟件一起發布的。大多數情況下它比bzip2, DEFLATE以及其它算法表現都要好。LZMA使用一系列技術來完成輸出。首先時一個LZ77的修改版本,它操作的是bitwise級別,而非傳統上的bytewise級別,用於解析數據。LZ77算法解析后的輸出經過數字編碼。更多的技術可被使用,這依賴於具體的LZMA實現。相比其它LZ衍生算法,LZMA在壓縮比方面提高明顯,這要歸功於操作bitewise,而非bytewise。

LZMA2

LZMA2是LZMA的一個增量改進版本,於2009年在7-Zip歸檔軟件的一個更新版本里面首次引入。LZMA2改進了多線程處理功能,同時優化對不可壓縮數據的處理,這也稍微提高了壓縮效果。

Statistical Lempel-Ziv

Statistical Lempel-Ziv是於2001年由Sam Kwong博士和Yu Fan Ho博士提出的一個概念。基本的原則是數據的統計分析結果可以與LZ77衍生算法結合起來,進一步優化什么樣的編碼將存儲在字典中。

Dictionary Algorithms

LZ78

LZ78於1978年由Lempel和Ziv發明,縮寫正是來源於此。不再使用sliding window來生成字典,輸入數據要么被預處理之后用來生成字典,或者字典在文件解析過程中逐漸形成。LZ78采用了后者。字典的大小通常被限定為幾兆的大小,或者所有編碼上限為幾個比特,比如8個。這是出於減少對內存要求的考量。算法如何處理正是LZ78的各個衍生算法的區別所在。

解析文件的時候,LZ78把新碰到的字符或者字符串加到字典中。針對每一個符號,形如(dictionary index, unknown symbol)的字典記錄會對應地生成。如果符號已經存在於字典中,那么將從字典中搜索該符號的子字符串以及其后的其它符號。最長子串的位置即為字典索引(Index)。字典索引對應的數據被設置為最后一個未知子串。如果當前字符是未知的,那么字典索引設置為0,表示它是單字符對。這些數據對形成一個鏈表數據結構。

形如"abbadabbaabaad"的輸入,將會產生"(0,a)(0,b)(2,a)(0,d)(1,b)(3,a)(6,d)"這樣的輸出。你能從下面的例子里面看到它是如何演化的:


LZW

LZW於1984年由Terry Welch發明,全稱為Lempel-Ziv-Welch。它是LZ78大家族中被用得最多的算法,盡管被專利嚴重的阻礙了使用。LZW改進LZ78的方法與LZSS類似。它刪除輸出中冗余的數據,使得輸出中不再包含指針。壓縮之前它就在字典里面包含了每一個字符,也引入了一些技術改進壓縮效果,比如把每一個語句的最后一個字符編碼為下一個語句的第一個字符。LZW在圖像轉換格式中較為常見,早期也曾用於ZIP格式里面,也包括一些其他的專業應用。LZW非常的快,不過相較於一些新的算法,壓縮效果就顯得比較平庸。一些算法會更快,壓縮效果也更好。

LZC

LZC,全稱Lempel-Ziv Compress,是LZW算法的一個微小修改版本,用於UNIX壓縮工具中。LZC與LZW兩者的區別在於,LZC會監控輸出的壓縮比。當壓縮比超過某一個臨界值的時候,字典被丟棄並重構。

LZT

Lempel-Ziv Tischer是LZC的修改版,當字典滿了,刪除最不常用的的語句,用新的記錄替換它。還有一些其它的小改進,不過現在LZC和LZT都不常用了。

LZMW

於1984年由Victor Miller和Mark Wegman發明,LZMW算法非常類似於LZT,它也采用了替換最不常用語句的策略。然而,不是連接字典中相似的語句,而是連接LZMW最后被編碼的兩個語句並且存儲為一條記錄。因此,字典的容量能夠快速擴展並且LRUs被更頻繁的丟棄掉。LZMW壓縮效果比LZT更好,然而它也是另外一個這個時代很難看到其應用的算法。

LZAP

LZAP於1988年由James Storer發明,是LZMW算法的修改版本。AP代表"all prefixes",以其遍歷時在字典里面存儲單個語句,字典存儲了語句的所有排列組合。例如,如果最后一個語句為"last",當前語句是"next",字典將存儲"lastn","lastne","lastnex",和 "lastnext"。

LZWL

LZWL是2006年發明的一個LZW修改版本,處理音節而非字符。LZWL是專為有很多常用音節的數據集而設計的,比如XML。這種算法通常會搭配一個前置處理器,用來把輸入數據分解為音節。

LZJ

Matti Jakobsson於1985年發表了LZJ算法,它是LZ78大家族中唯一一位衍生於LZW的算法。LZJ的工作方式是,在字典中存儲每一個經過預處理輸入中的不同字符串,並為它們編碼。當字典滿了,移除所有只出現一次的記錄。

Non-dictionary Algorithms

PPM

通過抽樣來預測數據是一項統計建模技術,使用輸入中的一部分數據,來預測后續的符號將會是什么,通過這種算法來減少輸出數據的entropy。該算法與字典算法不一樣,PPM預測下一個符號將會是什么,而不是找出下一個符號來編碼。PPM通常結合一個編碼器來一起使用,如arithmetic編碼或者適配的Huffman編碼。PPM或者它的衍生算法被實現於許多歸檔格式中,包括7-Zip和RAR。

bzip2

bzip2是Burrows-Wheeler Transform算法的一個開源實現。它的操作原理很簡單,不過卻在壓縮比和速度之間達到了一個平衡,表現良好,這讓它在UNIX環境上很流行。首先,使用了一個Run-Length編碼器,接下來,Burrows-Wheeler Transform算法加入進來,然后,使用move-to-front transform以達到產生大量相同符號的目標,為接下來的另一個Run-Length 編碼器做准備。最后結果用Huffman編碼,將一個消息頭與其打包。

PAQ

PAQ於2002年由Matt Mahoney發明,是老版PPM的一個改進版。改進的方法是使用一項叫做context mixing的革命性技術。Context mixing是指智能地結合多個(PPM是單個模型)統計模型,來做出對下一個符號的更好預測,比其中的任何一個模型都要好。PAQ是最有前途的技術之一,它有很好的壓縮比,開發也很活躍。自它出現后算起,有超過20個衍生算法被發明出來,其中一些在壓縮比方面屢破記錄。PAQ的最大缺點是速度,這源於使用了多個統計模型來獲得更好的壓縮比。然而隨着硬件速度的不斷提升,它或許會是未來的標准。PAQ在應用方面進步緩慢,一個叫PAQ8O的衍生算法可以在一個叫PeaZip的Windows程序里面找到,PAQ8O支持64-bit,速度也有較大提升。其它的PAQ格式僅僅用於命令行程序。


原文(英文):http://ethw.org/History_of_Lossless_Data_Compression_Algorithms

原文(中文翻譯):http://blog.csdn.net/kimylrong/article/details/39405981


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com