月曜日, 7月 16, 2007

ハフマン符号

ハフマン符号という、「文字を数値化する」アルゴリズムがある。数値化する際に、01で表される符号の長さを「最大限に短くする」アルゴリズムである。符号の長さには、理論値というものがあり、その長さは情報の複雑さを表すエントロピーによって制限される。ハフマン符号化アルゴリズムでは、その最短の符号を計算することができる。

ハフマン符号化アルゴリズムは、通常、ツリー(木)と呼ばれる図で表されることが多い。文字の出現頻度によって、ツリーを構成していくという形をとる。この場合のツリーとは、二分木と呼ばれるもので、上からたどっていくと、「葉」の位置に配置された文字の符号が表現できるというものである。



この図はミシガン大学のサイトからお借りしたものであるが、頂点から末端まで、0・1と書かれた枝を追っていく。最終的に、Aにたどり着くまでには「100」、Eでは「0」、Iは「1011」、Oで「11」、Uで「1010」と、符号がツリーによって表現できていることが分かる。この符号(100,0,1011,11,1010)は、AEIUOの各文字を、重複なく表現できており、途中でどの文字であるか分からなくなる、ということがなく、一意に表すことができる。そして、この符号は、可能な限りでの符号のうちで、もっとも短いものである。

このツリーを構成するには、文字の出現頻度、つまり文字の使われる確率によって、ツリーの「バランス」を決めていかねばならない。すべての文字が、同じ確率で出現するのであれば、すべて同じ長さの符号を表すツリーを構成する。分布に偏りがあれば、よく使われる文字を短く、出現頻度の低い文字を長く符号化するように、ツリーを構成する。

ツリーの構成方法を正確に述べると、出現頻度の低い文字を「分岐」の左右に配置するということを繰返す、というものである。まず、出現頻度の低い文字を2つとり、ツリーを構成する。そして、そのツリーの合計値を新たな要素の確率値とし、再び、出現頻度のもっとも低い要素を2つとり、ツリーを構成する。このようにツリーを構成すると、常に出現確率の低い文字の符号が長くなる。

なぜなら、確率の低い文字は、先にツリーを構成しており、新たに出現確率の高い文字を加えた場合、その符号の長さは常に長くなっていく。だから、上段の文字の出現確率は、下段の文字の出現確率よりも、常に高い。新たに選択された文字は、ツリーより短いか同じ長さの符号を持つ。なぜなら、出現確率の低い要素が先にツリーをつくるからである。

ハフマン符号化には、静的アルゴリズムと、動的アルゴリズムがある。

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...