「ゲームプログラミング/画像ファイルの作成プログラム」の版間の差分
削除された内容 追加された内容
992 行
あくまで上記の方法は、ASCIIコードだけで表せる文字だけを使ったテキストファイルの場合のみの事例です。
;同じデータが3個以上続いていたら圧縮する方式
連続していない1文字を圧縮しても、かえってバイトが増えるだけです。
AAのように二文字だけ連続している単語なら、(圧縮方法にも寄りますが)圧縮してもしなくても変わらないか、むしろ少し増えるリスクもあります。
そこで、反復回数がたとえば3回以上など、一定回数の反復があった場合にだけ圧縮するという方式も提案されています。
;ABCABCFのようなの
単純に反復を見るだけだと、ABCABCFのように、ABCが2回以上続いているようなものは圧縮できません。
タイトルでは説明の簡単のため2回だけの反復にしていますが、もしこれが ABCABCABCABCABCF のようにABCが5回続いているものだとすると、
これを圧縮できないのは困ります。
そこで、こういうのを圧縮できるようにした方式として LZSS という方式が考えられています。
ABCDEABCDK を ABCDE<nowiki>[5,4]</nowiki>K
のように圧縮する方式です。
最初の5は、何文字戻った位置が繰り返しの起点かを示す数値です。
そして「4」は、繰り返しの単語の長さです。
ABCDEABCDABCDK の場合、
まず、前から圧縮していき、
ABCDE[5,4]ABCDK
のようになります。
そして、さらに圧縮されてない別の部分について
ABCDEABCD[9,4]K
のようになります。なお、ABCDEABCD[4,4]Kのようにはしません。なぜそうかと言われても、そういう慣習なので、それに従ってください。
そしてともかく、圧縮されてない部分どうしをあわせた
ABCDE[5,4][9,4]K
が最終的に保存されます。
これなら、複合するときに、まず最初のカッコから複合していき、
ABCDEABCD[9,4]K
が中間的に複合されます。さらに続けて
ABCDEABCDABCDK
が複合され、元の文字列が得られます。
|