カニゲーム攻略日記ブログ

beatmaniaIIDXやハースストーンなどのゲーム攻略日記。主にまったり勢。2016年にIIDX皆伝になった

プログラムはなぜ動くのか  第6章 自分でデータを圧縮してみよう

目次

ファイルの圧縮

ファイルはバイト単位で記録

1byte = 8bit = 00000000~11111111 = 0~255

ファイルはバイトデータの集まり

例:文書ファイル(値は適当)

こんにちは
↓ 実体
01010000 01000111 00001011 10101101

例:画像ファイル(値は適当)

画像
↓ 実体
01010000 01000111 00001011 10101101

ランレングス法の仕組み

「データ * 繰り返し回数」で圧縮

例:AAAAAABBCDDEEEEEF(17byte)を圧縮

AAAAAABBCDDEEEEEF   (17byte)
↓ ランレングス法
A6B2C1D2E5F1        (12byte)

ハフマン法

  • 使われる文字のバイト数を小さくして
  • 使われない文字のバイト数は大きくする

例:Aを100回、Qを3回使ってる文章ファイル

悪い例:AもQも8bit

A(8bit) * 100回 + Q(8bit) * 3回  
= 800bit + 24bit  
= 824bit

良い例:Aは2bit、Qは10bit

A(2bit) * 100回 + Q(10bit) * 3回  
= 200bit + 30bit  
= 230bit

824→230とかなり小さくできた

ハフマン法の手順

  1. ファイル毎に最適な符号体系を構築(ハフマン符号を作成)
  2. ハフマン符号を基に圧縮
圧縮前のファイル 圧縮後のファイル
圧縮前のデータ ハフマン符号
圧縮されたデータ

例:AAAAAABBCDDEEEEEFをハフマン法で圧縮

  1. データの出現頻度を並べる

    出現頻度 6 5 2 2 1 1
    データ A E B D C F
  2. 出現頻度の少ない方から2つ選び、数値を合計して上に伸ばす

    1 2
    出現頻度 6 5 2 2 1 1
    データ A E B D C F
  3. 手順2を繰り返す。どの位置にある数値を選んでもOK

    1 4 2
    出現頻度 6 5 2 2 1 1
    データ A E B D C F
    2 6
    1 4 2
    出現頻度 6 5 2 2 1 1
    データ A E B D C F
    2 6
    1 11 4 2
    出現頻度 6 5 2 2 1 1
    データ A E B D C F
    3 17
    2 6
    1 11 4 2
    出現頻度 6 5 2 2 1 1
    データ A E B D C F
  4. 数値が1つになったら左に0、右に1を書く

    3 17
    bit 0 1
    2 6
    bit 0 1
    1 11 4 2
    bit 0 1 0 1 0 1
    出現頻度 6 5 2 2 1 1
    データ A E B D C F
  5. 上位桁から並べたものがハフマン符号になる

    3 17
    bit 0 1
    2 6
    bit 0 1
    1 11 4 2
    bit 0 1 0 1 0 1
    出現頻度 6 5 2 2 1 1
    データ A E B D C F
    ハフマン符号 00 01 100 101 110 111

上記の表だと、以下になる

AAAAAABBCDDEEEEEF
=
0000000000001001001101011010101010101111

17byteから5byteに圧縮成功

可逆圧縮非可逆圧縮