SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

マンガで分かるプログラミング用語辞典

「圧縮と解凍」
~マンガでプログラミング用語解説

マンガで分かるプログラミング用語辞典(64)

解説

 圧縮と解凍は、コンピュータを利用していると必ずと言ってよいほど遭遇する言葉です。

 圧縮は、データをアルゴリズム(一定の手順)によってコンパクトにまとめることです。解凍はその逆で、圧縮されたファイルを元に戻すことです。

 圧縮アルゴリズムは、様々な方式が研究されており、多くのソフトウェアに組み込まれています。その方式の中から、いくつかを紹介します。

 まずは、単純に出現数を置き換えたものです。同じようなデータが連続する場合に高い圧縮率となります。しかし、現実のファイルでは、あまり使う機会がないでしょう。

AAABBBBBAAAA
↓
Aが3回、Bが5回、Aが4回
↓
A3B5A4

 次は、辞書を作りながら圧縮していく方式です。単純な文字数よりも複雑です。「辞書にある文字+1文字」を、辞書に追加しながら、データを「辞書の位置+次の文字」に置き換えていきます。

ABABABA……
↓
┏━━━━━━━━━━━━━┳━━━━━━━━━━┳━┳━━━━━┓
┃圧縮したデータ      ┃辞書に追加する文字 ┃ ┃辞書   ┃
┣━━━━━━━━━━━━━╋━━━━━━━━━━╋━╋━━━━━┫
┃             ┃0番目に空文字    ┃→┃0    ┃
┃0番目の辞書の値+A [0,A] ┃[A]BABABA……┃→┃1 A  ┃
┃0番目の辞書の値+B [0,B] ┃A[B]ABABA……┃→┃2 B  ┃
┃1番目の辞書の値+B [1,B] ┃AB[AB]ABA……┃→┃3 AB ┃
┃3番目の辞書の値+A [3,A] ┃ABAB[ABA]……┃→┃4 ABA┃
┗━━━━━━━━━━━━━┻━━━━━━━━━━┻━┻━━━━━┛
↓
[0,A][0,B][1,B][3,A]……

 また、出現率で符号化する方法もあります。出現数でツリーを作っていき、出現数の多い文字ほど、短い符号で表すことで、圧縮を行います。

ABCDEBCDECDE……
↓
出現率で木構造を作る
 0/\1
 /  \
E  0/\1
   D  \
     0/\1
     C  \
       0/\1
       B  A
↓
一意の表を作れる
┏━┳━━━━┓
┃E┃0   ┃
┃D┃10  ┃
┃C┃110 ┃
┃B┃1110┃
┃A┃1111┃
┗━┻━━━━┛
↓
bitの並び順で置き換える
1111 1110 110 10 0 1110 110 10 0 110 10 0……

 他にも様々な圧縮アルゴリズムが存在します。興味のある人は、調べてみるとよいでしょう。

サンプル

 簡単な「圧縮と解凍」のサンプルです。同じ文字が連続する場合は、数値に置き換えます。

<html>
    <head>
        <title>「圧縮と解凍」のサンプル</title>
    </head>
    <body>
        <pre><script type="text/javascript">
            // 元のデータと出力
            var datSource = "AAAABBBBCCCCABCDEFDDDDDEEEEE";
            document.writeln("元のデータ : " + datSource.length + "\n"
                + datSource + "\n");

            // 圧縮
            var datCmprss = datSource.replace(/(.)\1*/g,
                function(s, s1, s2) {
                    if (s.length == 1) {return s;}
                    return s[0] + s.length;
                }
            );

            // 圧縮後データと出力
            document.writeln("圧縮後のデータ : " + datCmprss.length + "\n"
                + datCmprss + "\n");

            // 解凍
            var datDecmp = datCmprss.replace(/([A-Z])(\d*)/g,
                function(s, s1, s2) {
                    if (s2 == "") {return s1;}
                    return new Array(s2 * 1 + 1).join(s1);
                }
            );

            // 解凍後データと出力
            document.writeln("解凍後のデータ : " + datDecmp.length + "\n"
                + datDecmp + "\n");
        </script></pre>
    </body>
</html>
出力結果
元のデータ : 28
AAAABBBBCCCCABCDEFDDDDDEEEEE

圧縮後のデータ : 16
A4B4C4ABCDEFD5E5

解凍後のデータ : 28
AAAABBBBCCCCABCDEFDDDDDEEEEE
フィードバックお待ちしております!

 ご感想、解説して欲しい用語、解説内容のアドバイスなどございましたら、FacebookTwitterなどでお気軽に編集部までお寄せください。よろしくお願いいたします。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
マンガで分かるプログラミング用語辞典連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8109 2014/10/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー