無損數據壓縮算法的歷史

引言

有兩種基本的壓縮算法: 有損和無損。有損壓縮算法經過移除在保真情形下需要大量的數據去存儲的小細節,從而使文件變小。在有損壓縮裏,因某些必要數據的移除。恢復原文件是不可能的。有損壓縮主要用來存儲圖像和音頻文件。同一時候經過移除數據可以達到一個比較高的壓縮率,只是本文不討論有損壓縮。無損壓縮,也使文件變小,但相應的解壓縮功能可以精確的恢復原文件,不丟失不論什麼數據。無損數據壓縮被普遍的應用於計算機領域,從節省你我的電腦的空間。到經過web發送數據。php

使用Secure Shell交流,查看PNG或GIF圖片。web

無損壓縮算法可行的基本原理是,隨意一個非隨機文件都含有反覆數據。這些反覆數據可以經過用來肯定字符或短語出現機率的統計建模技術來壓縮。統計模型可以用來爲特定的字符或者短語生成代碼,基於它們出現的頻率,配置最短的代碼給最常用的數據。這些技術包含熵編碼(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給班級的同窗兩個選項,寫一篇學期論文或者參加期末考試。less

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開始因專利侵權而起訴軟件提供商。server管理員,甚至是使用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是一個很easy的壓縮技術,把反覆出現的多個字符替換爲反覆次數外加字符。

單個字符次數爲1。RLE很適合數據反覆度比較高的數據,同一行有許多像素顏色一樣的漸進圖片。也可以結合Burrows-Wheeler Transform等其餘技術一塊兒使用。

如下是RLE的一個簡單樣例:

輸入: AAABBCCCCDEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA輸出: 3A2B4C1D6E38A

Burrows-Wheeler Transform

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

BWT算法很是easy:

  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編碼的算法很是easy:

  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算法的一個開源實現。

它的操做原理很是easy,只是卻在壓縮比和速度之間達到了一個平衡,表現良好,這讓它在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格式只用於命令行程序。

原文連接

相關文章
相關標籤/搜索