LZ77 – ウィキペディア

before-content-x4

LZ77 (Lempel-Ziv 77) [初め] 1977年にAbraham LempelとJacob Zivによって公開されたデータ圧縮のロスレス手順です。
これは、データレコードでデータのシーケンス全体が数回発生するのを初めて活用する辞書ベースの手順です。以前の手順(Huffman CodingやShannon Fanoコーディングなど)では、個々の文字の頻度のみが使用されました(エントロピーコーディングも参照)。 LZ77も最初のLZプロセスになります LZ1 呼び出されました。

after-content-x4

キャラクターチェーンのLZ77因子化

バツ {displaystyle x}

空でない文字列チェーンへの分解です

初め 2 k {displaystyle w_ {1}、w_ {2}、ldots、w_ {k}}

、 となることによって [2]

  • それぞれのため

個々の文字列

j {displaystyle w_ {j}}

なる 要因 また フレーズ 専用。

定義から直接導き出すことができます

after-content-x4
初め = バツ [ 初め ] {displaystyle w_ {1} = x [1]}

は。説明された

バツ [ j ] {displaystyle x [idots j]}

キャラクターチェーン

バツ {displaystyle x}

それは位置から

{displaystyle i}

すべての文字

バツ {displaystyle x}

ポジションまでのものまで

j {displaystyle j}

含む。

バツ [ ] {displaystyle x [i]}

キャラクターチェーンの略語です

バツ [ ] {displaystyle x [idots i]}

LZ77圧縮を計算するアルゴリズムのアイデアは、キャラクターチェーンのすでに処理されたプレフィックスを辞書として使用することです。実装のために、この辞書のサイズは、検索期間を制限するために実際には制限されています。したがって、通常はスライド窓です。 スライドウィンドウ )使用され、考慮される辞書とテキストの抜粋の両方を制限します(プレビューバッファー)。圧縮文字は、プレビューバッファーから辞書に徐々に移動されます。実際には、辞書のバッファには数千文字が含まれており、ネックラインのプレビューバッファーには約100文字(場合によっては少ない場合があります)が含まれています。

アルゴリズムは、元のテキストを回復できる一連のトリプレットを作成します。要因のトリプル

j {displaystyle w_ {j}}

形があります

p o s l そうです n l )) {displaystyle(pos、len、lambda)}

、それによって

辞書にバッファーを使用する場合、

p o s {displaystyle pos}

キャラクターチェーンは、バッファの左端または右端に比べて理解されます(実装によって異なる場合があります)、新しい文字を使用する必要があります

0 0 l )) {displaystyle(0,0、lambda)}

紹介されます。圧縮の出力形式により、辞書を明示的に保存せずにテキストを再構築できます。

擬似コード [ 編集 | ソーステキストを編集します ]

擬似コードは、スライドウィンドウを使用したLZ77圧縮サルゴリズムの複製です。

 その間    プレビューバッファー  いいえ  ファイル  ;  する  検索  r ü CKW ä RTS    rterbuch     l ä  ü 一貫性のある     プレビューバッファー ;  もしも   ü 参照  なりました  見つかった ;  それから  ギブ    トリプル  子孫  のために  ランド   rterbuch  l ä    見つかった   初め  いいえ  ü 一貫性のある  サイン  out   プレビューバッファー ))  out ;  延期        l ä + 初め ;  それ以外  ギブ    トリプル  0  0  初め  サイン  の中に  プレビューバッファー ))  out ;  延期      初め ;  終わり  もしも  終わり  その間  

[ 編集 | ソーステキストを編集します ]

LZ77因数分解の計算は、キャラクターチェーンに基づいています AACTAの乱用 説明します。

この表は、長さ12の辞書と長さ10のプレビューバッファー(0から9のインデックス)を使用したLZ77因数分解の計算を示しています。
右の列では、アルゴリズムの出力(0、0、 a )、(1、1、 c )、(3、4、 b )、(3、3、 a )および(12、3、 終わり )。
位置は辞書の右端に対して与えられます。これは、デコード時に同じ方法で行う必要があります。

バッファーは、移動ウィンドウの原則に従って動作します(英語: スライドウィンドウ )、d。 H.圧縮されるデータストリームは、右からバッファーに押し込まれます。
アルゴリズムに記載されているように、シフトは、辞書の対応する一致の長さと別の位置の長さで行われます。これは、冗長なトリプルが回避されることを意味します。そうしないと、新しい文字は常に辞書で個別に採用されます。例では、3番目のトリプル(0、0、 c )ただし、記録するには、圧縮率が大幅に悪化します。
マッチは緑色で、描画チェーンは赤で移動します。新しい文字をコーディングする必要がないために、契約で発見されたよりも常にサインが移動されることに注意する必要があります。

スライドウィンドウを使用したLZ77圧縮の例
ライン 12番目 11 9 8 7 6 5 4 3 2 初め 0 初め 2 3 4 5 6 7 8 9 出力
初め ファイル a a c a a c a b c a
2 ファイル a a c a a c a b c a b
3 ファイル a a c a a c a b c a b a a
4 ファイル a a c a a c a b c a b a a a c 終わり
5 a a c a a c a b c a b a a a c 終わり
完了

最初に見られたキャラクターは不明なので、最初のキャラクター a (0、0、 a )。
できる2行で a 辞書(マークグリーン)からすでに読むことができます。 c 新しいサインとして採用されています。
LZ77アルゴリズムの特殊なケースは、一致する文字列が予防ウィンドウに突き出ているため、3行目であるため、これは緑の赤のセルの色付けによって示されています。
4行目と5行目は最初の2つに相当しますが、最後のトリプル1では例外があります。 終わり – テキストが完全に圧縮されており、次のサインがないため、マークは次のサインとして紹介されます。

実行時間分析 [ 編集 | ソーステキストを編集します ]

アルゴリズムの持続時間は次のとおりです

th n )) {displaystyletheta(n)}

テキストは圧縮中に1回のみ渡されるため、指定されています。これは、プレビューと辞書バッファのサイズが一定であり、全会一致のストリングチェーンの検索が大きなテキストでは重要ではない場合に可能です。実際に使用すると、通常の検索(追加のデータ構造なし)を使用した実装はかなり遅いです。

長所と短所 [ 編集 | ソーステキストを編集します ]

LZ77の大きな利点は、テキストの知識なしに圧縮できることであり、特許でも証明されていないことです。 LZ78(LZ77の直接の後継者)は、テキストの再構成のための初期辞書(主にすべてのアイコンが一度ソートされる些細な辞書)を必要とし、2004年まで特許によって部分的に保護されていました。
ただし、LZ77の主な欠点は、特に小規模または非自然な言語テキストの場合、またはデータの量を拡大する場合、非常に圧縮されることです。これは、指定された例で明らかになります。元のテキストには16文字が含まれており、圧縮には15文字が必要であるため、1つのサインの節約のみを意味します。 Burrows Wheelerの変換や前面への移動コードと同様に、他の圧縮方法を使用するために、それは前プロセッサとして非常に適しています。 B.ハフマンコーディングからデータを効果的に圧縮する。

LZ77圧縮ファイルの減圧は、一致するストライキチェーンの検索が行われないため、圧縮よりも大幅に簡単です。この用語は線形であり、元のテキストが長いほど多くのステップがあるので、

th n )) {displaystyletheta(n)}

擬似コード [ 編集 | ソーステキストを編集します ]

擬似コードは、スライドウィンドウを使用したLZ77減圧サルゴリズムの複製です。

 ために  毎日  トリプル  オフセット  長さ  シンボル ))  もしも  長さ  >  0 ;  それから  実行  r ü CKW ä RTS     出力   ギブ  に限って  サイン  out  それまで   l ä  から  長さ  到達した    a  ü へそ  始める  新しい   オフセット ;  終わり  もしも  ギブ  シンボル  out ;  終わり  ために  

[ 編集 | ソーステキストを編集します ]

LZ77コーディングの減圧には追加の辞書は必要ありません。発行されたトリプルは、テキストを再構築するために明確です。
赤い貯蔵細胞は、次の線の再構築に使用される細胞です。

スライドウィンドウを使用したLZ77減圧の例
ライン 入力 16 15 14 13 12番目 11 9 8 7 6 5 4 3 2 初め
初め ファイル a
2 ファイル a a c
3 ファイル a a c a a c a b
4 ファイル a a c a a c a b c a b a
5 a a c a a c a b c a b a a a c 終わり
完了

トリプルの最初のエントリが同じ0の場合、トリプルの最後のエントリがテキストに添付されます(1行目を参照)。
入力を使用した2行目(1、1、 c )、1行目から再構築されたテキストの最初のエントリ(位置1のトリプルの最初のエントリと長さ1のトリプルの2番目のエントリ)
使用してからサイン c 後ろに添付されています。
3行目では、再使用された文字チェーンの長さは辞書の保存されたデータよりも長く(長さ4ですが、ストレージセル3から3つのセルのみが利用可能です)。 a 出力。そうなります b 処理するトリプルの最後のエントリとして。
4行目と5行目は同様に理解されるべきです。エンドサインは、テキストの終わりとしてグローバルに理解されるため、再構築では無視されます。
完全に再構築されたテキストはです AACTAの乱用

キャラクターチェーンのLZ77-factorizationのよりランタイム効率の計算のために、完全な文字列の因数分解を以下で計算し、スライドウィンドウの原理を放棄します。最後に、文字列全体のLZ77圧縮もいくつかのアプリケーションで使用されます(セクションを参照)。

追加のデータ構造の助けを借りて、用語に関しては、文字チェーンのLZ77因数分解の効率的な計算が可能です。
キャラクターチェーンの場合

バツ {displaystyle x}

指定

s a {displaystyleSa}

接尾辞アレイと

s a {displaystyle isa}

逆の接尾辞車から

バツ {displaystyle x}

、d。 H.そうです

s a [ ] = j {displaystyle isa [i] = j}

正確にいつ

s a [ j ] = {displaystyle sa [j] = i}

。また、説明してください

l c p j )) {displaystyle lcp(i、j)}

文字列チェーンの最も長い一般的な接頭辞の長さ

バツ [ s a [ ] n ] {displaystyle x [sa [i] .. n]}

バツ [ s a [ j ] n ] {displaystyle x [sa [j] .. n]}

、それによって

n = | バツ | {displaystyle n = | x |}

は。

計算では、要因に対してそれを使用します

j {displaystyle w_ {j}}

から

バツ {displaystyle x}

| j | > 初め {displaystyle | w_ {j} |> 1}

p o s {displaystyle pos}

Tupelのみのテキスト位置のみ

s a [ n s [ s a [ j ] ] ] {displaystyle sa [nsv [isa [j]]]}

s a [ p s [ s a [ j ] ] ] {displaystyle sa [psv [isa [j]]}}

考慮する必要があります。ある

n s [ j ] = m n { { j + 初め n } | s a [ ] < s a [ j ] } {displaystyle nsv [j] = min {iin {j+1、ldots、n}、|、sa [i]

(NSVは略です 次の小さな値 ) と

p s [ j ] = m a バツ { { 初め j 初め } | s a [ ] < s a [ j ] } {displaystyle psv [j] = max {iin {1、ldots、j-1}、|、sa [i]

(PSVは略です 以前の小さな値 )。 [3]

擬似コード [ 編集 | ソーステキストを編集します ]

アルゴリズム lz_factor(i、psv、nsv) リターンとして、次の要因の開始位置が配信されます

 アルゴリズム  LZ_Factor  PSV  ソ連 ))  もしも  LCP  PSV ))  >  LCP  ソ連 )) ;  それから  Pos  それだけ ))  < -   PSV  LCP  PSV )))  それ以外  Pos  それだけ ))  < -   ソ連  LCP  ソ連 )))  終わり  もしも  もしも  それだけ  =  0 ;  それから  Pos  < -    終わり  もしも  もしも   +  それだけ  >  n ;  それから  印刷  要素 Pos  それだけ  '終わり' ))  それ以外  印刷  要素 Pos  それだけ  バツ [ + それだけ ]))  終わり  もしも  戻る   +  マックス それだけ  初め ))  

2つの配列

n s {displaystyle nsv}

p s {displaystyle psv}

接尾辞マージンから缶

s a {displaystyleSa}

線形時間に計算:

 ために   < -   2   n + 初め ;  する  j  < -    -  初め  その間  定義されています j ))   の上 [ ]  <  の上 [ j ] ;  する  ソ連 [ j ]  < -    j  < -   PSV [ j ]  終わり  その間  PSV [ ]  < -   j  終わり  ために  

最後に、アルゴリズムが続き、キャラクターチェーンのLZ77因数分解を計算します

バツ {displaystyle x}

 計算します  の上   ソ連   PSV  f ü r  バツ  k  < -   初め  その間  k  <= =  n ;  する  PSV  < -   の上 [ PSV [ [ k ]]]  ソ連  < -   の上 [ ソ連 [ [ k ]]]  k  < -   LZ_Factor k  PSV  ソ連 ))  終わり  その間  

実行時間分析 [ 編集 | ソーステキストを編集します ]

文字列のLZ77因数分解の計算は、アルゴリズムを使用しています

o n )) {displaystyle {mathcal {o}}(n)}

可能な時間、それによって

n = | バツ | {displaystyle n = | x |}

入力記号チェーンの長さ

バツ {displaystyle x}

は。
メソッドLZ_Factorが必要です

o 初め )) {displaystyle {mathcal {o}}(1)}

の計算の時間

l c p j )) {displaystyle lcp(i、j)}

範囲の最小クエリを介して実現されます。配列の計算

n s {displaystyle nsv}

p s {displaystyle psv}

入っています

o n )) {displaystyle {mathcal {o}}(n)}

計算のためのアルゴリズム全体が可能な時間

o n )) {displaystyle {mathcal {o}}(n)}

時間が必要です(これには、接尾辞アレイの線形時間構造が必要です)。 [3]

用語とメモリ要件が異なる文字列のLZ77圧縮を計算するためのさまざまな実装があります。比較のために、完全な文字チェーンのLZ因数分解は

バツ {displaystyle x}

長さで

| バツ | = n {displaystyle | x | = n}

見た。メモリ要件の分析は、32または64ビットの単語のストレージに基づいています。アルファベットの文字

a {displaystyle sigma}

メモリワードの4分の1と整数全体のメモリワード。 [2]

次の表には、LZ77因数分解をその期間、そのストレージ要件、および使用したデータ構造を計算するためのいくつかの実装があります。

表にリストされているアルゴリズムのいくつかは、LPFアレイを使用しています(LPFは 最長の以前の要因 )。 LPFアレイは次のように定義されています。 [2] すべての位置について

{displaystyle i}

キャラクターチェーンの

バツ {displaystyle x}

l p f [ ] {displaystyle lpf [i]}

の最長係数の長さとして定義されています

バツ {displaystyle x}

それは位置にあります

{displaystyle i}

始まり、ポジションの前に

{displaystyle i}

バツ {displaystyle x}

登場した、d。 H.

l p f [ ] = m a バツ { 0 } { l | バツ [ + l 初め ] の要因です バツ [ 初め + l 2 ] } )) {displaystyle lpf [i] = max({0} cup {l、|、x [idots i+l-1] {text {ist ein fake fake von}} x [1dots i+l-2]}}}}

。 LPFアレイは、線形時間に文字チェーンのLZ77因数分解から計算できます。
LPFアレイは、とりわけ、上記のNSVおよびPSVアレイを使用して計算できます。 [3]

l p f [ ] = m a バツ l c p s a [ n s [ s a [ ] ] ] )) l c p s a [ p s [ s a [ ] ] ] )) )) {displaystyle lpf [i] = max(lcp(i、sa [nsv [i]])、lcp(i、sa [psv [i]])})})}

テーブルにリストされているいくつかのアルゴリズムの実装のために

s {displaystyleS}

追加のメモリが必要です。テーブルでは、スタックの使用がメモリ要件に取り付けられています

+ {displaystyle +}

表示されています。スタックメモリのサイズは制限されます

| s | = n {displaystyle | s | = n}

– これは、文字列が形状をチェーンする場合に当てはまります

バツ = a n {displaystyle x = alpha ^{n}}

a a {sigmaのdisplaystyle alpha}

持っている。期待されています

| s | o ログ |a |n )) {displaystyle | s | in o(log _ {| sigma |} n)}

[2]

今日、LZ77圧縮とa。 Game Boy Advance、AutoCAD DWG形式、その他の組み込みシステムでまだ使用されています。 Huffman Codingと組み合わせて、LZ77は非常によく知られた圧縮プログラムとグラフィック形式PNGで使用される、非常に使用されているDERGLATEアルゴリズムで使用されます。 LZ77が特許で証明されていないという事実は、1年後に公開された後継LZ78よりもプロセスがまだ好まれている理由であるはずです。

文字鎖のアルゴリズム処理では、LZ77-factorizationが文字列の規則性の計算に使用されます。因数分解は、スライドウィンドウ内だけでなく、文字列全体で常に考慮されます。さらに、元の文字列がアプリケーションで使用可能であり、再構築する必要がないため、出力を簡素化できます。 LZ77因数分解を使用できる問題の選択は、次のリストに記載されています。

圧縮品質は、辞書のサイズに直接依存します。したがって、良好な圧縮速度を取得するためには、スライディングウィンドウは一定の最小サイズを達成する必要があります。アルゴリズムで圧縮されるテキストは、レキシコンの各エントリ(セクションアルゴリズムを参照)と比較する必要があるため、圧縮に必要な時間は、ウィンドウのサイズが直線的に増加します。したがって、純粋な形のLZ77アルゴリズムは、最初はほとんど注目されませんでした。 James StorerとThomas Szymanskiは、1982年に現在Lempel-Ziv-Storer-Szymanski(LZSS)と呼ばれるアルゴリズムでいくつかの問題を改善しました。
レキシコンのすべてのエントリと圧縮されるテキストの比較は、効率的な構築のためのセクションのように効率的な実装には適用されません。

オフセットレンペルZIVの減少(ロルツも Lempel Ziv Ross Williams 、ロス・ウィリアムズ、1991年)およびLempel-Ziv-Markow-Algorithm(LZMA、Igor Pavlov、1998)、彼はより有名で現代の後継者を見つけました。

関連するアルゴリズム [ 編集 | ソーステキストを編集します ]

  1. ジェイコブ・ジブ、アブラハム・レンペル: シーケンシャルデータ圧縮のためのユニバーサルアルゴリズム 。の: 情報理論に関するIEEEトランザクション、 nr。 3、第23巻、1977年、S。337–343 Cs.duke.edu (PDF; 481 kb)
  2. a b c d Anisa Al-Hafeedh et al。: インデックスベースのLEMPEL-ZIV LZ77因数分解アルゴリズムの比較 。の: ACMコンピューティング調査 、nr。 1、第45巻、2012年、S。5:1–5:17
  3. a b c JuhaKärkkäinen、Dominik Kempa、Simon J. Puglisi: 線形時間lempel-ziv因数分解:シンプル、高速、小さい 。の: CPM 2013 、コンピューターサイエンスの講義ノート、ボリューム7922、Springer、2013、ISBN 978-3-642-38904-7
  4. Mohamed I. Abouelhoda、Stefan Kurtz、Enno Ohlebuke: 接尾辞ツリーを強化されたサフィックス配列に置き換えます 。の: Journal of Displeteアルゴリズム 、nr。 1、第2巻、2004年、S。53–86
  5. a b c ギャングチェン、サイモンJ.プーリシ、ウィリアムF.スミス: 文字列内のすべての実行を計算するための高速かつ実用的なアルゴリズム 。の: コンビナトリアルパターンマッチング、第18回年次シンポジウム、CPM 2007、ロンドン、カナダ、2007年7月9〜11日、議事録 、S。307–315
  6. a b c ギャングチェン、サイモンJ.プーリシ、ウィリアムF.スミス: より少ない時間と空間を使用したLempel-ZIV因数分解 。の: コンピューターサイエンスの数学 、nr。 4、第1巻、2008年、S。605–623
  7. a b Maxime Crochemore、Lucian Ilie: 線形時間とアプリケーションで最も長い以前の要因を計算します 。の: 情報処理レター 、nr。 2、Volume 106、2008、S。75–80
  8. Maxime Crochemore: トランスデューサーと補償 。の: 理論的なコンピューターサイエンス 、nr。 1、第45巻、1986、S。63–86
  9. Jens Stoye、Dan Gusfield: 接尾辞ツリーを使用した連続した繰り返しのシンプルで柔軟な検出 。の: 理論的なコンピューターサイエンス 、nr。 1–2、第270巻、2002年、S。843–856
  10. ローマン・M・コルパコフ、グレゴリー・クチェロフ: 固定ギャップのある繰り返しを見つける 。の: 文字列処理と情報検索に関する第7回国際シンポジウムの議事録(Spire) 、2000、IEEE Computer Society、S。162–168
  11. マイケルG.メイン: 左端の最大周期を検出します 。の: 個別の適用数学 、nr。 1–2、第25巻、1989年、S。145–153
after-content-x4