わかりやすく 圧縮 どうやって 動く
旅行かばんに荷物をつめるとき、服をくるくる巻いて入れると、同じ服がもっと小さな場所に収まります。一着も置いていかないのに、かばんにはゆとりができます。データも、同じようにあつかえます。中の情報はそのままにして、占める場所だけを小さくする技術、これが圧縮です。
くり返しを減らす
前のレッスンでは、近くに置いて速く読む方法を見ました。大きさを小さくしても、速くなります。小さければ保存する場所も少なくてすみ、ネットワークで送る時間も短くなるからです。コンピューターはすべての情報を0と1、つまりビットで表すので、同じ情報をより少ないビットで表せれば、それだけ得になります。
いちばん簡単な方法は、くり返しを減らすことです。同じ文字がずらりと続くとき、一つずつ全部書かずに、何が何回続くかだけを書きます。AAAAの四文字を「Aが四回」と書くやり方です。
くり返しのかたまりを押してみましょう。ずらりと並んだ文字が「何が何回」に縮み、全体の長さが短くなります。
かたまりを全部縮めると、十二ますだった原本が九ますになります。捨てた文字は一つもなく、何が何回かを書いただけです。ただし、三回しか続かないかたまりは、縮めて書いてもます数が変わらないので、得になりません。くり返しが長いほど、よく縮みます。
このやり方をランレングス符号化といいます。同じ色で広くぬられた絵のように、くり返しの長いデータに向いています。でも、同じ文字がとなり合っておらず、同じかけらがあちこちに散らばっていたら、この方法は役に立ちません。散らばったくり返しは、どう減らせばよいのでしょうか。
よく出るかけらに短いコードを
散らばったくり返しも減らせます。よく出てくる長いかけらを見つけて、それぞれに短いコードを決め、そのかけらが出てくるたびにコードに置きかえて書きます。どのコードがどのかけらを表すかは、別に表に書いておきます。
よく出るかけらほど置きかえが多くなるので、効果が大きくなります。表もいっしょに保存しなければならないので、ごく短いデータでは、かえって大きくなることもあります。実際に使われている圧縮プログラムの多くは、このように前に出てきたかけらを指し示すやり方をもとにしています。
よく出るかけらを押して、短いコードを決めてみましょう。そのかけらが出てくるところがすべてコードに変わり、全体の長さが減ります。
二つのかけらにコードを決めると、十八ますが八ますに減りました。くり返しを減らすのも、短いコードをあたえるのも、もとは同じ考えです。データの中にくり返す部分があれば、そのぶんを少なく書くのです。
逆にいえば、くり返しがまったくないでたらめなデータは縮められません。すでに圧縮したファイルをもう一度圧縮しても、ほとんど小さくならないのは、そのためです。では、こうして縮めたものをまた広げたら、本当に元どおりに戻るのでしょうか。
元に戻せば原本のまま
ここまで見た方法なら、広げると一文字もちがわずに原本が戻ります。何も捨てていないからです。「Aが四回」という記録は広げるとまたAAAAの四文字になり、短いコードは表を見て、また長いかけらに戻ります。
このように何も失わない圧縮を、可逆圧縮といいます。文章やプログラムのように、一文字でもちがってはいけないデータには、必ず可逆圧縮を使います。
圧縮したものを順に押して、広げてみましょう。縮めていた記録が元の文字にほどけ、原本と同じかどうかを並べて比べられます。
広げたものと原本が、一文字まで同じです。小さくしても失ったものがないので、安心して圧縮しておき、必要なときにそのまま元に戻せます。
一方、写真や音楽、動画では、人がほとんど気づかない細かい部分をわざと捨てて、ずっと小さくすることもあります。これを非可逆圧縮といい、一度捨てた部分は元に戻せません。では、可逆圧縮はいつもできるだけ強くすればよいのでしょうか。
もっと小さく vs もっと速く
圧縮は強さを選べます。弱くすればすぐに終わりますがあまり小さくならず、強くすればもっと小さくなりますが、圧縮に時間がかかります。くり返すかけらをていねいに探すほど小さくなりますが、そのぶん手間がかかるからです。
だから、正解は場面ごとにちがいます。一度圧縮して長く保管するファイルや、たくさんの人がダウンロードするファイルなら強く、送るたびにその場で圧縮しなければならないなら弱く選びます。
圧縮の強さを選んで押してみましょう。強くするほど大きさは小さくなりますが、かかる時間は長くなる、その引きかえが見えます。
大きさと時間は、逆向きに動きます。両方を同時に手に入れることはできず、もっと小さくしたければもっと待たなければならず、早く終わらせたければあまり小さくなりません。多くの圧縮方式では、広げる時間は強さによってあまり変わらないので、おもに圧縮する側が代わりに時間をはらうことになります。
だから、圧縮は場面に合わせて選んで使う道具です。場所が足りなければ強く、時間が足りなければ弱く選べばよいのです。
まとめ
まとめるとこうです。圧縮は、同じ情報をより少ない場所に収める技術です。ずらりと続くくり返しは「何が何回」に縮め、散らばったかけらには短いコードをあたえます。ここまで見た方法は、元に戻すと原本のままになる可逆圧縮です。
強く圧縮するほど小さくなりますが時間がかかるので、場面に合わせて選びます。くり返しを見つけて少なく書き、元に戻せばそのまま。これが圧縮です。
要点を順に押して振り返りましょう。(くり返しを減らす → よく出るかけらに短いコード → 元に戻せば原本のまま → もっと小さく vs 時間の引きかえ)
圧縮は、何台ものコンピューターがデータをやりとりするときにも使われます。小さく送れば、それだけ早く届くからです。
でも、どれだけ縮めても一台のコンピューターに入りきらないほどデータが大きくなったら、どうすればよいでしょうか。何台にも分けて収め、故障に備えて写しを置いておく方法を、次のレッスン「分散データ」で扱います。