http://coolshell.cn/articles/7459.htmlからの振替
二日リリース前のrsyncアルゴリズム、我々は、古典的なアルゴリズムハフマン圧縮アルゴリズムを知っている、データ圧縮アルゴリズムを見てみたかったです。私たちは聞いたことがあるべきだと考え デビッド・ハフマン 、彼の圧縮アルゴリズム- ハフマン符号、周波数の1、文字によって出現優先キューの圧縮アルゴリズム、バイナリツリーと行われ、ハフマンバイナリツリーはバイナリツリーと呼ばれる-テープ重みの木。それは明らか品、木の特に構造と判断し、ちょうど華僑社会の資料を見て、私はこのアルゴリズムを忘れて、長い時間のための学校を卒業したが、インターネットは少しを検索、このアルゴリズムを入れていないようです。 " 文字列に対してハフマンコードの簡単な例の例が理解しやすい」とは、かなり良いです、私は裏返します。私は完全にこのレポートに翻訳していないことに注意してください。
我々は次の文字列を圧縮する必要がある場合私たちは、直接の例を見て:
「ブープビールをビープ音!」
まず第一に、我々は最初の各文字が出現する回数を計算するので、私たちは以下の表を得ました:
文字 | 回数 |
'B' | 3 |
'E' | 4 |
'P' | 2 |
「」 | 2 |
'O' | 2 |
'R' | 1 |
'!' | 1 |
それから私は(二次データは優先順位として表示されます)プライオリティキューにこれらのものを入れて、私たちが見ることができ、優先順位は、のように、ソート順を使用する場合はプライオリティキューは、ソート配列Prioirryで表示されます。ここでは私たちです結果のプライオリティキュー:
バイナリツリーにこの優先度キューのターン - そして、私たちのアルゴリズムがあります。我々は常に((最初の要素は左ノードであり、第2のノードが右側である)バイナリツリーを構築するために最初の2つの要素のキューから取り出し、この2つの要素の優先度が追加され、優先度に戻しここでの優先順位の数が表示された文字)であることを再度注意してください、そして、我々は以下のグラフのデータを取得します:
同様に、我々はその後、最初の二つを取り出し、次いで、プライオリティキューに戻さ2 + 2 = 4のノードは、優先度に形成されます。
私たちのアルゴリズムを続けると(私たちは、これはからのボトムアップの貢献のプロセスであることがわかります)。
最終的には、バイナリツリーは次の取得します:
この時点で、我々は0としてコード化の左側の枝に木を入れ、我々のようなエンコードされた文字、取得するためにツリーを走査することができるように、1のようにコーディング右支店:コードの「b」は「P」が101コード化され、00であります、 'R'のコードは1000です。私たちは、より多くの周波数が、あまりコーディング長く、低い周波数でより多く現れ発生アッパー、コーディングで短くなることを見ることができます。
最終的には、以下のコード表を取得することができます。
文字 | コーディング |
'B' | 00 |
'E' | 11 |
'P' | 101 |
「」 | 011 |
'O' | 010 |
'R' | 1000年 |
'!' | 1001 |
復号化が「ペペ」の後に私たちは、このようなビットセット「1011110111」を持っている場合、デコードは、例えば、ビットによって達成される、我々はエンコードするとき、我々は、符号化するために「ビット」であることに留意されたいです。そこで、我々は、バイナリツリーで、当社のハフマン符号化と復号化辞書テーブルを構築する必要があります。
ここで注意すべきことの一つは、私たちの個々の文字ハフマン符号化が競合しないということですつまり、誰コードは存在しません別のコードのプレフィックスで、それ以外の場合は大きな問題になります。符号化は、区切り文字をエンコードしないからです。
だから、私たちの元の文字列ビープブープビール!
0,110,001,001,100,101 0,110,010,101,110,000 0,010,000,001,100,010 0,110,111,101,101,111 0,111,000,000,100,000 0,110,001,001,100,101 0,110,010,101,110,010 0010 0001:そのバイナリにすることができるようになります
私たちのハフマンコードは次のとおりです。0,011,111,010,110,001 0,010,101,011,001,111 1000年1001年
上記の例から、我々は、圧縮率は依然として非常に実質的であることがわかります。
著者は、あなたが(C99標準)で見ることができ、ソースコード提供します ソースファイルのダウンロードを
ます。https://www.cnblogs.com/ericsun/p/3333910.htmlで再現