今日から情報理論部の新入部員です

データ圧縮と、意味を失わずに効率的に情報を表現する方法を探る。

  • #source coding
  • #Huffman coding
  • #compression ratio
  • #prefix-free codes

「入部届、書いてきました」

由紀が書類を差し出すと、葵が受け取った。

「正式に新入部員だね。おめでとう」

「ありがとうございます!」

陸が拍手した。「仲間が増えた!じゃあ、今日は歓迎会?」

「部活動をしっかりやることが、最高の歓迎だ」葵が笑った。「今日のテーマは、情報源符号化」

「情報源符号化?」由紀が首を傾げた。

「データ圧縮の理論。メッセージを効率的に符号化する技術だ」

葵はホワイトボードに文字を書いた。

「例えば、この文章を送信するとしよう。『aaaabbbbc』」

「aが4つ、bが4つ、cが1つ」陸が数えた。

「通常、各文字を8ビットで表すと、9文字で72ビット必要だ」

「でも、aとbは何回も出てくるから、もっと短くできそう」由紀が言った。

「鋭い!それが符号化の基本発想」葵が頷いた。「頻繁に出る文字には短い符号を、稀な文字には長い符号を割り当てる」

「具体的には?」

「ハフマン符号という方法がある。最適な符号を機械的に作れる」

葵は表を描いた。

「a: 44パーセント b: 44パーセント c: 11パーセント」

「この確率分布に対して、ハフマン木を構築する」

陸が不安そうに言った。「木?」

「心配しなくていい。簡単な手順だ」葵が図を描き始める。

「1. 最も確率の低い二つを組み合わせる 2. 新しいノードの確率は、合計になる 3. 全部が一つの木になるまで繰り返す」

「cは11パーセントだから、まず単独で…」由紀が考える。

「いや、aとbを先に組み合わせることもできる。順番は複数ある」

葵が完成した木を示した。

「a: 0 b: 10 c: 11」

「aは1ビット、bとcは2ビット!」陸が驚いた。

「平均符号長は、0.44×1 + 0.44×2 + 0.11×2 = 1.54ビット」

「元は8ビットだったから、大幅に削減!」由紀が計算する。

「そう。でも、これは理想的な例。実際は文脈も考慮する」

陸が疑問を持った。「でも、どうやって区切りが分かるの?『010』は『a,b』なのか『a,0,…』なのか」

「良い質問。これは前置符号の性質だ」葵が説明した。「どの符号も、他の符号の前置になっていない。だから一意に復号できる」

「前置?」

「例えば、aが『0』でbが『01』だったら、『01』はaの前置になる。これだと区切りが曖昧になる」

「だから、『0』『10』『11』みたいに設計する必要がある」由紀が理解した。

「正確。ハフマン符号は、常に前置符号になる」

陸がノートに書き込んだ。「じゃあ、もっと長いメッセージなら、もっと圧縮できる?」

「エントロピーに近づく。情報源のエントロピーが理論的な限界だ」

「エントロピー、また出てきた」由紀が笑った。

「情報理論の全てに関わる基本概念だからね」

葵は別の例を示した。「英語のテキストは、エントロピーが約1.5ビット/文字。だから、理論的には8ビットから1.5ビットに圧縮可能」

「でも、zipやrarは実際どうやってるの?」陸が聞く。

「辞書ベースの方法を使う。繰り返しパターンを見つけて、参照で置き換える。LZ77、LZ78、LZWなど」

「複雑そう…」

「アルゴリズムは複雑だけど、原理は同じ。冗長性を削減する」

由紀が真剣に言った。「もっと勉強したいです」

「じゃあ、来週はハフマン符号を実際に手で構築してみよう」葵が提案した。

「やります!」

陸も頷いた。「俺も頑張る」

「二人とも、良い部員になりそうだ」葵が満足そうに言った。

由紀は胸が高鳴った。情報理論部での日々が、本格的に始まる。