LZ78符号は優れた特徴を持っているため、様々な工夫を凝らした改良型が開発されています。 その中で最も有名なものが、1984年にSperry社のT.Welchによって開発された「LZW符号」です。 この手法は元々コンピュータのハードウェアに実装するために開発されたもので、非常にコンピュータ向きのアルゴリズムのため、色々な圧縮ツールで広く利用され、GIFファイルにおける画像データの圧縮法としても採用されています。 (ただしこの手法の特許をUNISYS社が所有しているため、この手法を利用するためにはUNISYS社にロイヤリティを払う必要があります。)
ここでは、LZ78符号の代表としてLZW符号の符号化手順を説明することにします。
語句 | 番号 | 語句 | 番号 | … | 語句 | 番号 |
---|---|---|---|---|---|---|
(0) | 0 | (1) | 1 | … | (255) | 255 |
LZW符号では記号が辞書にないということはないので、オリジナルのLZ78符号のように記号がなかったことを表す参照番号0は必要ありません。 しかも記号が1つだけの場合はそれを8ビットの整数として扱った値がそのまま参照番号になりますから、いちいち辞書を調べる必要もありません。 このため最初の256個のエントリーは実用上は用意する必要がないことになりますが、原理をわかりやすくするためにここではそのエントリーも書いておきます。
例えば最初の記号がaで、それを整数化した値が97だとしますと、
例えば読み込んだ記号がbで、それを追加した記号列の参照番号が384だとしますと、
語句 | 番号 | 語句 | 番号 | … | 語句 | 番号 |
---|---|---|---|---|---|---|
(0) | 0 | (1) | 1 | … | (255) | 255 |
語句 | 番号 | … | 語句 | 番号 | … | 語句 | 番号 |
---|---|---|---|---|---|---|---|
×× | 256 | … | a…b | 384 | … | a…bc | n |
元データが終了した時、直前までの最長一致系列が出力されずに残っていますので、最後にその参照番号を符号化して出力します。
途中で新しい登録語句の参照番号nが(2p−1)となった時、つまりその時の辞書の登録数が2p個に達した時、pを1増やして次から出力する符号のビット数を1ビット増やします。 また辞書の登録数が最大登録数Mに達した時は、辞書をそのまま固定するか、あるいは辞書をクリアしてまた最初から作成し直します。 普通は辞書の最大登録数としてM=212=4096(符号の最大ビット数=12)程度がよく利用され、辞書の登録数がMに達した時は最初から作成し直す方法がとられます。
以上のように、LZW符号は出力する符号を辞書の参照番号だけにした点が大きな特徴です。 このため、1つの符号を参照番号と記号の組み合わせで構成するオリジナルのLZ78符号と比べますと、符号のビット数が少なくなり、符号化アルゴリズムがよりすっきりしてコンピュータ向きになっています。 ただし1つ1つの符号のビット数は少なくなるものの、そのぶん出力する符号数が多くなりますから、全体としての圧縮効果はそれほど大幅には改善されません。