1. 引言
LZ77演算法是採用字典做資料壓縮的演算法,由以色列的兩位大神Abraham Lempel與Jacob Ziv在1977年發表的論文《A Universal Algorithm for Sequential Data Compression》中提出。
基於統計的資料壓縮編碼,比如Huffman編碼,需要得到先驗知識——信源的字元頻率,然後進行壓縮。但是在大多數情況下,這種先驗知識是很難預先獲得。因此,設計一種更為通用的資料壓縮編碼顯得尤為重要。LZ77資料壓縮演算法應運而生,其核心思想:利用資料的重複結構資訊來進行資料壓縮。舉個簡單的例子,比如
取之以仁義,守之以仁義者,周也。取之以詐力,守之以詐力者,秦也。
取之以、仁義、,、者、守之以、也、詐力、。均重複出現過,只需指出其之前出現的位置,便可表示這些詞。為了指明出現位置,我們定義一個相對位置,如圖
相對位置之後的訊息串為取之以詐力,守之以詐力者,秦也。,若能匹配相對位置之前的訊息串,則編碼為以其匹配的訊息串的起始與末端index;若未能匹配上,則以原字元編碼。相對位置之後的訊息串可編碼為:[(1-3),(詐力),(6),(7-9),(詐力),(12),(6),(秦),(15-16)],如圖所示:
上面的例子展示如何利用索引值來表示詞,以達到資料壓縮的目的。LZ77演算法的核心思想亦是如此,其具體的壓縮過程不過比上述例子稍顯複雜而已。 2. 原理
本文講主要討論LZ77演算法如何做壓縮及解壓縮,關於LZ77演算法的唯一可譯、無損壓縮(即解壓可以不丟失地還原資訊)的性質,其數學證明參看原論文[1]。 滑動視窗
至於如何描述重複結構資訊,LZ77演算法給出了更為確切的數學解釋。首先,定義字串 S S的長度為 l(s) l(s),其中 S(1,j), 1≤j≤l(s) S(1,j), 1≤j≤l(s)為 S S的首碼。對於 S(1,j) S(1,j)且 i≤j i≤j, L(i) L(i)為滿足下列條件的 l l( l≤l(S)−j l≤l(S)−j)的最大值: