圧縮方式
- ランレングス圧縮方式
連続する同符号を、符号と繰り返し回数で表現する
圧縮方式。例えば、"AAAAAAAAAAAAAAAAAA"は、
"*18A;"のように圧縮される。
空白の多い白黒画像や、連続したゼロ領域を含む
バイナリデータ等で有効。
同じ符号が多数続いている場合(これを"ラン"と言う)、
"ラン"全体を、その符号と繰り返し回数のペアで表すことで、
全体の情報サイズを小さくする圧縮方式である。
Win32APIのGetDIBit関数は、
デバイス独立ビットマップ形式データを作成する時、
ランレングス圧縮方式を指定できるが、
圧縮結果が非圧縮時のサイズより大きくなると、
関数自体が失敗する、という、文書に明示されていない仕様がある。
このため、「ある程度以上複雑な図形を
ビットマップファイルにセーブしようとすると、セーブされない」
という、一見不可思議な障害を引き起こした経験もある。
- スライディング・ディクショナリー
前方の文字列と同じものが後方に表れた場合、
これを、前方文字列までの相対距離と
一致する文字列の長さで表現する圧縮方式。
例えば、"perfect makes imperfect"は、
"perfect makes im*16,7;"と圧縮される。
(展開時は、*から数えて16文字手前からの7文字を
そのまま使用する。)
プログラムや日本語のような、同じ単語が
繰り返し表れるようなデータに有効。
- エントロピー圧縮
符号の出現頻度統計から符号長に差のある新たな符号を
割り当てる圧縮方式。
例えば、普通コンピューターのデータは8ビットで
表現されるが、もしデータ"0x00"が頻繁に表れるなら、
これには8ビットを割り当てるのはもったいないので
"1b"という1ビットの符号を再割り当てする。
その分、たまにしか表れないデータ"0x5b"は、
"000101101001110100010b"のような20ビット以上の
符号が割りあたってしまうかもしれないが、
長い符号は出現頻度が低いのだから、
全体としては圧縮効果が期待できる。
有名な圧縮ツールLZHでは、
スライディング・ディクショナリーの「ランペル・ジブ」(LZ)圧縮方式
を前段で行い、さらにその結果を
エントロピー圧縮の一種である「ハフマン」(H)圧縮する、
という技法を用いている。