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

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

ここでは、ファイルベースのLZ77アルゴリズムとハフマン圧縮アルゴリズムの簡単な実装を持っています

GitHub源码ポイントI

よると、ファイルベースのLZ77アルゴリズムとハフマン圧縮アルゴリズム(7)現在のプロジェクトの不具合や改善点を導入されています。

その後のアイデアではなく、実装については、この記事の話。

まず、パラダイムハフマン木

パラダイムHU FF人ツリーは、HU FF人ツリー上部に基づいていくつかとしている强制性的约定:すなわち、最終的に同じ層のノードについて、リーフノードの全ては、大きな調整に小さいの同じ層内のリーフノードに対して、次に、左側に調整されたシンボルの順序に従って、及び左右-0の符号化方法を割り当てます慎重に次の図を守ってください。
ここに画像を挿入説明
ここに画像を挿入説明

表から結論の数を引くことができます。

  1. ただ、木のパラダイム内での位置を知ることができる一つのシンボルの符号化ビット長を知っています。すなわち:限り、シンボル周波数よりもはるかに小さいコードテーブルにシンボル当たりの記憶されたコード長(ツリー高さ、すなわちノード)として
  2. 図1は、符号化ビットの間にほぼ同じです
  3. 第n层的编码可以根据上层算出来:code = (code + count[n-1])<<1;

ここに画像を挿入説明
ここに画像を挿入説明
どのHU FFそれを作成した人の木のパラダイム?パラダイムHU FF男ツリーが作成する必要はありません、あなたは押し出すHU FF男ツリーを使用することができます

  1. 層の数は、ツリーの各リーフノードHU FF人、得られたHU FFマン符号表に必要な
  2. 最初のキー、ソートする第2のキーシンボルとして符号長(ツリー内のノードの高さ)に応じて、HU FFマンコードテーブルの

上記2つのステップは、上記の式によれば、パターンHU FF人ツリーコードテーブルを引き出すことができ、パラダイムHU FFマン符号表を計算することができる介し。

第二に、圧縮と解凍パラダイムHU FF男ツリーベースの圧縮

1つの圧縮

  1. 先に説明の方法により、计算出huffman码表,并推算出每个字符的范式huffman编码
  2. 读取源文件,将源文件中的每个字节按照对应的范式huffman编码进行改写

ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
圧縮ファイル形式:

  1. 最初の符号語長が(外観の圧縮HU FF人シンボルとシンボル周波数に格納されている)各バイトに対応するセーブ
  2. 圧縮されたデータを保存します

2解凍

  1. ビット長圧縮データから符号化シンボルを取得、シンボルテーブルのビット長が構築します

ここに画像を挿入説明
2.長さ復号化テーブルは、符号化ビットを確立します

ここに画像を挿入説明

  1. デコーディング

注:私はコードワードJ、I> Jの長さよりも数大きい長さの符号語である非常に重要な特徴前jビットのパラダイムハフマン符号化値。

操作についてのサイクル、直到所有的比特流解析完成:设i=0

  1. 符号化ビット長圧縮データからビットストリームの対応するビット長を得るために、復号テーブルのi行目から始まります。
  2. 第1減算結果を用いて符号化データの読み出しは、NUMを想定しています
  3. シンボルの数が少ないNUMより4を実行した場合NUM> =シンボルの数は、I ++、1は、継続している場合
  4. シンボルのビット長の位置に対応するシンボルテーブルから解析結果にプラス記号インデックスNUM、
例如,输入数据“11110”。令i = 0,此时编码位长为2。
				读取2位的数据“11”与首编码相减等于3。
3大于等于符号数量,于是i = i + 1等于1。此时编码位长为3。
				读取3位的数据“111”与首编码相减等于1。
1大于等于符号数量,于是i = i + 1等于2。此时编码位长为5。
				读取5位的数据“11110”与首编码相减等于2。
2小于符号数量,2加符号索引4等于6。
从表2.3中可以查到序号为6的符号是“E”。从而解码出符号“E”。
				跳过当前已经解码的5位数据,可以重新开始解码下一个符号。

LZ77の4ハフマン圧縮結果

使用する際に2つの部分は1バイト、単独圧縮の距離であるとして結果ツリーハフマンLZ77圧縮、元の文字、およびGZIPの長さは、一緒に圧縮されます。

4.1 距离的压缩

検索バッファ、これ以上32K以下、すなわち距離範囲[1,32768]で32768の最大距離の最長の距離でZ77の試合を探している場合は32,768に達していないが、距離は、非常に多くなり、しかし、これハフマンツリーが非常に大きい引き起こし、通常の比較的大きなファイル、距離や数千人をコードLZが、計算時間とメモリ消費量は、ハードウェアの条件を超えてしまう場合は、どのようにそれを行うには?

GZIPは非常に良い方法を提供します将distance划分成多个区间,每个区间当做一个整数来看,该整数称为Distance Codeコードの出現と同等の距離間隔を、落ちるときの距離の多くは、距離コードが少し分けることができますが、唯一の距離コードハフマン符号化のための最後の距離の距離コードの複数への対応は、行うことができます[コード、距離コードを取得した後、一定のルールに従って拡張。GZIP最终将distance划分成了30个区间、以下に示すように。

ここに画像を挿入説明
区間番号、[0,29]を表すコードは、30のセクションの合計は、距離の数を受信し、各セクションが正確に2のn乗であり、唯一のハフマン木0〜30コード29コードし、

符号化され、余分なビットは、コードに基づいて、距離に符号必要拡散符号化ビットの数を表します。

例えば:最大距離間隔の数が8192を備えているので0は、拡張子、13の拡張13表すことを示していません。

例えば:110をコードする17 24の範囲のハフマン、この範囲は8つの整数を有しているため、上記の表に従うルールは、すべての距離に符号化することができます。

17 -----> 110 000
18 -----> 110 001
19 -----> 110 010
20 -----> 110 011
21 -----> 110 100
22 ---- - > 110 101
23 -----> 110 110
> 110 111 24 -----

これは、時間と空間の複雑さを計算し、ツリーの高さを低くすることができます減少しているが、また、比較的簡単に展開します

4.2元の文字とレングス圧縮

原字符表示在LZ77中未匹配的字符長さは、繰り返し文字列の数を表し、持っているが、バイトを占め、それはGZIP圧縮のように組み合わせ、すなわち、元の文字から使用すると、ハフマンツリーで処理されました

元の文字の範囲は[0、255]、距離がある[3、258]は、どのように対処するのですか?
0〜255のGZIP整数表すキャラクタ256、すなわちデコードした後、終了フラグを示し256表しデコード端で、例えば、開始257からの距離を表し:257 258は、4つの文字を繰り返したが、GZIPがされていない、繰り返しの三個の文字を表しますそうではなく、距離を分割する同様の方法を使用しての1対1の対応は、総距離は、別々のセクション29に分割され、以下に示すように、

ここに画像を挿入説明

すなわちHU FF男性符号化されていないオリジナルの文字と285の合計の入力要素、デコーダは、ビットストリームを受信したときに0から255のうちの溶液は、それがないことを意味する場合、まず、このコードテーブルのリテラル/長さに復号することができるの距離それはバック確かに距離を表すビットとのビットストリームを形成した後の背後にある長さを延びる、次いで、257から285までの間の長さである場合、それは、当然、その後、端256である場合、文字にマッチします

したがって、胡FFマン符号表によって、実際には、状況のすべての種類の統一ではなく、リテラルまたは反復列であるものを最終的にロゴを追加することによって区別します。

このGZIP圧縮処理の対象は基本的に、出てきた最初のステップを:まず、LZ77ソースファイル圧縮を使用して第二步采用huffman对 LZ77的压缩结果进行再次压缩元の文字とHU FF人ツリーの使用の長さがあるため、呼び出すことができるHU FFマン符号表1、HU FFマン符号表2と呼ばれるHU FF人ツリーに対応する距離、及びのみ記憶されたコードワード長を使用する必要があり、最終HU FF人ツリー情報と称しますCL(コード長)、すなわち2可変長符号表は、次のとおりCL1、CL2。

コードツリーのレコードは、元の符号化ビットストリームはLITの文字ビットストリームと呼ばれ、符号化ビットストリーム距離DISTは、ビットストリームと呼ばれています。CL1、CL2、LITビットストリーム、DISTのビットストリーム:上記の方法によれば、符号化結果は、4つのLZなります。

RLE 5. CL

すなわち、可変長符号化CL也是一对数字、情報の一部理论也可以使用huffman树再次压缩が、GZIPは圧縮され、その使用はないハフマン木が、ランレングス符号化の使用を行います。

游程,即一段完全相同的数的序列RLE、この数一度連続したレコードの同じ数のその部分は、多くのレコードの表示方法が続きます例えば以下のようにCL配列は:
4、4、4、4、4、3、3、3、6,6、6,6、6,6、6,6、6,6、0、0、0、0、0 、0、2、2、2、2
ランレングス符号化のその結果:

4、16、01(バイナリ)、3、3、3、6、16、11(バイナリ)、16、00(バイナリ)、17011(バイナリ)、2、16、00(バイナリ)

それは何を意味するのでしょうか?ので範囲CLは0-15である、GZIPショートが3つの開始からランレングス符号化、ランレングスを持っていない2回繰り返します

16这个特殊的数表示重复出现3、4、5、6个这样一个游程,分别后面跟着00、01、10、11表示(実際の保存時に、優先度の低いビットのストレージのニーズ、ビットは時々いくつかの例は、この点を無視する、プログラムを書くための実際の時間は、そうでない場合、彼らは間違った結果を取得します、に注意を払う必要があり、逆の順序で保存する必要があります)。

4,4,4,4,4ので、この実行があること、数4は、背後にも、行に4回登場し、4,16,01として記録されています。図6は、後に6個の連続6続いてさらに6,16,11,16,00表し、次の3つの6続きます。

多くの可能性のある連続する0が表示されているので、そう3 17ビット長に続く17及び18は、具体的にゼロのランを表し、これらの二つの特別な番号で3-10記録されている(8つの可能な合計)が実行されます。

7ビットに続く18は、11から138(可能な合計128)のランを表します。17011(バイナリ)6個の連続0を表し、18,0111110(バイナリ)が62 0が連続的に表示される示します。

16に加えて、別のラン0を表し、0~15 CL値が可能であり、短い覚え; 0 17、18はランを表します。実際バイナリ整数ため、上記配列は、整数で表されるように:
4、16、1、3、3、3、6、16、3、16、0、17、3、2、16、0

オリジナル字符和长度的编码符号总共有286个(256个原字符+1个结束标记+29个长度区间),distance编码区间总共30个,因此这棵树不会特别深,huffman编码后的码字长度不会特别长,不会超过15,即树的深度不会超过15,因此CL1和CL2这两个序列的任意整数的值的范围是0-15,0表示没有出现,故GZIP对CL1和CL2使用了游程编码

整数値の範囲は0-18であるので、符号語の長さがCL1、CL2ので、データの最後の2セットがSQ1及びSQ2を持っているのでランレングス後、配列は、SQと命名しました。GZIP采用第三个huffman树对SQ1和SQ2再次进行huffman压缩

(0〜18の範囲の整数)の各々の出現の統計数によって、同じ考え方に従い、SQ1及びSQ2のためのハフマンコーディングした結果ストリームのビットSQ1及びSQ2ビットと呼びます。一方、これはハフマンコード表3と呼ばれる、第3のコードテーブルを記録することも必要です。同様に、符号表も同様に記録されている、符号長もCCL呼ばれる配列に相当します。到此GZIP压缩才算真正结束,这个算法命名为Deflate算法

ここに画像を挿入説明

6.データ・ストレージ・フォーマット

圧縮ファイルは非常に大きくなる可能性があるので、真剣ので、GZIPポイントを使用して、圧縮率に影響を与えるだろう段压缩处理、各セグメントの圧縮結果は次のとおりです。

ここに画像を挿入説明

ここに画像を挿入説明

要約:

手紙周波数の代わりにハフマン木ハフマンツリーは周波数情報のうち文字に対処するために使用され、ハフマンツリーが大きすぎる1.パラダイム、各文字のビット長の中でパラダイムハフマン木ハフマン木の中で各文字ハフマン木、周波数は、ビット長ハフマン木は、パラダイム[0,15]が[0から65535]です。
如可以采用...000000023456200000...共256个字节这样的方式来存储字符位长信息,多次重复出现的数字可以采用CL游程编码解决これは大幅なパラダイムハフマン木を使用し、スペースはタグ情報によって占め減少し、大幅に圧縮効率を改善するために、ハフマン木を横断する時間を短縮します。

LZ77圧縮結果を得るために2、中でも、元の文字の長さは、距離情報を有する、ハフマン圧縮方法フラグ情報もこれにハフマンツリーを圧縮されるが、としてハフマンツリーは複数のセクションに分割されている距離のパラダイムを使用して、空間の非常に無駄であることができますこの方法を、省スペース、だけでなく、にある程度

両方が1バイトであるため、長さは、元の文字の3パラダイムハフマン木の圧縮とは、一緒に圧縮方法を使用することで、その後どのようにそれを区別するために、?文字の範囲は[0,255]、したがって、文字を表現するための長さを示すために256、[256285]このセクション29で割った値であるので

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

おすすめ

転載: blog.csdn.net/wolfGuiDao/article/details/104793907