2017/08/17 04:58

プロジェクトの本文や、活動報告についての感想、ご意見、ご質問を、ぜひコメントでお寄せいただければと思います。現在は支援募集期間中であり、本企画の実施期間ではないため、お寄せいただいた感想などについてはリターンとしてではなく、お返事や回答をさせていただきます。

また、私個人についてはこちらをご覧ください。

では本題です。

別の課題として、データ圧縮を取り上げることも可能かと思います。白黒のドットのまとまりを対象にすれば、ラン・レングスなどの簡単なデータ圧縮方法もあるかと思います。『コンピュータ使わない情報教育 アンプラグドコンピュータサイエンス』では、微妙に変形したラン・レングスを題材にしていました。あるいは、『コンピュータ使わない情報教育 アンプラグドコンピュータサイエンス』で同じく扱かっていますが、例文によっては文字や単語などの頻度からデータ圧縮を課題にすることも可能でしょう。

16 x 16ドットの簡単な画像を例にしてみましょう。
まず、この例では、ビット表示の1ビットを送る、あるいは記録するのに1バイトを用いるものとします (ちょっと不自然ですが):
ビット・マップ          ビット表示(実際にはバイト)
□□□□□□□□□□□□□□□□ 0000000000000000
□□□□□□□■■□□□□□□□ 0000000110000000
□□□□□□■□□■□□□□□□ 0000001001000000
□□□□□□■□□■□□□□□□ 0000001001000000
□□□□□■□□□□■□□□□□ 0000010000100000
□□□□□■□□□□■□□□□□ 0000010000100000
□□□□■□□□□□□■□□□□ 0000100000010000
□□□□■□□□□□□■□□□□ 0000100000010000
□□□■■■■■■■■■■□□□ 0001111111111000
□□□■□□□□□□□□■□□□ 0001000000001000
□□■□□□□□□□□□□■□□ 0010000000000100
□□■□□□□□□□□□□■□□ 0010000000000100
□□■□□□□□□□□□□■□□ 0010000000000100
□■□□□□□□□□□□□□■□ 0100000000000010
□■□□□□□□□□□□□□■□ 0100000000000010
□■□□□□□□□□□□□□■□ 0100000000000010

この方法だと、16 x 16 = 256バイトが必要になります。

このビット・マップは、“□” と “■” で構成されています。これに注目した方法はなにかないでしょうか。横方向に “□” が何個並んでいるかを数えるというような方法はどうでしょう。ラン・レングスと呼ばれるものの一種です。

ここで、変則的かもしれませんが1バイトを4ビットずつに分け、各4ビットの一番上位のビットが “0” であれば「□」であることを示し、 “1” であれば「■」であることを現わすものとします。「□」、「■」の並びの数は、残りの3ビットを使い、 “0” から “7” までを数えられるものとします。これで試してみましょう:
ビット・マップ           4ビット-1バイト表示
□□□□□□□□□□□□□□□□ 0:7-0:7 0:2-0:0
□□□□□□□■■□□□□□□□ 0:7-1:2 0:7-0:0
□□□□□□■□□■□□□□□□ 0:6-1:1 0:2-1:1 0:6-0:0
□□□□□□■□□■□□□□□□ 0:6-1:1 0:2-1:1 0:6-0:0
□□□□□■□□□□■□□□□□ 0:5-1:1 0:4-1:1 0:5-0:0
□□□□□■□□□□■□□□□□ 0:5-1:1 0:4-1:1 0:5-0:0
□□□□■□□□□□□■□□□□ 0:4-1:1 0:6-1:1 0:4-0:0
□□□□■□□□□□□■□□□□ 0:4-1:1 0:6-1:1 0:4-0:0
□□□■■■■■■■■■■□□□ 0:3-1:7 1:3-0:3
□□□■□□□□□□□□■□□□ 0:3-1:1 0:7-0:1 1:1-0:3
□□■□□□□□□□□□□■□□ 0:2-1:1 0:7-0:3 1:1-0:2
□□■□□□□□□□□□□■□□ 0:2-1:1 0:7-0:3 1:1-0:2
□□■□□□□□□□□□□■□□ 0:2-1:1 0:7-0:3 1:1-0:2
□■□□□□□□□□□□□□■□ 0:1-1:1 0:7-0:5 1:1-0:1
□■□□□□□□□□□□□□■□ 0:1-1:1 0:7-0:5 1:1-0:1
□■□□□□□□□□□□□□■□ 0:1-1:1 0:7-0:5 1:1-0:1

この「4ビット-1バイト表示」のバイト数を数えてみると、45バイトになります。

最後に8ビットごとの “□” と “■” の並びをそのままバイトに置き換えるとします。“□” は0に、 “■” は1とします。
ビット・マップ          バイト表示
□□□□□□□□□□□□□□□□ 00 00
□□□□□□□■■□□□□□□□ 01 80
□□□□□□■□□■□□□□□□ 02 40
□□□□□□■□□■□□□□□□ 02 40
□□□□□■□□□□■□□□□□ 04 20
□□□□□■□□□□■□□□□□ 04 20
□□□□■□□□□□□■□□□□ 08 10
□□□□■□□□□□□■□□□□ 08 10
□□□■■■■■■■■■■□□□ 1F F8
□□□■□□□□□□□□■□□□ 10 08
□□■□□□□□□□□□□■□□ 20 04
□□■□□□□□□□□□□■□□ 20 04
□□■□□□□□□□□□□■□□ 20 04
□■□□□□□□□□□□□□■□ 40 02
□■□□□□□□□□□□□□■□ 40 02
□■□□□□□□□□□□□□■□ 40 02

このサイズの、2値のビットマップは、右にあるように 2 x 16 = 32バイトを必ず必要とします。

ここまででも課題とてしては十分なのでしょうが、企画の課題とは別に、どうせなので技術としてのデータ圧縮も眺めてみましょう。題材は3つめのものを使います。3つめのもののバイトの出現頻度は次のようになります:
値  回数
00 2
01 1 
80 1
02 5
40 5
04 5 
20 5
08 3
10 3
1F 1
F8 1

ここで、これらに頻度に応じて次のようにbit単位の符号を割り当てたとします:
値  回数  ビット列
00 2   1111110
01 1   11111110
80 1   111111110
02 5   0
40 5   10
04 5   110
20 5   1110
08 3   11110
10 3   111110
1F 1   1111111110
F8 1   11111111110

これを上の図のバイト列に当てはめていきます:
バイト表示  符号ビット表示
00 00  1111110 1111110
01 80  11111110 111111110
02 40  0 10
02 40  0 10
04 20  110 1110
04 20  110 1110
08 10  11110 111110
08 10  11110 111110
1F F8  1111111110 11111111110
10 08  111110 11110
20 04  1110 110
20 04  1110 110
20 04  1110 110
40 02  10 0
40 02  10 0
40 02  10 0

長くなったので、続きは次回にいたします。

興味を持たれましたら、ぜひご支援や、コメントを頂ければと思います。