符号化って美味しいの?

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

  • #encoding
  • #compression
  • #huffman coding
  • #data representation

「今日のお題、『符号化』」

葵がホワイトボードに書いた。

「符号化...?」由紀が首をひねる。

「食べ物じゃないよ」陸が笑った。「でも、美味しそうな響きだよな」

「ある意味では、情報を圧縮する技術は『美味しい』かもね」葵が微笑んだ。

「圧縮?」

「情報を、より少ないビットで表現すること。zipファイルとか、mp3とか」

由紀が理解した。「ああ、ファイルサイズを小さくするやつ」

「そう。でも、どうやって圧縮できるのか、考えたことある?」

陸と由紀が首を振る。

葵がノートを開いた。「簡単な例から始めよう。メッセージ『AAABBC』を送りたい」

「6文字だから、6バイト?」陸が言う。

「普通に送ればね。でも、『A3回、B2回、C1回』と送れば?」

「短くなる!」由紀が気づいた。

「これがランレングス符号化。連続した同じ文字をカウントで表す」

葵は別の例を書いた。

「もっと賢い方法もある。よく出る文字に短い符号を、めったに出ない文字に長い符号を割り当てる」

「頻度で決めるってこと?」由紀が聞く。

「そう。これがハフマン符号化。最適な符号長の割り当て方だ」

葵は具体例を示した。

「英文では、Eが最も頻繁に出る。だから、Eに短い符号、例えば『01』を割り当てる。Zはめったに出ないから、長い符号『10111001』とか」

陸が考えた。「でも、どうやって区切りを判断するの?『0101』はEE?それとも別の文字?」

「良い質問!」葵が興奮した。「それが前置符号という概念。どの符号も、他の符号の先頭になってはいけない」

「プレフィックス・フリー」由紀がノートに書く。

「そう。例えば、Aが『0』、Bが『10』、Cが『11』なら、『010011』は明確にA-B-A-A-C-Cと読める」

陸が試してみる。「0, 10, 0, 0... あ、本当だ。混乱しない」

「これがハフマン符号の賢さ。一意に復号可能で、かつ平均符号長が最短」

由紀が質問した。「でも、圧縮できないデータもあるんですよね?」

「鋭い。完全にランダムなデータは、パターンがないから圧縮できない」

葵が補足した。「実は、シャノンのエントロピーが、圧縮の限界を決める」

「H(X)ビット/シンボル以下には圧縮できない」

陸が不思議そうに聞く。「じゃあ、既に圧縮されたファイルをまた圧縮したら?」

「ほとんど小さくならない。もしかしたら、逆に大きくなることもある」

「大きくなる?」由紀が驚く。

「圧縮アルゴリズム自体が、ヘッダーや構造の情報を付加するから。ランダムに近いデータに圧縮をかけると、オーバーヘッドの分だけ増える」

陸が笑った。「符号化って、奥深いな」

「情報理論の実用的な応用だよ」葵が言った。「通信でも、ストレージでも、符号化は至る所で使われてる」

由紀がスマホを見た。「このメッセージも、送信されるときは圧縮されてるんですか?」

「多くの場合、ね。特に画像や動画は、大幅に圧縮されてる」

「JPEGとか?」陸が聞く。

「そう。JPEGは、人間の視覚が感じにくい部分を削る、非可逆圧縮」

「非可逆?」

「元に完全には戻せない圧縮。でも、見た目はほとんど変わらない」

由紀が感心した。「情報の重要度で、圧縮率を変えるんですね」

「まさに。どの情報が大事か、判断するのも符号化の技術だ」

陸がお腹を鳴らした。「符号化の話してたら、お腹空いてきた」

「結局、美味しそうに聞こえてたのか」葵が笑った。

「情報も、圧縮すると味が濃くなる気がする」由紀が冗談を言った。

「良い比喩だね」葵が認めた。「エッセンスを抽出する、という意味では似てるかも」

窓の外で、夕日が沈む。効率的に伝えること。それが符号化の本質だ。