壓縮 | 解壓 | 分析

> lz77 | sliding | window <

// LZ77 —— 使用滑動視窗與字典參照的無失真壓縮演算法

0 個字元
0 個字元

>> 功能特色

[DICTIONARY]

字典編碼

透過偏移量與長度參照重複子字串,以節省空間。

[SLIDING]

滑動視窗

維持一個滑動視窗以尋找最長的匹配資料。

[FOUNDATION]

現代壓縮核心

是 ZIP、GZIP、DEFLATE、PNG 等格式背後的核心演算法。

>> 技術說明

LZ77 的運作原理

LZ77 維持一段最近出現資料的滑動視窗。對於每一個位置,演算法會在視窗中搜尋與目前前視緩衝區開頭最長匹配的子字串。若找到匹配,就輸出 (偏移量、長度、下一個字元) 的參照;若找不到,則輸出 (0,0,字元) 的文字常值。藉由將重複片段替換為較短參照,即可達到無失真壓縮。

LZ77 範例

Text: "ABCABCABC"
Window=4, Lookahead=4

Position 0: 'A' - no match
  → (0,0,A)

Position 1: 'B' - no match
  → (0,0,B)

Position 2: 'C' - no match
  → (0,0,C)

Position 3: 'ABC' - matches at offset 3
  → (3,3,A)

Position 7: 'BC' - matches at offset 3
  → (3,2,)

Output: (0,0,A)(0,0,B)(0,0,C)(3,3,A)(3,2,)

為什麼要使用 LZ77?

  • 無失真壓縮,不流失任何資訊
  • 不需要預先了解資料格式
  • 可依資料重複模式自動調整
  • 實作相對簡單、易於理解
  • 是許多現代壓縮演算法的基礎模組

>> 常見問題

什麼是 LZ77?

LZ77 是 Abraham Lempel 與 Jacob Ziv 於 1977 年提出的通用無失真資料壓縮演算法。它會將資料串流中重複出現的片段,以指向先前出現位置的參照來取代,達到壓縮效果。

滑動視窗是如何運作的?

滑動視窗由搜尋緩衝區(已處理資料)與前視緩衝區(待壓縮資料)組成。演算法會在搜尋緩衝區中尋找與前視緩衝區開頭最長的匹配,然後輸出對應的參照或文字常值。

LZ77 與現代壓縮演算法的關係?

LZ77 是許多現代壓縮方案的基礎。ZIP 與 GZIP 所使用的 DEFLATE 將 LZ77 與 Huffman 編碼結合。LZSS 在 LZ77 基礎上減少冗餘,而 LZ78 與 LZW 則以不同方式建構字典,但仍採用類似概念。

建議的視窗大小是多少?

對於一般資料,常見視窗大小約為 32KB 到 64KB。較大的視窗可以找到更多匹配,但會消耗更多記憶體與時間。DEFLATE 採用 32KB 視窗,前視緩衝區通常為 256–512 位元組。最佳大小取決於資料的重複模式。