ハフマン符号化とは?『よく出る文字には短い符号

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

ハフマン符号化とは(全体像)

ハフマン符号化は、文字の出る回数(頻度)に合わせて符号の長さを変える圧縮のやり方。よく使う文字を短く、あまり使わない文字を長くすることで、全体のデータ量を減らす。

身近な発想は「よく使うものほど手短に」。あいさつを「お疲れさまです」より「おつ」と短く言うようなもので、頻出する文字を短い符号にすれば、全体が短くなる。

このように長さがバラバラの符号を可変長符号という。すべて同じ長さにする固定長とは反対で、頻度に応じて長さを変えるのがハフマンの肝だ。


詳しく:この手順と性質だけ覚えれば戦える

ここが記事の心臓部。まずは木を作る4ステップ

ハフマン木を作る4ステップ

手順やること
①頻度計算各文字が何回出るかを数える
②木の構築いちばん頻度の少ない2つをくっつける、を繰り返す
③枝に0と1木の左の枝に0、右の枝に1を割り当てる
④符号の確定根(ルート)から各文字までたどった0と1の並びが符号

たとえば A が5回・B が3回・C が2回・D が1回・E が1回出るなら、よく出る A は「0」のように短く、めったに出ない D・E は「1110」「1111」のように長くなる。

ここで超重要なのが接頭符号(せっとうふごう)という性質。

どの符号も、ほかの符号の「先頭部分」になっていない。

たとえば A が「0」なら、ほかの符号は絶対に「0」から始まらない。だから区切り記号がなくても、前から読んでいけば迷わず元に戻せる(一意に復号できる)。これがハフマン符号の最大の強みだ。

ハフマン符号の性質と位置づけ

項目内容
符号の長さ可変長(頻度が高いほど短い)
接頭符号どの符号も他の符号の先頭にならない=一意に復号できる
効率エントロピー(理論限界)に近づく
さらに上算術符号はハフマンより効率的なことがある

つまり、ハフマンは「可変長の中ではかなり優秀だが、最強ではない(算術符号が上回ることがある)」と押さえておくとひっかからない。

わかりやすく言い換えると

要するに、ハフマン符号化は「よく使う文字を短い背番号にする」ことだ。

①まず文字の出る回数を数える

②少ない2つをくっつけて木を育てる

③枝に0と1をふって、根からの道のりを符号にする

接頭符号のイメージは「だれの背番号も、ほかの人の背番号の出だしにならない」こと。だから番号を続けて読んでも、どこで一人ぶんが終わるか迷わない。区切りの「・」を入れなくても元に戻せる、というわけだ。


試験のツボ

🔴 一番出る:ハフマン木の作り方

①各文字の頻度を数える

②頻度の少ない2つをくっつけるのを繰り返す

③枝に0と1をふり、根からの道のりが符号

🔴 次に出る:接頭符号だから一意に復号できる

①どの符号も他の符号の先頭にならない

②区切り記号なしで元に戻せる

🟡 押さえると安定:可変長・エントロピーに漸近

①頻度が高い文字ほど短い符号(固定長ではない)

②算術符号はさらに効率的なことがある


よくある間違い

「ハフマン符号は固定長である」→ ✗  頻度に応じて長さが変わる可変長。固定長ではない。

「ハフマンが常に最も効率がよい」→ ✗  可変長では優秀だが、算術符号がより効率的なことがある。

「符号を区切る記号が別に必要」→ ✗  接頭符号なので区切りなしで一意に復号できる。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(木の作り方)

📝 オリジナル問題 1 ハフマン木の構築

ハフマン符号化の手順に関する次の記述のうち、正しいものはどれか。

  1. 各文字の頻度を数え、頻度の最も小さい2つを結合する操作を順に繰り返して木を作る
  2. 各文字をアルファベット順に並べ、上から順に0、1、2…と番号を振って符号とする
  3. すべての文字に同じ長さの符号を割り当て、文字の出現頻度は一切考慮しない方式だ
  4. 最も頻度の高い文字に最も長い符号を割り当て、稀な文字には短い符号を割り当てる
シーピードラ
シーピードラ 解答・解説

解答は 1 だぜ。

ハフマン木は「頻度の少ない2つをくっつける」を繰り返して作る。そのあと枝に0と1をふって、根からの道のりが各文字の符号になるんだ。

選択肢2はアルファベット順で番号を振る別物。選択肢3は固定長で頻度を無視する誤り。選択肢4は「高頻度に長い符号」が逆で、高頻度ほど短い符号だぜ。

選択肢判定理由
1最小頻度2つを結合する繰り返しで正しい
2アルファベット順の番号付けではない
3ハフマンは頻度を考慮する可変長
4高頻度ほど短い符号(逆)

オリジナル問題2(接頭符号)

📝 オリジナル問題 2 接頭符号の性質

ハフマン符号が持つ接頭符号の性質に関する次の記述のうち、正しいものはどれか。

  1. すべての符号が同じ先頭ビットから始まるため、復号の処理がとても速くなる
  2. どの符号も他の符号の先頭部分にならないので、区切りなしで一意に復号できる
  3. 符号と符号の間に必ず区切り記号を入れるため、長さがばらばらでも復号できる
  4. 復号するときは符号を後ろから読む必要があり、前から読むと意味が定まらない
シーピードラ
シーピードラ 解答・解説

解答は 2 だぜ。

接頭符号とは「どの符号も、ほかの符号の先頭にならない」性質のこと。だから前から順に読んでいくだけで、区切り記号なしでも一意に元へ戻せる。これがハフマンの強みだな。

選択肢1は「同じ先頭から始まる」が逆で、それでは区別できない。選択肢3は「区切り記号が必要」で誤り。選択肢4の「後ろから読む」も誤りで、前から読んで復号できるぜ。

選択肢判定理由
1同じ先頭では区別できない
2区切りなしで一意に復号できる
3区切り記号は不要
4前から読んで復号できる

オリジナル問題3(効率と用途)

📝 オリジナル問題 3 ハフマンの効率と用途

ハフマン符号化の効率や用途に関する次の記述のうち、正しいものはどれか。

  1. ハフマン符号は可変長だが、データを大きくしてしまうので実際には使われない
  2. ハフマン符号はあらゆる方式の中で必ず最も高い圧縮効率になることが保証される
  3. ハフマン符号は圧縮には使えず、誤りを訂正するための符号として使われている
  4. ハフマン符号は効率がエントロピーに近づき、ZIPやJPEGで使われている
シーピードラ
シーピードラ 解答・解説

解答は 4 だぜ。

ハフマン符号は圧縮効率がエントロピー(理論限界)に近づく優秀な方式で、ZIP・JPEG・MP3などで実際に使われている。

選択肢1は「実際には使われない」が誤りで、現役の技術だ。選択肢2は「必ず最も高い」が誤りで、算術符号がより効率的なことがある。選択肢3は「圧縮には使えない・誤り訂正用」が誤りで、ハフマンは圧縮の手法だぜ。

選択肢判定理由
1圧縮に広く使われている
2算術符号が上回ることがある
3ハフマンは圧縮の手法
4エントロピーに漸近・ZIPやJPEGで使用

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る