LZ77アルゴリズム詳解:字典圧縮是怎么工作的?

結論先行:LZ77 是一種類基于滑动窗口的字典圧縮アルゴリズム,核心思想是"用历史データ做字典,遇到重复コンテンツである引用回去"。エンコード时输出三元グループ (distance, length, next_char):回溯 distance つ字符找到匹配,匹配长度 length,紧跟一つ未匹配字符 next_char。以"abracadabra"この 11 つ字符である例,LZ77 エンコード后仅需 5 つ三元グループ即可表示,圧縮効果显著。LZ77 是 DEFLATE(ZIP/GZIP/PNG)的核心グループ件,也是 LZSS/LZMA/LZ4 等现代圧縮アルゴリズム的共同祖先。以下では滑动窗口原理から説明し,逐步演示エンコードプロセス。

もし Huffman エンコード的原理まだ慣れていない場合は,まずHuffman エンコード原理:圧縮アルゴリズム的基石詳解

一、什么是字典圧縮

圧縮アルゴリズム分2大流派:統計エンコード(如 Huffman エンコード)按字符频率分配变长码字;字典圧縮用"指针引用"替换重复コンテンツ。LZ77 属于字典圧縮流派,它不预先构建字典表,而是用已処理的历史データ作である隐式字典——遇到重复コンテンツ时,用一つ"回溯指针"指向之前出现过的位置。

圧縮流派核心原理代表アルゴリズム优势劣势
統計エンコード按频率分配变长码Huffman, 算术エンコード逼近熵下界不擅长长程重复
字典圧縮用引用替换重复コンテンツLZ77, LZW, LZMA擅长重复模式に対して随机データ无效
混合エンコード字典+統計2阶段DEFLATE, ZSTD综合最优実現较複雑
变换エンコード变换到频域再量化DCT(JPEG), DWT有损圧縮効率高有信息損失

实践中最流行的圧縮アルゴリズム几乎都是"混合エンコード"——先用 LZ77 消除重复模式,再用 Huffman に対して残差做频率圧縮。DEFLATE である是 LZ77 + Huffman 的经典グループ合,被 ZIP、GZIP、PNG 广泛使用。

二、LZ77 アルゴリズム原理詳解

LZ77 的核心是滑动窗口机制。窗口分である2部分:搜索缓冲区(已処理的历史データ)和前视缓冲区(待処理的未来データ)。エンコード时在前视缓冲区取一段コンテンツ,在搜索缓冲区中查找最长匹配,找到である输出三元グループ,找不到である输出元字符。

1. 滑动窗口構造

滑动窗口的大小直接决定圧縮効果——窗口越大,能回溯查找的历史データ越多,匹配概率越高。不同アルゴリズム的窗口大小差异很大。

アルゴリズム搜索缓冲区前视缓冲区最大匹配长度典型シナリオ
LZ77元几KB十几字节16字节教学例
DEFLATE32KB258字节258字节ZIP/GZIP/PNG
LZMA8MB(可配)273字节273字节7z/xzアーカイブ
LZ464KB无制限无制限实时圧縮
ZSTD8MB(最大1GB)无制限无制限现代通用

2. 三元グループエンコード形式

LZ77 的输出单元是三元グループ (distance, length, next_char),三つ字段的含义如下表。

字段含义取值範囲(DEFLATE)エンコード位数
distance回溯距离(向后多少字符找匹配)1–3276815 bitdistance=10 → 往前10つ字符
length匹配长度(连续匹配多少字符)3–2588 bitlength=5 → 匹配5つ字符
next_char匹配后的下一つ字符0–2558 bitnext_char='d' → ASCII 100

三元グループ的巧妙之处在于:匹配结束后多输出一つ next_char,保证エンコーダー总能向前推进至少 1 つ字符,不会卡死。如果找不到任何匹配(length=0),distance 和 length 都である 0,只输出 next_char——相当于退化である元字符ストレージ。

3. 匹配查找戦略

匹配查找是 LZ77 的性能瓶颈——在前视缓冲区取一段コンテンツ,在搜索缓冲区中找最长匹配。暴力查找是 O(n×m) 複雑度,实际実現用哈希表或后缀树加速。

查找戦略データ構造查找複雑度空間开销典型適用
暴力查找O(n×m)教学例
哈希链哈希表+链表O(n)平均zlib(DEFLATE)
哈希桶哈希表+数グループO(1)平均LZ4
后缀树后缀树/后缀数グループO(n)最坏LZMA

三、実戦案例:"abracadabra"エンコード演示

用 LZ77 に対して"abracadabra"(11 つ字符)行う完整エンコード。初始状态搜索缓冲区である空,前视缓冲区である整つ字符串。逐つ位置扫描,在历史データ中查找最长匹配。

原文: a b r a c a d a b r a

エンコードプロセス:

ステップ当前位置前视コンテンツ搜索缓冲区查找输出三元グループ説明
1位置1abracadabra空,无匹配(0, 0, 'a')首つ字符,直接输出
2位置2bracadabra"a",无匹配"b"(0, 0, 'b')首次出现,直接输出
3位置3racadabra"ab",无匹配"r"(0, 0, 'r')首次出现,直接输出
4位置4acadabra"abr"中找到"a"(0, 0, 'a')"a"出现但后续不匹配
5位置5cadabra"abra"中无"c"(0, 0, 'c')首次出现,直接输出
6位置6adabra"abrac"中找到"a"(0, 0, 'a')"a"匹配但后续不匹配
7位置7dabra"abraca"中无"d"(0, 0, 'd')首次出现,直接输出
8位置8abra回溯7找到"abra"匹配(7, 4, end)匹配"abra"4つ字符

エンコード効率比較:

エンコード方式输出单元数每单元bit总bitvs元节省
ASCII元11字符888—(基准)
LZ77(无匹配最適化)8三元グループ31(平均)248-182%(膨胀)
LZ77(最適化标记位)8单元12(平均)96-9%(略膨胀)
LZ77+Huffman8单元4.5(平均)3659%

結果分析: 纯 LZ77 に対して短字符串可能膨胀(三元グループ比元字符占用更多空間),このである是である什么 LZ77 通常与 Huffman エンコードグループ合使用——DEFLATE である是 LZ77 + Huffman。在"abracadabra"案例中,位置 8 的匹配"abra"(distance=7, length=4)是重要圧縮点,4 つ字符用一つ三元グループ表示。に対して于更长、重复模式更多的文本(如コードファイル、日志),LZ77 的圧縮効果会显著向上。

四、LZ77 变体与现代演化

LZ77 自 1977 年提出后衍生出大量变体,每つ变体针に対して特定シナリオ最適化了某つ维度。下表比較主流 LZ77 家族成员。

アルゴリズム重要改进圧縮率圧縮速度解压速度典型適用
LZ77(元)三元グループエンコード教学
LZSS用标记位区分匹配/字面量早期システム
DEFLATELZSS+Huffman2阶段中高ZIP/GZIP/PNG
LZMA大窗口+区間エンコード+最优解析7z/xzアーカイブ
LZ4牺牲圧縮率换极致速度极快极快(4GB/s)实时/内核
LZW显式字典表(非滑动窗口)GIF/TIFF
ZSTDLZ77变体+FSE+字典预设极快现代通用

から演化趋势看,现代アルゴリズム(ZSTD、brotli)在保持高圧縮率的同时大幅向上了速度,逐渐取代 DEFLATE 成である新一代標準。但 LZ77 的核心思想——滑动窗口字典引用——始终未变,所有变体都建立在このつ基础之上。

シナリオ推奨アルゴリズム理由圧縮率参照
ファイルアーカイブLZMA(xz)圧縮率最高,不追求速度70%–85%
通用圧縮ZSTD圧縮率和速度兼顾60%–80%
实时転送LZ4解压速度4GB/s,延迟极低50%–65%
Web転送DEFLATE/GZIP互換性最好,所有浏览器サポート50%–70%
画像形式DEFLATE(PNG)无损圧縮,適した图形类50%–75%
内存データLZ4低CPU占用,適した高频圧縮50%–65%

について PNG 形式中 DEFLATE 的具体適用,を参照してくださいPNG 圧縮原理詳解。无损圧縮与有损圧縮的区别,を参照してください无损圧縮 vs 有损圧縮:核心区别

五、よくある質問FAQ

Q1:LZ77アルゴリズム是什么?

LZ77 是一種類基于滑动窗口的字典圧縮アルゴリズム,由 Lempel 和 Ziv 于 1977 年提出。核心思想是:用之前已処理的データ作である字典,遇到重复コンテンツ时用 (distance, length, next_char) 三元グループ替换元データ,distance 表示回溯距离,length 表示匹配长度,next_char 表示匹配后的下一つ字符。LZ77 是 DEFLATE(ZIP/GZIP/PNG) 的核心グループ件,也是 LZSS/LZMA/LZ4 等现代アルゴリズム的祖先。

Q2:LZ77的滑动窗口是什么意思?

滑动窗口是 LZ77 的核心データ構造,分である搜索缓冲区(已処理的历史データ)和前视缓冲区(待処理的未来データ)。エンコード时在前视缓冲区中取一段コンテンツ,在搜索缓冲区中查找最长匹配。典型窗口大小である 32KB(DEFLATE 標準),窗口越大匹配概率越高但内存开销越大。窗口大小决定了最大回溯距离 distance 的上限。

Q3:LZ77和LZ78有什么区别?

LZ77 用滑动窗口做隐式字典,匹配コンテンツ直接引用历史データ,不单独ストレージ字典;LZ78 用显式字典表,を已见的字符串编号ストレージである字典条目,エンコード时输出字典索引。LZ77 更適した有局部重复的データ(如文本),LZ78 更適した全局重复的データ。实践中 LZ77 的后代(DEFLATE/LZMA/LZ4)远比 LZ78 的后代(LZW)更流行。

Q4:LZ77、LZMA、LZ4哪つ圧縮率最高?

圧縮率排序:LZMA > LZ77(DEFLATE) > LZ4。LZMA 用更大的窗口(デフォルト 8MB)、更优的匹配アルゴリズム和区間エンコード,圧縮率最高但速度最慢;DEFLATE 窗口 32KB + Huffman,圧縮率中等速度中等;LZ4 牺牲圧縮率换取极致速度,圧縮率最低但解压速度可达 4GB/s。选型取决于シナリオ:アーカイブ选 LZMA,通用选 DEFLATE/ZSTD,实时选 LZ4。

まとめ

LZ77 是字典圧縮アルゴリズム的鼻祖,核心原理是"滑动窗口 + 三元グループ引用":用历史データ做隐式字典,遇到重复コンテンツである输出 (distance, length, next_char) 三元グループ。纯 LZ77 に対して短文本可能膨胀,但与 Huffman エンコードグループ合后(DEFLATE)成である ZIP/GZIP/PNG 的標準圧縮ソリューション。现代变体 LZMA 追求极致圧縮率,LZ4 追求极致速度,ZSTD 兼顾2者。

理解 LZ77 的重要三点:一是滑动窗口决定匹配範囲(DEFLATE 32KB,LZMA 8MB),二是三元グループ是基本エンコード单元(回溯+长度+下一字符),三是匹配查找戦略决定性能(哈希链最快,后缀树最优)。LZ77 + Huffman 的混合エンコード是现代无损圧縮的黄金標準。

ファイルを圧縮してみませんか?SmartSlimを試す

独自開発のRust圧縮エンジンに基づき、PDF/画像/動画/Office/OFDなど10分野40以上の形式に対応。ローカル圧縮でデータは外部に送信されません。