ファイル圧縮とLZ77アルゴリズムに基づいてハフマンアルゴリズム(V)

ファイル圧縮とLZ77アルゴリズムに基づいてハフマンアルゴリズム(V)

ファイル圧縮及びLZ77アルゴリズム(D)に基づいてハフマンアルゴリズムは、基本的な原理と圧縮処理を説明するためのLZ77アルゴリズムを有しています。

問題の中で、この記事では詳細にファイル圧縮の過程を説明します

まず、ファイル圧縮処理

導入が完了したら、あなたはLZ77の圧縮に使用される理論的な知識の圧縮を開始することができ、次のように、LZ77圧縮プロセスは、次のとおりです。

  1. 圧縮されたファイルを開きます(注:バイナリ形式を開く必要があります、なぜなら、ユーザーの不確実で圧縮されたファイル)
  2. ファイルサイズが小さい3つのバイトより、圧縮を行わない場合は、ファイルサイズを取得します。
  3. 読取窓データ、すなわち64K
  4. その文字列内の最初の2つの文字の後の最初の2つの文字によって算出さは3バイト、最初の2つのバイトを有する第1の演算部と、圧縮によって計算されたアドレスハッシュので、ハッシュアドレスの一部を構成します完全な文字列の第3バイトと組み合わせると、計算されたハッシュアドレスです。
  5. サイクルは、圧縮し始める
    ハッシュアドレス、ハッシュバケット、バケット戻る状態MatchHeadにウィンドウ内の最初の文字列の挿入位置を計算し
    、一致が見つかったか否かを検出B.ザMatchHeadを
  • matchHeadが0に等しい場合、一致が見つからなかった、前述の三の文字があまりにも表示されないことを示し、文字が圧縮されたソースファイルとして現在の文字に書かれています
  1. matchHeadが0に等しくない場合には、一致するものが見つかった、ハッシュ・バケットから第1のアドレス一致matchHead鎖の代表は、圧縮されたファイルを置き換えるために、文字列検索(距離、長さ)を使用した後、最長一致開始位置を見つけるmatchHead表します置換文字列は、ハッシュテーブルに追加された3つの文字のセットです。

6. データウィンドウが少ないMIN_LOOKAHEAD以上である場合には、左のウィンドウに右側のウィンドウに、新しいファイルから、右側のウィンドウに配置されたデータを読み取るハッシュテーブルを更新し、圧縮の最後まで圧縮を継続するウィンドウを、データを移動します。

第二に、圧縮形式のデータ保持

フォーマットは3分割されたファイル圧縮を保存します。

  1. 1ビットのフラグは、フラグに続く、長さが8バイトでマークされ、文書情報が格納されます
  2. 2ファイルを保存し、元の文字と長さ
  3. 3からすべてのファイルを保存します

上記の情報は、予め、各ステップの次のステップの説明を説明しました。

第三に、問題が詳細に説明されています

  1. 1バイトなぜの一致文字長の(長さ、距離)
  • 1バイト[0255]、255は、理論的には(通常の文字一致長は、ファイル255に到達しなくてもよい)、比較的長い有し、それが255を超える場合は2つのバイトを必要とする範囲内に格納されているが格納され、そして実際の文字一致長さ未満255より、店舗文字一致長の2バイトで1つのバイトを格納することができる、すなわち、圧縮比にいくらかの影響を有するようになります。
  1. マッチング文字までの距離(長さ、距離)なぜ使用の2つのバイト
  • 距離のマッチング文字のサイズをバッファリングする必要がありますどのくらい知っているために(スライディングウィンドウのサイズすなわち)、 缓冲区越大その後、先読みバッファとバッファが文字にマッチする、大きくなり距离就会越长、バッファは無限私が前に言ったように、ではありません、その後、特定のバッファはすべきですか?----- 64Kサイズ

ここに画像を挿入説明

  • 理論的には、限り、機能データが原因でバッファの圧縮されているバッファゾーンは、次の場合のように、見つけることです。

ここに画像を挿入説明

  • この場合のバッファのサイズは、重複する確率が増加を見つけるために、32Kより確かに大きいです。しかし、我々は一般的に、(リピート一般的ではない、あまりにも遠く)ローカライズ離れすぎて試合をしましょう、と繰り返すことはできません、このような横断が55Kは無意味です見つけるが、ファイルに影響を与えながら、3バイトのバッファに合わせて圧縮効率真の一致の範囲はのWSIZE以上のものではありません即32K

ここに画像を挿入説明

  • したがって、ストア文字に2バイトの距離と一致します
  1. 文字列の長さは、バイト数まで繰り返された場合、それに合わせて
    ここに画像を挿入説明
  • 前回の分析の後、距離の長さは2 + 1 = 3バイトのマッチングの合計を占めるようになった、文字列の長さは、少なくとも3つの文字が繰り返され、以下3が作るだろうよりマッチングは、あなたをより大きな圧縮ファイルを行ってきましたどのようなものに従事する?
  • 識別されるには、いくつかの変数を定義します。
MIN_MATCH_LEN = 3;//最小匹配长度
MAX_MATCH_LEN = 258;//最大匹配长度

ここに画像を挿入説明

  1. 当社の圧縮方法はどのようにして、それらの間を見つけるために、ルックアップバッファの最初の試合から3バイトのバッファを取ることです快速高效、それが実行されますか

答えはハッシュ

ハッシュテーブルは、どのくらい与えるために

  • ハッシュテーブルのサイズに依存するハッシュアドレスの少なくとも全てを含むことができ、ハッシュテーブルとしてハッシュ関数計算されたハッシュアドレスです
  • ハッシュ関数は次のように、原理は文字文字あたり3ビットで動作させることであるです那么哈希地址的范围就是3个字符的比特位共有多少种组合,即256 * 256 * 256 = 2^24种组合
  • ハッシュテーブル每个位置保存的是首字符在缓冲区当中的下标が2バイトを必要とするので(バッファサイズが64K == 65535である)は、(のみ検索緩衝液ので、実際には、[0,32767]を使用します)
  • そのため、テーブルのサイズが最もHouha西です:2 ^ 24 * 2 = 2 ^ 25 == 32Mスペース、
    ここに画像を挿入説明
  • 32M空間が非常に大きく、各時間圧縮は、32Mの空間を維持しなければならない非常に時間がかかり、人工およびハッシュテーブルに位置的个数ある:2^15 == 32Kハッシュテーブルの合計サイズは^ 16 2 ^ 2 = 2 * 15であり但是注意后面会改造哈希表、ハッシュテーブルのサイズは、それが2 ^ 16の大きさではない、変更されます。
  • そこで問題は、ハッシュテーブルのサイズをもたらすために、この方法は次のとおりです。ハッシュアドレス複数の位置のハッシュテーブルの数よりも、そして一定会发生哈希冲突、それを解決するためにどのようにハッシュ衝突が起こりましたか?あなたはそれとの不注意、ハッシュテーブルの変換することはできません。

前記ハッシュテーブルの構造

  • ハッシュの解決の競合に設計された前のポインタ
  • 効果は、チェーンの先頭に一致する記録ヘッドを保存するために使用されますデータは、チェーン、このチェーン内のハッシュ衝突要素の発生に相当するハッシュテーブルに格納されているからです。
  • PREVとヘッドサイズはオーダーと団結の背後にあるWSIZE理由です。

ここに画像を挿入説明

  • ハッシュ紛争解決プロセスが発生します。
    ここに画像を挿入説明
    ここに画像を挿入説明
  • あなたがそれぞれの位置を意味し、ハッシュの衝突を解決するプロセスを理解していることを確認してください

7.クロスボーダーの問題のハッシュテーブル

  • 圧縮進展、として可定会进行到大于WSIZE处とき、インサート要素開始時にその数字は、ハッシュテーブルにそれらを運ぶ执行_prev[pos] = _head[hashAddr]就会越界クロスボーダーに対処する必要があるため、。

ここに画像を挿入説明

ここに画像を挿入説明

  • クロスボーダー・ソリューション:pos & WMASKWSIZEに結果の範囲を確保するために
  • この解決策の結果は、クロスボーダーの問題をもたらすことです何ですか?可能会出现死循环

8.&WMASKは結果をもたらす可能性がありますクロスボーダーを防ぐために

  • 発生する可能性があり死循环、状況を
  • 以下、完全な結果月&10、= _head [10] _PREV後に実行される[hashAddr]は_PREV内部ループを形成します。
  • 試合は到着の同じ文字列があると仮定すると、実行しますmachHead = _head[hashAddr];machHead = _prev[machHead]...以下の図によると、それを、彼は無限ループを形成するために_PREV円を描くの内側にあったであろう。

ここに画像を挿入説明

  • この無限ループソリューション:人工とは255試合のほとんどの数を見つけます2つの理由があります。
  • 1. あなたが255回以上マッチング処理を見つけるために見つけなければならなかった場合、それは価値のある、ファイル圧縮の効率に影響を与えます。
  • 2.残忍な、無限ループの問題を解決するために彼の直接の休憩をしましょう。

9. ハッシュテーブルの構成

  • ハッシュテーブル構造プロセスは、ハッシュテーブル内の一致を見つけることであり、それは同時にあります
  • ハッシュテーブル保存的内容是先行缓冲区当中取出来匹配到3个字符的首字符在整个缓冲区的下标

ここに画像を挿入説明
10.どの程度である第一のバッファを残りの文字の最小数?

  • 次の図は、試合の残りの部分の間で文字バッファがあまりにも先に行った場合、最適な結果が一致し、あなたが達成することはできません、あなたはラベル付けする変数を設定する必要があります。

ここに画像を挿入説明

  • 定義MIN_LOOKAHEAD = MAX_MACTH + MIN_MACTH + 1;
  • 第一のバッファのうち、残りの文字の代表MIN_LOOKAHEAD最小数
  • MAX_MACTH最大一致長は、文字列を表し、ここでの目的は、得られた最良のマッチング結果の現在の文字列を満たすことができるようになります
  • 最小一致長は、ここでの目的は、次のマッチがあってもよいことを保証することであるMIN_MACTH、MIN_MACTH + 1の文字列を表します
  • 先行MIN_LOOKAHEADない一致より小さなデータバッファである場合
  • 定義MAX_DIST = WSIZE - MIN_LOOKAHEAD= 32K - 258から3 - 1;。。MAX_DISTは、文字列マッチングの最大距離を表し、これはバッファのみWSIZEを検索され、ウィンドウのデータは、以下のプロセスQ 11の流用するので、容易に理解することである、 - MIN_LOOKAHEADをそれほどそしてもっと!

11 よりも第1データバッファ以上MIN_LOOKAHEAD間ことを確実にする方法は?

各工程を説明するチャート:
ここに画像を挿入説明

  • インポートしたデータWSIZE2その中で、左側のウィンドウWSIZE1に右側のウィンドウ
  • そして、現在位置ポインタ圧縮を更新右ウィンドウWSIZE WSIZE2に文字が、( - = WSIZE現在の圧縮、開始時に開始すると仮定する。)を圧縮するファイルから読み取ら
  • 全データの位置が移動されているので、ハッシュ・テーブル・マストを更新します

ここに画像を挿入説明
注意注意注意,如果待压缩文件本来的大小就小于WSIZE的情况このとき、エラーウィンドウWSIZE2を与える右にそれらWSIZEデータファイルを読みに行きます、必要が別の判断を使用するとき。

12.どのようにハッシュテーブルを更新するには?

  • PREVとWSIZE WSIZEより大きいヘッドデータは、より少ないWSIZEデータを直接ゼロに設定することができるよりも、失われました

ここでは、プロセスの詳細は完了し、我々は最終的にコードをロールアップすることができますについて説明してきました!

次のセクションを参照してください~~~

公開された126元の記事 ウォン称賛57 ビュー90000 +

おすすめ

転載: blog.csdn.net/wolfGuiDao/article/details/104772839
おすすめ