前回(第6回)はデータベース分野に焦点を当て、リレーショナルモデルやER図、正規化、SQLなどを詳しく解説しました。今回は、基本情報技術者試験のもう一つの柱といえる、アルゴリズムとプログラミング基礎に注目します。
午前試験では、疑似言語を使ったアルゴリズム問題や、代表的なデータ構造・ソート・探索などの知識が問われるほか、午後試験でも出題されることがあります。プログラミング言語の詳細を知らなくても解ける問題が多いですが、ロジックや考え方がしっかり身についていないと高得点は難しい分野です。
この記事では、制御構造やデータ構造などの基本知識から、代表的なソート・探索アルゴリズムの仕組みと計算量、アルゴリズム問題を解く際の考え方などを体系的に整理していきます。
アルゴリズムとは「問題を解決するための手順・方法」のこと。プログラミングとは「コンピュータに対して命令を記述する」こと。基本情報技術者試験では、特定のプログラミング言語に依存しない形での出題が多いですが、命令型言語に慣れていると理解が早まります。
アルゴリズム分野は、ITエンジニアとしての基礎的な思考力を問うところでもあるため、合格の鍵となる分野の一つです。
プログラムの制御構造は、どんな言語でも大別すると「順次処理」「分岐処理」「繰り返し処理」の3つに集約できます。これをしっかり把握しておくと、疑似言語を読むときもスムーズです。
プログラムは基本的に、上から下へと順番に命令を実行します。これが「順次処理」です。連続した計算や処理を記述する部分で、特別な分岐やループを伴わない場合はこの順次処理が適用されます。
条件式の真偽によって処理を切り替えるのが「分岐処理」です。一般的に以下のような構文で表されます:
IF 条件式 THEN 処理A ELSE 処理B END IF
単純なif文だけでなく、if-else-ifの多段分岐やswitch-case(またはselect-case)構文が用いられるケースもあります。基本情報技術者試験の疑似言語でも、条件判定と分岐の理解は必須です。
プログラムの中で同じ処理を複数回行う必要がある場合に使われるのが「繰り返し処理」です。代表的な例:
繰り返し処理の問題では、何回繰り返すのか、ループ変数がどのように変化するかなどをきちんと追いかける力が求められます。
アルゴリズムを考える上で欠かせないのが、データ構造の理解です。データ構造とは、コンピュータ上でデータを整理・保存する方法のこと。基本情報技術者試験では、以下のような構造がよく問われます。
連続したメモリ領域に、同じ型のデータを並べて格納する最も基本的なデータ構造。添字(インデックス)を指定して要素を取り出します。添字は0から始まる場合も1から始まる場合もあり、疑似言語の仕様によって異なる点に注意が必要です。
配列の利点はアクセスが高速(添字演算で直接要素にアクセス)であること。欠点は要素数が固定であり、途中に要素を挿入・削除するのがコスト高になることです。
要素同士をポインタや参照などで繋ぐデータ構造。連結リスト(単方向リスト、双方向リスト)では、要素を挿入・削除する際に配列と比べて効率が良い(要素を追加するときはポインタをつなぎ替えるだけ)というメリットがあります。
一方で、配列のようにランダムアクセスができない(頭から順番に辿らないと特定要素にアクセスできない)ため、要素の検索やランダムアクセスが遅いというデメリットがあります。
試験問題では、スタックやキューへデータを入れたり出したりしたときの結果を追いかける問題がよく出ます。操作の順番を正確に把握し、最終的にどの要素が出てくるかを判断する力が求められます。
ソート(並べ替え)や探索(検索)はアルゴリズム分野の代表格です。基本情報技術者試験では、バブルソート、選択ソート、挿入ソート、クイックソートなどがしばしば登場します。計算量(オーダー記法)を問われることがあるので、O(n^2)やO(n log n)といった大まかな性能目安を覚えておくと便利です。
試験での典型的な出題としては、「ある配列をバブルソートで並べ替えていく過程を追い、その結果を答えよ」といった問題や、「クイックソートと選択ソートの平均計算量はどのように異なるか」といった理論問題などがあります。
2分探索を使うためには、配列があらかじめソートされている必要があります。ソートにかかる時間+探索にかかる時間をトータルで考えると、どんな状況に適しているかが見えてきます。試験では、バイナリサーチの手順を疑似コードで示し、「何回比較すると見つかるか」などを問われるケースもあります。
午前試験・午後試験いずれのアルゴリズム問題でも、「途中結果を正確に追いかける」ことが大切です。疑似言語やフローチャートの記述をステップごとに丁寧に読み、変数の値がどのように変化するかを把握すれば、正答にたどり着ける可能性が高まります。
午後試験では、コードの一部が空欄になっていて、それを補完する問題や、途中の変数の値や配列の状態を答える問題などが典型です。部分的な読解だけでなく、プログラム全体の流れを把握できるように心がけましょう。
アルゴリズムの性能を評価する上で欠かせないのが、計算量の考え方です。よく用いられるオーダー記法では、nを入力データのサイズとして、処理が増加するペースを表します。
試験問題では、「このアルゴリズムの平均計算量はO(n^2)だが最悪計算量はO(n log n)ではない」など、理論上の比較を問う問題がしばしば出題されます。厳密な証明は不要ですが、代表的なソート・探索のオーダーを覚えておくとスムーズに解答できるでしょう。
アルゴリズム問題では、何度も実際に手を動かしてトレースする経験がものを言います。基本情報技術者試験の過去問や類似問題を繰り返し解き、「どのように変数が変化するか」を紙に書き出しながら学習するのがおすすめです。いきなり難しい問題に取り組むよりも、まずは基本的なロジックをしっかり理解することが合格への近道となるでしょう。
次回(第8回)は、セキュリティ分野に焦点を当てます。暗号化や認証、マルウェアの種類、情報漏洩対策など、現在のIT社会で欠かせない知識を幅広く取り上げていきます。お楽しみに!