記号 | 固定長符号 | 符号1 | 符号2 | 符号3 | 符号4 | 符号5 |
---|---|---|---|---|---|---|
a | 00 | 0 | 00 | 0 | 0 | 0 |
b | 01 | 1 | 01 | 10 | 01 | 100 |
c | 10 | 00 | 100 | 110 | 011 | 101 |
d | 11 | 01 | 101 | 1110 | 111 | 110 |
第1章で説明しましたように、ハフマン符号は固定長符号に可変長符号を割り当てるFV符号の代表的なものです。 ハフマン符号の詳しい説明をする前に、可変長符号の種類について少し説明しておきましょう。 4つの記号「a」、「b」、「c」、「d」に対して、左表のような内容の符号を割り当てることを考えてみます。
最初の固定長符号は、現在のコンピュータで用いられている固定長符号と原理的に同じものです。 このような符号の場合、符号化されたビット列から元の記号を一意に(ただ一通りの方法で)復元できます。
それに対して符号1では、符号化されたビット列から元の記号を一意に復元できるとは限りません。
例えば「010001」というビット列は、
0 | 1 | 00 | 01 | 01 | 00 | 01 | 0 | 1 | 0 | 0 | 0 | 1 |
a | b | c | d | d | c | d | a | b | a | a | a | b |
など、色々な復元法が可能です。 このような符号を「一意復号不可能な符号」といい、固定長符号のような符号を「一意復号可能な符号」といいます。
一意復号可能な符号でなければ圧縮には利用できませんから、符号1を一意復号可能にすることを考えますと、すぐに思いつくのが符号1の前に符号長を付け加える方法と、符号の最後に目印となるビットを付け加える方法です。 符号2は符号1の前に(符号長−1)を表す1ビットを付け加えたもので、第1章のハフマン符号の解説中で説明したものと原理的に同じものです。 符号3は符号の最後に値0のビットを付け加えて、終了目印にしたものです。
これらの符号とは異なり、符号のビット内容そのもので一意復号可能にするように工夫したものが符号4と符号5です。 例えば符号4で「001011111」というビット列は、
0 | 01 | 011 | 111 |
a | b | c | d |
と一意に復号され、符号5で「0100101110」というビット列は、
0 | 100 | 101 | 110 |
a | b | c | d |
と一意に復号されます。
しかし符号4では、「001011111」のうちの最初の7ビット「0010111」を読み込んだ段階では、
0 | 01 | 0 | 111 | … | 0 | 01 | 01 | 11… | 0 | 01 | 011 | 1… |
a | b | a | d | … | a | b | b | … | a | b | c | … |
という3通りの復号が可能で、符号列を最後まで読み込まないと正しく復号できません。 それに対して符号5では、最初の「0」を読み込んだ段階で「a」が決まり、次の「100」を読み込んだ段階で「b]が決まり、次の「101」を読み込んだ段階で「c]が決まり、最後の「110」を読み込んで「d」が決まります。
このように、1つの記号に対する符号を読み込んだ瞬間に復号することのできる符号を「瞬時に復号可能な符号」といい、符号4のように先まで読まなければ正確に復号することができない符号を「瞬時に復号不可能な符号」といいます。 一般に、ある符号が瞬時に復号可能な符号であるためには、「ある記号に対する符号の末尾の何ビットかを除いたビット列が、別の符号と一致してはならない」という条件を満足していなければなりません。 この条件のことを「語頭条件」といい、これを満足する符号のことを「接頭符号(prefix code)」といいます。
例えば符号4では、cに対する符号「011」の最後の1を除いた「01」はbに対する符号と一致し、さらにまた1を除いた「0」はaに対する符号と一致してしまい、接頭符号とはなりません。 それに対して符号5では、どの符号の末尾の何ビットかを除いても別の符号と一致するものはなく接頭符号となります。 前表の符号では符号2、符号3、符号5が接頭符号であり、瞬時に復号可能な符号です。
データ圧縮に用いる可変長符号は、次のような条件を満たすものが理想です。
この条件を比較的良く満たす符号として最初に発明されたのが「シャノン・ファノ符号(Shannon & Fano code)」です。 この符号は、1948年頃、ベル研究所のシャノンとMIT(マサチューセッツ工科大学)のファノによって独立に開発されました。
シャノン(C.E.Shannon)は情報量や情報のエントロピーといった概念を定義し、情報理論の基礎を築いた有名なコンピュータ研究者で、コンピュータが普及する以前の1948年に、すでにデータ圧縮法を開発していた先見性には驚かされます。
シャノン・ファノ符号が開発されてから4年後の1952年、ハフマン(D.A.Huffman)が1.と2.の条件を満たし、しかも平均符号長を最小にするような符号を開発しました。 このため現在では、実際のデータ圧縮にはハフマン符号が用いられることが多く、シャノン・ファノ符号は歴史的意義しか持たなくなりました。 シャノン・ファノ符号とハフマン符号は非常に良く似ているので、ここではシャノン・ファノ符号の解説は省略し、ハフマン符号についてだけ解説することにします。
ハフマン符号化では「符号の木」と呼ばれる木構造を利用して符号を構成します。 符号の木では各線分を「枝」と呼び、枝の両端の点を「節点」と呼びます。 通常の木と違い符号の木は上から下に向かって伸びていて、一番上の節点を「根(下図の一番上の○印)」、上下に枝がついている節点を「内部節点(下図の○印)」、下に枝がついていない節点を「葉(下図の□印)」といいます。 1つの節点から下に伸びる枝は最大で2本あり、それぞれビット0とビット1が対応付けられています。 そして葉には1つの記号が対応付けられていて、根から葉まで枝をたどっていった時、枝に付けられたビットを順番に並べていくと、その記号に対応する符号となります。
例えば上図の木で記号「c]に対応する符号を調べますと、次のようになります。
1つの葉に到達する経路は1通りしかありませんので、ある可変長符号系列を符号の木で表現することができるのなら、その符号は一意復号可能でかつ瞬時に復号可能な符号となります。
上図の符号の木は3.1節の符号表の符号5と同じ符号系列ですから、ちゃんとした符号の木で表現できましたが、一意復号不可能な符号である同表中の符号1と、瞬時に復号不可能な符号である符号4を符号の木で表現してみますと下図のようになります。
上図より、ある符号が瞬時に復号可能な符号つまり接頭符号であるための語頭条件「ある記号に対する符号の末尾の何ビットかを除いたビット列が、別の符号と一致してはならない」は、符号の木では「記号は葉にだけ対応付けられ、内部節点に対応付けられてはならない」という、ごく自然で直観的な条件になることがわかります。 したがってある符号が接頭符号であることと、正しい符号の木で表現できることは同じ意味になります。
符号の木は記号を符号化する時だけでなく、符号化されたデータを元の記号に復号する場合にも利用することができます。 例えば前述の符号の木を用いて符号列「0100101110」を復号しますと、次のようになります。
以上より、最終的には次のように復号します。
0 | 100 | 101 | 110 |
a | b | c | d |