70 年前、MIT のロバート・ファノ教授は、情報理論の授業で生徒たちに次のような多肢選択問題を与えました。
(1) 従来の期末試験を受験する
(2) 難しい問題を解決する
パズルは、2 進数を使用して文字、数字、その他の記号をエンコードする最も効率的な方法を見つけることです。
これは柔軟なパズルのように見えますが、実際には、この方法は情報を圧縮して保存しやすくし、コンピューター ネットワーク経由で送信するためにも使用できます。
もちろん、ファノ教授は自分自身、そして情報理論の有名な創始者であるシャノンさえもこの問題に悩んでいたという事実を隠しました。
試験を受けるのが嫌いだった 25 歳の大学院生、ホフマンは、この問題を解決しようと決意しました。
「騙された」ホフマンは引き返せない道を歩み始めた。
1
Hofmann は、文字、数字、句読点で構成されるメッセージを考慮して、この問題に取り組み始めました。メッセージをエンコードする最も簡単な方法は、各文字に同じ長さの一意の 2 進数を割り当てることです。次に例を示します。
A -> 01000001
B -> 01000010
C -> 01000010
この方法は解析が非常に簡単ですが、一部の文字はより頻繁に使用され、一部の文字はあまり使用されないため、非常に非効率的です。
より良いアプローチはモールス信号です。モールス信号では、頻繁に使用される文字 E はドットだけで表されますが、あまり一般的ではない J は、より長くて手間のかかる点-ダッシュ-ダッシュ-ダッシュを必要とします。
モールス符号には長いものと短いものがありますが、それでも非効率的であり、さらに厄介なのは、情報を送信するときに各文字の間にポーズを追加する必要があることです。そうしないと、次のように 2 つのメッセージを区別することができなくなります。
一点鎖線、二点鎖線、二点鎖線、二点鎖線 (「トリテ」)
一点鎖線、二点鎖線、二点鎖線、二点鎖線、二点鎖線 (「true」)
実際、ファノ教授はプレフィックスのないコードを使用することで、この問題を部分的に解決しました。
たとえば、特定のメッセージ内で文字 S が頻繁に出現する場合は、非常に短いコード 01 を割り当てることができます。
重要なのは、メッセージ内の 01 で始まる他の文字はエンコードされず、010、011、0101 はすべて禁止されるということです。
各文字のプレフィックスが完全に異なるため、エンコードされたメッセージを曖昧さなく左から右に読むことができます。
例えば:
S -> 01
A -> 000
M -> 001
L -> 1
この場合、0100000111 は曖昧さなく SMALL として変換できます。
では、最も一般的に使用される文字に最短のコードを割り当て、めったに使用されない文字には最長のコードを確保し、各文字に異なるプレフィックスが付けられるようにするアルゴリズムを見つけるにはどうすればよいでしょうか?
ファノ教授は、メッセージ内の文字の出現頻度に応じて上から下へ二分木を構築し、コードを割り当てる近似的な方法を提案しました。
具体的なアルゴリズムについてはここでは説明しませんので、興味のある方は関連情報をご確認ください。
ファノ教授の方法では近似値しか得られないため、より良い圧縮戦略が必要であると考え、学生たちに挑戦しました。
2
ホフマンは何ヶ月も熱心に研究し、さまざまな方法を開発しましたが、どれも効果的ではありませんでした。
ホフマンは絶望的でした。教授に騙されたので、最終試験の準備をしなければなりません。
彼がメモをゴミ箱に捨てたとき、稲妻が頭の中に走り、解決策が現れました。
「これは間違いなく私の人生で最もユニークな瞬間でした!」
ハフマンのアイデアは非常にシンプルかつ洗練されており、具体的には、文字の出現頻度に従って下から上にバイナリ ツリーを構築します。
例を見てみましょう。
SCHOOLROOMというメッセージがあると仮定して、まず各文字の頻度を計算します。
○:4回
S/C/H/L/R/M:1回
ハフマンはまず、R と M など、頻度が最も低い 2 つの文字を取得して二分木を形成します。親ノードの頻度は 2 つの葉ノードの合計である 2 になります。
さて、最も出現頻度の高い文字は 4 回出現する O で、R/M の親ノードの出現頻度は 2 ですが、他の文字の出現頻度は 1 のままです。
ハフマンは、H、L などの二分木を形成するための最低周波数を見つけ続けます。
最も低い頻度のものを探し続けて、S、C などの二分木を形成します。
現在の頻度テーブルは次のようになります。
○:4回
正/中:2回
H/L:2回
S/C:2回
ハフマンは、H/L や S/C などの最低周波数を使用して二分木を形成します。
頻度表は次のようになります。
○:4回
正/中:2回
H/L/S/C:4回
次に、最も低い 2 つの周波数を取得してバイナリ ツリーを形成します。周波数が低いものが左側のサブツリーになり、周波数が高いものが右側のサブツリーになることに注意してください。
最後に、残りの O も二分木に形成されます。
次に、左側のサブツリーの枝には 0 をマークし、右側のサブツリーの枝には 1 をマークします。
最後に、各文字のエンコーディングが形成されます。
SCHOOLROOM の場合、エンコードは 11101111110000110110000101 です。
(注: 同じ周波数のノードを選択する場合、順序が異なる可能性があり、二分木の形状が異なる可能性があるため、ハフマン符号化は一意ではありません。)
ハフマンのアルゴリズムは「最適エンコーディング」と呼ばれ、次の 2 つの目標を達成します。
(1) どの文字エンコーディングも他の文字エンコーディングのプレフィックスではありません。
(2)情報符号化の全長が最小である。
ホフマンは教師のアルゴリズムを上回り、後に次のように述べました。
「ファノ教授と情報理論の創始者であるシャノンがこの問題に苦しんでいたと知っていたら、私は決してこの問題を解決しようとはしなかったかもしれません。ましてや25歳で解決しようとは思わなかったかもしれません。」
偉大なシャノンですらアルゴリズムを思いついたことはなく、学生が偶然それを発見したのは奇跡でした。
ハフマンアルゴリズムは、データ圧縮、ファイル圧縮、グラフィックエンコーディングなどの分野で広く使用されており、IT業界では非常に基本的なアルゴリズムです。
3
話が終わったので、いくつかの考えを共有しましょう。
(1) このアルゴリズムは 70 年前に発明され、米国は理論と実践の両方でコンピュータの分野ではるかに進んでいます。畑ができたばかりの頃はどこにでも金がありますが、成長すると隅々までしか対応できなくなります。
(2) ハフマンのアルゴリズムはシンプルで美しいです。先ほど、小学校 5 年生がこの記事を読んで質問したところ、すぐに二分木を描いて最終的なコードを得ることができました。
しかし、コロンブスのアメリカ大陸発見と同じように、ほとんどの人はそれを実際に思いつくことができず、ましてや数学を使ってそれを表現したり証明したりすることはできません。
(3) ハフマン氏は自分の発明に対して特許を申請していないため、このアルゴリズムが特許を取得できるかどうかについてはまだ多くの議論がありますが、ハフマン氏のアルゴリズムによって開発されたソフトウェアを使用して何百万ドルも稼いだ人もいます。ホフマンの主な報酬は、情報理論の最終試験が免除されることでした。
「The Art of Computer Programming」の著者である Knuth 氏は次のように述べています。 コンピューター サイエンスとデータ通信の分野では、ハフマン コーディングは人々が常に使用してきた基本的なアイデアの 1 つです。
これが最高の報酬かもしれない!
全文は以上です、気に入っていただけましたら右下のいいねを押して読んでください!