期末テストを終え,学校も少し暇になったのか,こうしろうの情報処理技術者試験に向けた勉強のピッチが上がってきた。3月19日から午後問題に取り組み始めた。基本情報処理技術者試験の午後問題の範囲は,1.ハードウェアに関すること。2.ソフトウェアに関すること。3.アルゴリズムに関すること。4.データ構造及びデータベースに関すること。5.通信ネットワークに関すること。6.情報処理技術に関すること。7.プログラム設計に関すること。8.プログラム言語に関することである。

 1,2は知識であるが,3以降は考えること,実際に何かを作り出すことを求められる。頭の体操と考えれば楽しいのであるが,経験が必要になる分野でもある。7,8のプログラム設計やプログラムの作成は日常,これらを仕事としてやっているプログラマにとっては,簡単なところかもしれないが,MindStormsの標準開発環境,MindStormsで作成したロボットを動かすことに特化したC言語に似たNQC,そしてC言語をちょっとかじっただけのこうしろうにとっては,なかなか容易ではあるまい。前途多難であるが,本人は「春休みにがんばるぞー」と意気盛んだ。

 3月19日から,3月22日までの4日間,基本情報技術者実戦問題に取り組んだ結果,「よう,わからん」とこうしろうが質問に来たのが,次の4点である。

ハッシュ法のフローチャート
文字列圧縮のフローチャート
SQLの副問合せ(サブクエリ)
コンピュータ・ネットワークの稼働率

 フローチャートが苦手なようである。「こうしろう,フローチャートの問題は,頭でどれだけ考えてもわからんちゃ。」フローチャートの穴埋め問題の答えを頭の中で求めるのは慣れた人間にとっても,つらい作業である。フローチャートの意味する動作を理解するには,紙の上に表を書いて処理を行うごとに値(データ)がどう変わるかを書き込んでいけば良い。

 まずはハッシュ法。ハッシュ法とは表の探索,表へのデータの追加・更新を効率よく行うための手法の1つであり,ハッシュ関数という計算式を用い表中のデータ格納位置を求める。

 実戦問題の設問は75,100,253,355という整数値の格納位置を,ハッシュ値=整数値を15で割った余り+1というハッシュ関数で求めるというものである。

 75のハッシュ値は,余り0 + 1で1,100は余り10 + 1で11,253は余り13 + 1で14,355は余り10 + 1で11となる。ハッシュ法の場合,複数のデータが同じハッシュ値を返すことがあるという性質がある。100と355の格納位置を示すハッシュ値はともに11である。この衝突を回避し,なおかつ効率的にデータを取り出すためにチェーンという項目を使う。



 今回の例では15で割った余りに1を足した値をハッシュ値とするので,重複する値が発生しない限り,表の1から15の位置にデータが格納されていく。重複した値(355)が発生した場合,16以降の空いている場所にその値を格納し,チェーンに同じハッシュ値を持つデータの格納位置を入れる。

 この表から処理の手順であるフローチャートがイメージできるかどうかが勝負である。一番外側のループ(繰り返し)が75,100,…と順に値を読み出す部分,次にその値のハッシュ値を求め,1から15の格納場所が空いていれば,その場所に入れる。もしその場所が空いていない場合は16以降の空いている場所を探すのが,次のループになる。

 次に文字列の可逆圧縮のフローチャートである。



 今度は横に表(文字列を入れる配列)を書く。上の配列の文字列を可逆(元に戻せるように)圧縮する。ルールとしては@(アットマーク)を圧縮の開始文字とする(圧縮対象文字に@が含まれないことが前提になる)。次に繰り返す文字数,そして圧縮対象となった文字を続ける。4文字以上同じ文字が続く場合は圧縮の効果が現れる。表や配列を扱うフローを考える時に重要なことは,その配列の1つずつの要素を操作する添え字を決め,初期値をどう与えるかということである。圧縮元の配列の添え字をiとし,圧縮先の配列の添え字をjとする。そしてiの初期値を2にする。1ではなく2にするところがミソなのである(jは1とする)。圧縮元配列(i)とその1つ前,圧縮元配列(i - 1)を比較する。これが一致しなければ圧縮する必要はないと判断できる。一致した場合は,一致する文字数のカウントを開始し,次の文字,次の文字と比較していく。不一致になった時点で,@,カウント,圧縮対象の文字をjをたよりに圧縮先の配列に埋め込んでいく。

 フローチャートの問題では,「この処理のフローチャートを全部書け」と要求されることはなく,おおよそのフローは仕上がっていて,「空欄を埋めよ」と選択肢が用意されていることが多い。フローの中に入れる文字列を予想して,どのように処理が進んでいくかを紙の上に書いていくことで答えは浮かびあがってくるはずだ。しかし,与えられた時間内に問題をこなすためには,経験や慣れが必要なのである。

 次のSQLの副問合せも,実際にSQLを作り,実行して結果を確認することでしか真の理解は得られない。MindStormsの外箱に書いてあるMITのセイモア・パパート博士の言葉「知識は理解の一部でしかありません。真の理解は手を使って経験することから生まれます。」を思い出した。これらの問題を解くコツは訓練からしか学べないのである。

 でもね,コンピュータ・ネットワークの稼働率は公式を覚えるだけでOKなんだ。企業の本社や支店を結ぶネットワークが下図のように接続されているとする。



 1本の線で高岡-富山-東京が結ばれている。このような接続を直列接続と言い,高岡-東京間の稼動率はP1,P2の積で求まる。つまり,0.8 × 0.7で稼働率は0.56となる。

 この接続に高岡-東京間を結ぶ線を1本追加すると,並列接続になる。



並列接続の稼働率は,非稼働率の積を1から引くことで求まる。稼働率 = 1 - ( 1 - 0.8 × 0.7 ) × ( 1 - 0.6 ) で 0.824となる。

 他の試験と同様に,公式を覚えることも大切なのである。