LZ77:過去を辞書として参照する
スライド窓から既出パターンを探し、(距離, 長さ) に置き換えていく様子をステップ実行で見ます。繰り返しの多い文ほど縮みます。
入力文字列(編集できます)
32
10
処理済み / 全体
—
出力トークン数
—
うち一致(コピー)
—
圧縮率(推定)
—
いま出力したトークン
読み方
- リテラル = 過去に無い新しい文字
- (距離, 長さ) = 距離だけ戻って長さ分コピー
スライド窓(左=過去/辞書、緑=今回の一致、右=未処理)
出力トークン列(これが圧縮データ)
LZ77 は、これから読む文字列の一部がすでに過去に出ていないかを探す圧縮法です。
見つかれば、その文字をそのまま書く代わりに「何文字前に戻り、何文字コピーすればよいか」を表す
過去を遡れる範囲を窓サイズ、一度にコピーできる最大長を先読みバッファといいます。 入力・窓サイズを変えて、繰り返しの多い文ほどトークン数が減る(=縮む)ことを確かめましょう。
見つかれば、その文字をそのまま書く代わりに「何文字前に戻り、何文字コピーすればよいか」を表す
(距離, 長さ) の組に置き換えます。過去の文字列そのものが「辞書」になるわけです。過去を遡れる範囲を窓サイズ、一度にコピーできる最大長を先読みバッファといいます。 入力・窓サイズを変えて、繰り返しの多い文ほどトークン数が減る(=縮む)ことを確かめましょう。
いま何が起きている?
ここがポイント
- 過去=辞書 ── 別表を持たず、すでに送った文字列自身を参照する。だから1パスで動く。
- (距離, 長さ) への置換 ── 繰り返し部分を1組のトークンに畳み込めるほどトークン数が減る。
- 窓サイズが効く ── 窓が狭いと遠くの繰り返しに届かず、リテラルが増えて縮みにくい。
- 繰り返しに強い ── ランダムな文字列は一致が見つからず、ほぼ全部リテラルのまま縮まない。