ファイル圧縮は一体どのような仕組になっているのでしょうか
ファイルを圧縮するということは、とりもなおさずファイルのサイズ(容量)を小さくし、保存することを言います。又この圧縮したファイルを元のファイルに戻すことを解凍すると言います。
では一体どういうカラクリ(仕組)でファイルの圧縮ということができるのでしょうか。例えば、押入れに入りきらない布団類を、夏には空気を抜き容積を小さくして保存しておき、冬の必要な時に空気を加えて元に戻して使用する。といった光景を見かけますが、これと少し似たところがあります。
本格的な圧縮の原理は非常に複雑で、多くの方式や理論があり、私も詳細はよく分かりませんが、よく知られている方法について、例を示しながらできるだけ簡単に説明をします。
ランレングス(Run−Length)法
一番単純で分かりやすい圧縮方法として、ランレングス法という方法があります。これは、連続するデータの構成要素(文字列)を、その個数で表すものです。
例えば、『ああああいいいうううううええええ』というような文字列があったとしましょう。この時、連続した文字は、『あ』が4個、『い』が3個、『う』が5個、『え』が4個ありますので、圧縮後のデータは『あ4い3う5え4』と表現できます。
元のデータ
圧縮後のデータ |
ああああいいいうううううええええ
圧縮 解凍
あ4い3う5え4 |
上記の結果、元のデータはサイズ15文字だったのが、8文字に圧縮できたことになります。
しかし、現実には上図のように都合良く文字列が連続しているデータは少なく、連続性が少ない場合は反って容量が増える場合もあります。そこで実際には次のハフマン法の原理等を応用してデータの圧縮がされているようです。
ハフマン法
1952年にD.A.Huffman
によって発表された符号化法で、データの中で繰り返して出現する構成要素(文字列)の確率から最適な符号語を求める方法です。具体的には、出現頻度の高い構成要素には短い符号語を付与し、頻度の低い構成要素には長い符号語を割り当てることにより、データ圧縮(符号化)を効率的に行います。
例えば、『ABCDXYZKLMABCDKLMHHHABCD』という文字列があったとしましょう。この時『ABCD』という文字列が出現頻度が一番高く、3回出現出ています。この文字列に桁数の最も短い2進数である『0』の符号を付与します。次に出現率の高い『KLM』には『1』を付与し、以下同様に符号を付与します。そして頻度の最も少ない文字列『HHH』には『1111』と次第に桁数の大きい符号を割り付けていき、最後に下記のような符号テーブルを作成します。この符号テーブルを元に、元の文字列を2進数に置換えます。
元のデータ
圧縮後のデータ
符号テーブル
|
ABCDXYZKLMABCDKLMHHHABCD
0 100 1 0 1 1111 0
圧縮 解凍
0 100 1 0 1 1111 0

|
このように出現頻度の高い文字列に、最も短い符号を割り付けることにより、効率のよい圧縮ができることになります。
参考までに、このハフマン法の考え方の原型となっている符号化法として、皆さんもよくご存知のモールス符号があります。モールス符号(信号)では、短音をトン(・)で表し、長音をツー(-)で表し、長音と短音の組合せで英字を表現します。例えば、Aは(・-)と表し、Bは(-・・・)と表します。そして、使用頻度の高いEは(・)、使用頻度の低いZは(-・・-)と表しています。
以上、ランレングス法にしてもハフマン法にしても、共通して言えることは圧縮したデータを元に戻した時、完全に元のデータに戻るということです。こういった圧縮方法を可逆性圧縮と言います。(詳細は事項参照)
|