ハフマン符号の計算ツール

ハフマン符号は、出やすい記号ほど短い符号を割り当てて、平均の符号長を最も短くする可逆圧縮の方法です。記号の確率から符号表を作り、エントロピー(理論上の下限)と比べられます。

記号と確率

計算結果

エントロピー H(1記号あたり)
–
平均符号長 L(1記号あたり)
–
効率(H ÷ L)
–
固定長の符号の長さ
–
固定長に対する長さの比
–
文章全体のビット数
–

まとめていく手順

    同じ確率の節があるときは、入力で先のものから先に取り出します。どちらを先にまとめるかで符号の形は変わりますが、平均符号長は変わりません。確率の合計が1でないときは、合計で割って確率にします。

    ハフマン符号の作り方

    すべての記号を、確率を重みとする葉として並べます。その中から確率の最も小さい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、B、C、Dを確率0.4、0.3、0.2、0.1で、互いに独立に出す情報源を、ハフマン符号で符号化する。1記号あたりの平均符号長はどれか。

    1. A約1.85ビット
    2. B1.9ビット
    3. C2ビット
    答えと解説を見る

    正解:B. 1.9ビット

    ハフマン符号では、確率の最も小さい2つをまとめる操作を繰り返します。0.1と0.2をまとめて0.3、次に0.3と0.3をまとめて0.6、最後に0.6と0.4をまとめるので、符号長はAが1、Bが2、CとDが3ビットになります。平均符号長は 0.4 × 1 + 0.3 × 2 + 0.2 × 3 + 0.1 × 3 = 1.9 ビットです。

    記号A〜Eを確率0.3、0.25、0.2、0.15、0.1で、互いに独立に出す情報源を、ハフマン符号で符号化する。等しい確率のものをどちらから選ぶかで符号語は変わることがあるが、平均符号長は変わらない。1記号あたりの平均符号長はどれか。

    1. A2.25ビット
    2. B2.4ビット
    3. C3ビット
    答えと解説を見る

    正解: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 のような段々の符号長より、長さのそろった符号の方が短くなります。

    記号A、B、Cを確率0.6、0.3、0.1で、互いに独立に出す情報源があり、そのエントロピーは約1.30ビットである。この情報源をハフマン符号で符号化したときの効率(エントロピー ÷ 平均符号長)に最も近いものはどれか。

    1. A約65%
    2. B70%
    3. C約93%
    答えと解説を見る

    正解:C. 約93%

    ハフマン符号では、0.1と0.3をまとめて0.4、次に0.4と0.6をまとめるので、符号長はAが1、BとCが2ビットです。平均符号長は 0.6 × 1 + 0.3 × 2 + 0.1 × 2 = 1.4 ビットで、効率は 1.30 ÷ 1.4 ≈ 0.93、つまり約93%です。残りの約7%は、符号長が整数のビットに限られるために生じるむだです。

    0を確率0.8、1を確率0.2で、互いに独立に出す2値の情報源がある。2記号ずつまとめた00、01、10、11の4種類をそれぞれ1つの記号とみなし、ハフマン符号で符号化する。元の1記号あたりの平均符号長はどれか。

    1. A約0.72ビット
    2. B0.78ビット
    3. C1ビット
    答えと解説を見る

    正解: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 のように、符号長だけを送って、決まった規則で符号表を作り直す方法もあります。

    関連する用語

    ハフマン符号 平均符号長 情報エントロピー 接頭符号 クラフトの不等式 可逆圧縮

    関連する計算ツール

    半導体・電子回路・情報の計算ツール →