ハフマンコーディングは、データ圧縮に使用されるエントロピーコーディングの広く使用されている方法です。これは、信号の統計について完全な知識があることを前提としています。ただし、ストリーミングメディアで使用され、信号の統計に関するすべてを知ることができないバージョンのハフマンコーディングがあります。これらの適応ハフマンエンコーダーはどのように機能しますか?
ハフマンコーディングは、データ圧縮に使用されるエントロピーコーディングの広く使用されている方法です。これは、信号の統計について完全な知識があることを前提としています。ただし、ストリーミングメディアで使用され、信号の統計に関するすべてを知ることができないバージョンのハフマンコーディングがあります。これらの適応ハフマンエンコーダーはどのように機能しますか?
回答:
Wikipediaの記事は、顕著な実装の1つ、Vitterアルゴリズムを用いた適応ハフマン符号化プロセスのかなり良い説明を持っています。お気づきのように、標準のハフマンコーダーは、その入力シーケンスの確率質量関数にアクセスできます。これを使用して、最も可能性の高いシンボル値の効率的なエンコーディングを構築します。たとえば、ファイルベースのデータ圧縮の典型的な例では、この確率分布は、入力シーケンスをヒストグラム処理し、各シンボル値の出現数をカウントすることによって計算できます(シンボルは、たとえば1バイトシーケンスにすることができます)。このヒストグラムは、次のようなハフマンツリーを生成するために使用されます(Wikipediaの記事から引用):
ツリーは、重み、または入力シーケンスでの発生確率の減少によって配置されます。上部の葉ノードは最も可能性の高いシンボルを表し、したがって、圧縮されたデータストリームで最短の表現を受け取ります。その後、ツリーは圧縮データとともに保存され、後で解凍プログラムによって(非圧縮)入力シーケンスを再生成するために後で使用されます。初期のエントロピーコード実装の1つとして、標準のハフマンコーディングはかなり単純です。
適応型ハフマンコーダーの構造は非常に似ています。入力シーケンスの統計の同様のツリーベースの表現を使用して、各入力シンボル値の効率的なエンコーディングを選択します。主な違いは、アルゴリズムのストリーミング実装として、アプリオリがないことです。、入力の確率質量関数の知識が利用できないことです。シーケンスの統計はオンザフライで推定する必要があります。同じハフマン符号化スキームを使用する場合、これは、圧縮ストリームで各シンボルの符号化を生成するために使用されるツリーを構築し、入力ストリームが処理されるときに動的に維持する必要があることを意味します。
Vitterアルゴリズムは、これを実現する1つの方法です。各入力シンボルが処理されると、ツリーが更新され、ツリーを下に移動するにつれてシンボルの発生確率が低下するという特性が維持されます。アルゴリズムは、ツリーが時間とともに更新される方法、および結果の圧縮データが出力ストリームにエンコードされる方法に関する一連のルールを定義します。入力シーケンスが消費されると、ツリーの構造は、入力の確率分布のますます正確な説明を表す必要があります。標準のハフマンコーディングアプローチとは対照的に、デコンプレッサには、デコードに使用する静的ツリーがありません。解凍プロセス中に、同じツリー保守機能を継続的に実行する必要があります。
要約すると、適応ハフマンコーダーは標準アルゴリズムと非常によく似た動作をします。ただし、入力シーケンス全体の統計(ハフマンツリー)を静的に測定する代わりに、シーケンスの確率分布の動的な累積(つまり、最初のシンボルから現在のシンボルまで)推定を使用して、各シンボルをエンコード(およびデコード)します。 。標準のハフマンコーディングアプローチとは対照的に、適応ハフマンアルゴリズムでは、エンコーダーとデコーダーの両方でこの統計分析が必要です。