1. 程式人生 > >LZ系類經典壓縮演算法介紹

LZ系類經典壓縮演算法介紹

LZ系類壓縮演算法介紹

主要介紹1)簡單字典編碼,2)LZ77字典編碼,3)LZ78字典編碼。

1、簡單字典編碼

這是一種簡單的方法,但是需要遍歷兩次待壓縮的資料。

1.1、實現具體步驟

  • 1 讀取待編碼資料,記錄出現過的Byte出現次數
  • 2 按照概率從高到低,排序記錄的資料;
  • 3 排序後的記錄就構成了一個字典,在每個記錄前加上序號長度,000代表長度為1,111代表長度為8.比如第二條記錄,序號為0000 0101,實際長度為3,在1前面加上010。寫入壓縮的符號是010101,總共6個bit。
  • 4 第二次遍歷待壓縮的資料,搜尋字典將序號長度+序號寫入壓縮檔案。

1.2、優缺點

  • 優點:簡單,解壓所讀快。
  • 缺點:壓縮速度慢,需要遍歷兩次,最大隻能有256個元素,壓縮率可能不高。
  • 適合:文字壓縮,以Byte為單位。

2、LZ77

2.1、LZ77演算法介紹

LZ77演算法是由Lempel和Ziv在1977年的論文中提出來的,該演算法將輸入流中之前的字元作為字典。編碼器維護一個滑動視窗,輸入字元流從右往左滑動。滑動視窗由兩部分組成,如下圖所示,左邊的是已編碼區域(當前字典),右邊是待編碼區域。已編碼區域長度通常是1000+,待編碼區域通常是數十個位元組。匹配的資料使用三元組來表示(距離,匹配長度,待編碼區下一個符號)滑動視窗示意圖

2.1、編碼器工作步驟

  • 1 編碼器從右往左搜尋待搜尋區域,尋找和已編碼區域
    第一個符號e相同的符號,找到了easily中的e
  • 2 從第一個匹配字元e向後(右)儘可能尋找連續的匹配字元,得到匹配字串eas,匹配長度為3。
  • 3 編碼器繼續往左搜尋,重複步驟1、2.
  • 4 使用匹配長度最長的三元組來表示,如果沒有匹配的資料使用(0, 0, 未匹配的字元)表示。

2.1.1 Example

LZ77工作步驟示意圖

2.2、優缺點

  • 優點:解壓速度快。
  • 缺點:壓縮速度慢。
  • 適用場景:適合於一次壓縮,多次解壓的檔案。

3、LZ78

LZ78演算法是Lempel和Ziv在1978年提出的,LZ78和LZ77兩種演算法在構建字典的思路上完全不同。LZ78沒有使用滑動視窗,通過對已經編碼的資料進行統計,實時更新維護字典。編碼器輸出二元組(字典指標,未編碼的符號),工作編碼過程如下圖所示。

LZ78工作過程示意圖

3.1、編碼器工作步驟

  • 1 開始編碼,字典是空的,只有一個元素:編號:0;內容:null
  • 2 輸入新元素,查詢字典中相匹配的字元。以上圖為例,1)沒有匹配的字元,如輸入第二個元素i,使用(0,“i”)表示,將符號i新增到字典。2)存在匹配的字元,如第5個元素,輸入元素si,符號s元素前面已經出現過,再輸入i,沒有匹配的資料,編碼器輸出(1, "i"),將"si"加入字典。
  • 3 重複步驟2,直到輸入全部完成。

3.2、優缺點

  • 優點:解壓速度快,無需傳輸字典,解碼過程構建字典。
  • 缺點:編碼相對比LZ77複雜。
  • 適用場景:適用於文字壓縮,為單詞建立詞典。