記号A、B、C、Dを確率0.4、0.3、0.2、0.1で、互いに独立に出す情報源を、ハフマン符号で符号化する。1記号あたりの平均符号長はどれか。
- A約1.85ビット
- B1.9ビット
- C2ビット
ハフマン符号は、出やすい記号ほど短い符号を割り当てて、平均の符号長を最も短くする可逆圧縮の方法です。記号の確率から符号表を作り、エントロピー(理論上の下限)と比べられます。
お気に入りと最近使ったツールは、このブラウザ内(localStorage)にのみ保存されます。
同じ確率の節があるときは、入力で先のものから先に取り出します。どちらを先にまとめるかで符号の形は変わりますが、平均符号長は変わりません。確率の合計が1でないときは、合計で割って確率にします。
ほかの入力は今の値のまま、選んだ入力だけを今の値の1/4〜4倍の範囲で変えたときの結果です。赤い点が今の値です。
すべての記号を、確率を重みとする葉として並べます。その中から確率の最も小さい2つを選び、確率を足した新しい節にまとめます。これを節が1つになるまでくり返すと木ができ、根から葉までの枝に0と1を付けて読んだものが、その記号の符号になります。例「3つの記号」では、0.1と0.3をまとめて0.4、次に0.4と0.6をまとめるので、符号長はAが1ビット、BとCが2ビットです。
情報源のエントロピー H = −Σ p log2 p は、1記号あたりに必要なビット数の理論上の下限です。ハフマン符号の平均符号長 L は、H 以上 H + 1 未満になることが知られています。例「3つの記号」では H ≒ 1.296 ビット、L = 0.6 × 1 + 0.3 × 2 + 0.1 × 2 = 1.4 ビットで、効率は約92.5%です。すべての確率が2のべき乗の逆数(1/2、1/4 …)のときは L = H になります。
ハフマン符号は、どの符号もほかの符号の先頭部分になっていない接頭符号(瞬時符号)なので、区切りの記号がなくても、ビット列を先頭から読むだけで一意に復号できます。符号長 l の符号語について 2^(−l) を足した値は、クラフトの不等式により1以下になり、ハフマン符号ではちょうど1になります。
ハフマン符号は、ZIP や PNG で使われる Deflate、JPEG のエントロピー符号化などで、ほかの方法と組み合わせて使われています。記号ごとに整数のビット数を割り当てるので、確率が大きく偏った記号(確率0.9など)では、エントロピーとの差が大きくなります。そのような場合には、算術符号や、いくつかの記号をまとめて1つの記号として扱う方法が使われます。
正解:A. 2.25ビット
まず0.1と0.15をまとめて0.25、次に0.2と0.25をまとめて0.45、残りの0.25と0.3をまとめて0.55、最後に0.45と0.55をまとめます。符号長はA、B、Cが2ビット、DとEが3ビットになり、平均符号長は (0.3 + 0.25 + 0.2) × 2 + (0.15 + 0.1) × 3 = 1.5 + 0.75 = 2.25 ビットです。確率の偏りが小さい情報源では、1、2、3、4、4 のような段々の符号長より、長さのそろった符号の方が短くなります。
正解:B. 0.78ビット
4種類の確率は、00が0.64、01と10が0.16、11が0.04です。0.04と0.16をまとめて0.2、0.2と0.16をまとめて0.36、最後に0.64とまとめるので、符号長は1、2、3、3ビットとなり、2記号あたりの平均は 0.64 × 1 + 0.16 × 2 + 0.16 × 3 + 0.04 × 3 = 1.56 ビットです。元の1記号あたりでは 1.56 ÷ 2 = 0.78 ビットです。1記号ずつでは0と1に1ビットずつ割り当てるしかありませんが、まとめて符号化すると、エントロピーの約0.72ビットに近づけられます。
どの節を先にまとめるかで、符号の0と1の並びや、記号ごとの符号長が変わることがあります。しかし、平均符号長はどの選び方でも同じ最小の値になります。試験では、平均符号長や、特定の条件での符号長が問われることが多いです。
記号の数が n のとき、固定長の符号では ⌈log2 n⌉ ビットが必要です。確率が偏っているほどハフマン符号は短くなり、例「4つの記号がすべて同じ確率」のように偏りがないときは、固定長と同じ2ビットになります。
送る側と同じ符号表(または木)が必要です。データごとに符号表を作る場合は、符号表も一緒に送るか、記号の出現回数から同じ表を作れるようにします。Deflate のように、符号長だけを送って、決まった規則で符号表を作り直す方法もあります。