データの圧縮|可逆圧縮と非可逆圧縮、ランレングスとハフマン符号
画像・音声・動画はデータ量が大きいので、そのまま保存したり送ったりすると、容量も時間もかかります。データの意味を保ったまま量を減らす技術が圧縮です。共通テストでは、圧縮の手順を問題文で説明し、その手順どおりに圧縮後のデータ量を求める問題がよく出ます。
圧縮と展開
- 圧縮:データの表し方を工夫して、データ量を小さくすること
- 展開(解凍):圧縮したデータを元の形に戻すこと
圧縮率
圧縮率 = 圧縮後のデータ量 ÷ 圧縮前のデータ量 × 100(%)
例: 200KBのファイルを50KBに圧縮した → 50 ÷ 200 × 100 = 25%
圧縮率は小さいほどよく圧縮できていることを表します。「75%小さくなった」と「圧縮率75%」を混同しないように注意しましょう。
可逆圧縮と非可逆圧縮
| 可逆圧縮 | 非可逆圧縮 | |
|---|---|---|
| 展開すると | 完全に元どおりになる | 元どおりにはならない |
| 圧縮のしかた | 表し方を工夫するだけ | 人が気づきにくい情報を捨てる |
| 圧縮率 | あまり小さくできない | 大幅に小さくできる |
| ファイル形式の例 | ZIP、PNG、GIF | JPEG(画像)、MP3・AAC(音声)、MPEG-4(動画) |
| 向いているもの | 文書、プログラム、数値データ | 写真、音楽、動画 |
文書やプログラムは、1文字でも変わると意味が変わったり動かなくなったりするので、必ず可逆圧縮を使います。写真や音楽は、人が気づかない程度の変化なら問題ないので、非可逆圧縮で大きく減らせます。
ランレングス圧縮
**ランレングス圧縮**は、同じデータが続く部分を「データ+続く個数」で表す可逆圧縮です。
例: AAAAABBBCCCCCCC(15文字)→ A5B3C7(6文字)
白黒の画像を、1行ずつ「白が何個、黒が何個」と表すときにも使えます。
例: 白白白白黒黒白白白白白白(12画素)→ 白4黒2白6
注意:逆に増えることもある
同じデータがほとんど続かない場合、かえってデータ量が増えます。
例: ABCD(4文字)→ A1B1C1D1(8文字)
圧縮の効果は、データの性質によって変わります。
ハフマン符号
ハフマン符号は、よく出てくる文字に短い符号、あまり出てこない文字に長い符号を割り当てる可逆圧縮の方法です。
例: 「AAAAABBBCD」(10文字)を圧縮する
| 文字 | 出現回数 | 固定長の符号(2ビット) | ハフマン符号 |
|---|---|---|---|
| A | 5 | 00 | 0 |
| B | 3 | 01 | 10 |
| C | 1 | 10 | 110 |
| D | 1 | 11 | 111 |
- 固定長:10文字 × 2ビット = 20ビット
- ハフマン符号:5 × 1 + 3 × 2 + 1 × 3 + 1 × 3 = 17ビット
ハフマン符号は、どの符号もほかの符号の先頭部分になっていない(0、10、110、111)ので、区切りの記号がなくても一通りに読み分けられます。例えば「010110」は、0 | 10 | 110 → A・B・C と読めます。
符号の作り方(ハフマン木)
- 出現回数の少ない2つを組にして、合計の回数をもつ1つのまとまりにする(C1+D1 → 2)
- 残りの中で、また少ない2つを組にする(2+B3 → 5)
- 最後の1つになるまで繰り返す(5+A5 → 10)
- 組にするとき、片方に0、もう片方に1を割り当て、上からたどった0と1の並びを符号にする
非可逆圧縮の工夫
非可逆圧縮では、人の感覚の特性を利用して情報を減らします。
- 画像(JPEG):人の目は、明るさの変化には敏感だが、色の細かい変化には鈍い。そこで色の情報を間引く
- 音声(MP3など):人が聞き取りにくい高い音や、大きな音にかき消される小さな音を取り除く
- 動画(MPEG):前のフレームとの差分だけを記録する。背景が動かない場面では、変化した部分だけを記録すればよい
JPEGの画像を編集して何度も保存し直すと、そのたびに情報が失われて画質が落ちていきます。
共通テストでの出題
- 手順どおりの圧縮:問題文で独自の圧縮ルールが示され、それに従って圧縮後の文字数やビット数、圧縮率を求める問題。ルールを読み落とさないことが大切です。
- 方式の選択:「どのデータには可逆圧縮が適切か」「この形式は可逆か非可逆か」を判断する問題。
- データ量との組合せ:画像や音声のデータ量を求めてから、圧縮後の量を考える問題(「画像と音のデジタル化」)。
よくある間違い
- 「圧縮率が大きいほどよく圧縮できている」:圧縮率は「圧縮後 ÷ 圧縮前」なので、小さいほどよく圧縮できています。
- 「ランレングス圧縮なら必ず小さくなる」:同じデータが続かないと、逆に増えることがあります。
- 「PNGは非可逆」:PNGとGIFは可逆圧縮、JPEGは非可逆圧縮です。
まとめ
- 圧縮率 = 圧縮後 ÷ 圧縮前。小さいほどよく圧縮できている
- 可逆圧縮は完全に元に戻る(文書・プログラム向き)。非可逆圧縮は元に戻らないが大きく減らせる(写真・音声・動画向き)
- ランレングス圧縮は連続するデータを「データ+個数」で表す
- ハフマン符号は、よく出る文字に短い符号を割り当てる