データの圧縮
このノートの問いがそのまま復習カードになり、忘れかけたころに出題されます。
0. どういうまとまりか
データの性質を利用して、内容を保ったままデータ量を小さくすることを圧縮といいます。
圧縮したデータを元に戻せるかどうかで、2 種類に分かれます。
| 種類 | 元に完全に戻せるか | 主な形式 | 向くデータ |
|---|---|---|---|
| 可逆圧縮 | 戻せる | ZIP・PNG | 文書・プログラム・図 |
| 非可逆圧縮 | 戻せない(一部の情報を捨てる) | JPEG・MP3・MPEG | 写真・音楽・動画 |
分かれ目は次の 3 つ。
- 非可逆圧縮は、人が気づきにくい部分の情報を捨てて小さくする。
- 圧縮率は「圧縮後 ÷ 圧縮前」で、小さいほどよく縮んでいる。
- ランレングスは同じ値の連続を、ハフマンは出現の偏りを利用する。
1. 圧縮と展開
根拠: 学習指導要領 情報Ⅰ-(2)-ア-(ア)
データを小さくすると、保存する場所が少なくて済み、通信にかかる時間も短くなります。
データの圧縮と展開とは何か?
圧縮はデータの内容を保ったまま量を小さくすること、展開は圧縮したデータを元の形に戻すこと
展開は解凍ともいう。
圧縮率はどう求めるか?
圧縮後のデータ量 ÷ 圧縮前のデータ量 × 100(%)
値が小さいほど、よく縮んでいる。100 KB が 40 KB になれば圧縮率 40%。
2. 可逆圧縮と非可逆圧縮
根拠: 学習指導要領 情報Ⅰ-(2)-ア-(ア)
圧縮の前と展開の後で、データがまったく同じに戻るかどうかが分かれ目です。
可逆圧縮とは何か?
展開すると、圧縮する前のデータに完全に戻る圧縮
一部でも変わると困る文書・プログラムに使う。
非可逆圧縮とは何か?
一部の情報を捨てて小さくするため、展開しても元のデータに完全には戻らない圧縮
可逆圧縮より大幅に小さくできる。
非可逆圧縮が画像・音・動画に使えるのはなぜか?
人の目や耳では違いに気づきにくい部分の情報を捨てているから
細かな色の変化や聞き取りにくい高い音などを削る。
プログラムのファイルに非可逆圧縮を使ってはいけないのはなぜか?
1 文字でも変わると正しく動かなくなるので、完全に元に戻せる必要があるから
文書・プログラムは可逆圧縮(ZIP など)でまとめる。
次の形式を、可逆圧縮と非可逆圧縮に分けよ。
ZIP、JPEG、PNG、MP3
ZIP、JPEG、PNG、MP3
可逆圧縮:ZIP・PNG/非可逆圧縮:JPEG・MP3
写真は JPEG、図やイラストは PNG が多い。MP3 は音楽、MPEG は動画の非可逆圧縮の形式。
3. 圧縮の方法
根拠: 学習指導要領 情報Ⅰ-(2)-ア-(ア)
圧縮は、データの中の繰り返しや偏りを見つけて、それを短く書き直すことで行います。
ランレングス圧縮とは、どんな方法か?
同じ値が続く部分を「値と、続く個数」の組に置き換える方法
AAAAA は A5 と書ける。白黒の画像のように同じ色が長く続くデータで効く。
ランレングス圧縮で、かえってデータ量が増えてしまうのはどんなデータか?
同じ値がほとんど続かず、値が細かく入れ替わるデータ
ABCD は A1B1C1D1 となり、2 倍の長さになる。
ハフマン符号化とは、どんな考え方の圧縮か?
よく出てくる文字には短い符号を、あまり出てこない文字には長い符号を割り当てる
全体のビット数が少なくなる。出現回数に偏りがあるほど効く。
長さの違う符号を割り当てるとき、正しく元に戻すためにどんな条件が要るか?
どの符号も、ほかの符号の先頭部分と一致しないこと
たとえば 0 と 01 を両方使うと、0 を読んだ時点でどちらか決まらない。区切りが一通りに決まるように割り当てる。
練習問題
問 1 文字列 AAAABBBCCD を、「文字と続く個数」の組で表すランレングス圧縮で書き直せ。
また、1 文字(個数の数字も 1 文字とする)を同じデータ量とみなしたときの圧縮率を求めよ。
また、1 文字(個数の数字も 1 文字とする)を同じデータ量とみなしたときの圧縮率を求めよ。
A4B3C2D1、80%
元は 10 文字、圧縮後は 8 文字。圧縮率は 8 ÷ 10 × 100 = 80 で 80%。
問 2 文字列 AAAAABBCCD(A が 5 個、B が 2 個、C が 2 個、D が 1 個)を、次の表の符号で表す。
文字
A
B
C
D
符号
0
10
110
111
全体で何ビットになるか。また、4 種類の文字をすべて 2 ビットで表した場合と比べて何ビット少ないか。
| 文字 | A | B | C | D |
|---|---|---|---|---|
| 符号 | 0 | 10 | 110 | 111 |
18 ビット、2 ビット少ない
各文字の個数に符号の長さをかけて足す。5 × 1 + 2 × 2 + 2 × 3 + 1 × 3 = 18。
すべて 2 ビットなら 10 × 2 = 20 なので、2 ビット少ない。
いちばん多い A に 1 ビットの符号を割り当てたことで短くなっている。
どの符号もほかの符号の先頭部分と一致しないので、0 と 1 の並びから元の文字列を一通りに読み戻せる。