Googleの検索結果は、どうやって「あの順番」に並んでいるのでしょう。
何百億ものページを瞬時に並べ直す裏側には、アルゴリズムという「処理の手順書」があります。診断士試験の経営情報システム科目では、そのアルゴリズムの仕組みと、プログラムを書くための基礎知識が問われます。難しそうに見えますが、考え方さえ押さえれば得点源になる分野です。
プログラミングとアルゴリズムは、経営情報システム科目の中でも「なんとなく苦手」と感じやすい分野です。でも試験で問われるのは、コードを書ける力ではなく「仕組みを読み取る力」です。プログラミング言語の分類からオブジェクト指向・アルゴリズムの種類・計算量・データ構造・フローチャートまで、一つひとつ丁寧に整理していきましょう。
プログラミング言語の分類
プログラミング言語は、コンピュータがどれだけ直接理解できるかという観点で階層に分かれています。試験では「コンパイラとインタプリタの違い」が頻出です。
インタプリタ:ソースコードを1行ずつ読み取り、その場で解釈しながら実行する。実行ファイルは生成しない。変換と実行が同時進行するため起動は手軽だが、実行速度はコンパイラより遅い傾向がある。代表例:Python・JavaScript・Ruby
| 項目 | 内容 |
|---|---|
| 変換タイミング | 実行前に一括変換 |
| 実行速度 | 速い(変換済みを実行) |
| 実行ファイル | 生成される(.exe等) |
| エラー検出 | コンパイル時に全体をチェック |
| 移植性 | 環境ごとにコンパイルが必要 |
| 項目 | 内容 |
|---|---|
| 変換タイミング | 実行時に1行ずつ |
| 実行速度 | やや遅い(都度解釈) |
| 実行ファイル | 生成されない |
| エラー検出 | 実行中にその行で発覚 |
| 移植性 | インタプリタがあれば動く |
オブジェクト指向の3原則
オブジェクト指向は、プログラムを「もの(オブジェクト)の集まり」として設計する考え方です。試験ではカプセル化・継承・ポリモーフィズムの3原則の定義と具体例が問われます。
クラス(Class):オブジェクトの設計図。クラスから実際のオブジェクト(インスタンス)を生成する。
身近な例:自動販売機の内部構造は見えないが、ボタンを押せば缶が出てくる。「どう動くか」を知らなくても使える状態にするのがカプセル化。
身近な例:「乗り物」クラスを継承して「自動車」「自転車」クラスを作る。「自動車 is-a 乗り物」が成り立つ関係。共通の機能は親クラスにまとめ、個別の機能を子クラスに追加する。
身近な例:「話しかける」という同じ操作でも、犬は「ワン」と返し、猫は「ニャー」と返す。呼び出す側は中身の違いを意識しなくてよい。
主要なアルゴリズムの種類
アルゴリズムとは「問題を解くための手順」のことです。試験では探索(サーチ)と整列(ソート)の代表的なアルゴリズムについて、動作原理と計算量の違いが問われます。
整列(ソート)アルゴリズム:データを昇順・降順などの順番に並べ替える処理。
どちらも「何回比較・移動が必要か」を計算量(O記法)で評価する。
探索アルゴリズムの比較
| 種類 | 動作の仕組み | 計算量(最悪) | 前提条件 | 特徴 |
|---|---|---|---|---|
| 線形探索 Sequential Search |
先頭から1件ずつ順番に照合する | O(n) | 不要(未整列でも可) | 単純だが件数が増えると時間がかかる |
| 二分探索 Binary Search |
中央値と比較し、大小によって探索範囲を半分に絞る。これを繰り返す | O(log n) | データがソート済みであること | 件数が2倍になっても比較回数は1回しか増えない(非常に効率的) |
整列(ソート)アルゴリズムの比較
| 種類 | 動作の仕組み | 計算量(平均) | 安定性 | 特徴 |
|---|---|---|---|---|
| バブルソート Bubble Sort |
隣り合う要素を比較し、大小が逆なら交換。これを繰り返す | O(n²) | 安定 | 最もシンプル。件数が多いと非常に遅い |
| 選択ソート Selection Sort |
未整列部分の最小値を探して先頭と交換する。これを繰り返す | O(n²) | 不安定 | 交換回数が少ない。比較回数はバブルと同等 |
| 挿入ソート Insertion Sort |
未整列の要素を適切な位置に挿入していく。手持ちのトランプを並べる要領 | O(n²) | 安定 | ほぼ整列済みのデータには高速 |
| クイックソート Quick Sort |
基準値(ピボット)を選び、小さい値・大きい値に分割。再帰的に繰り返す | O(n log n) | 不安定 | 平均的に最速。最悪ケースはO(n²)になることもある |
| マージソート Merge Sort |
データを半分ずつに分割し、整列しながらマージ(結合)する | O(n log n) | 安定 | 安定性が保証される。メモリを多く使う |
U計算量のO記法は「データ件数が増えたとき、処理時間がどう増えるか」を表す指標です。O(1)は件数に関係なく一定、O(log n)は対数的(2倍になっても1回しか増えない)、O(n)は比例、O(n²)は2乗で増える(10倍のデータで100倍かかる)という意味になります。試験では「二分探索→O(log n)」「バブルソート→O(n²)」の組み合わせをしっかり押さえておくとよいでしょう。
計算量O記法の処理時間イメージ(n=1000件のとき)
データ構造
データ構造とは、データをどのように格納・管理するかの「形式」のことです。目的に合ったデータ構造を選ぶことで、処理を効率化できます。試験では各構造の特徴と適切な使い場面を理解しておく必要があります。
用途:関数の呼び出し管理、「元に戻す」機能(Undo)、ブラウザの戻るボタン
用途:印刷待ち(スプーラ)、タスクの処理順管理
配列と違い、メモリ上で連続していなくてもよい。ただし任意の場所へのアクセスは遅い。
二分探索木は検索・挿入が効率的(O(log n))。ファイルシステム・XMLなどに活用される。
辞書・連想配列・データベースのインデックスに活用。キーの衝突(コリジョン)への対処が課題。
| データ構造 | アクセス方式 | 検索 | 挿入・削除 | 試験で問われる特徴 |
|---|---|---|---|---|
| 配列(Array) | 添字(インデックス) | O(n) | O(n) | 先頭から番号でアクセス。サイズ固定が多い |
| スタック | LIFO(後入れ先出し) | — | O(1) | push(追加)/pop(取り出し)操作 |
| キュー | FIFO(先入れ先出し) | — | O(1) | enqueue(追加)/dequeue(取り出し)操作 |
| 連結リスト | ポインタをたどる | O(n) | O(1) | 途中への挿入・削除が高速 |
| 二分探索木 | 大小比較で枝を選択 | O(log n) | O(log n) | 左子<親<右子の構造。整列済みで高速 |
| ハッシュ表 | ハッシュ値で直接指定 | O(1) | O(1) | 最も高速な検索。衝突への対処が必要 |
フローチャートと擬似言語
試験の経営情報システム科目では、フローチャートや擬似言語(疑似コード)を読み取る問題が頻出です。コードの内容を理解するのではなく、「この処理はどういう条件で繰り返すか」「何の値を返すか」を読み解く力が求められます。
ひし形(判断):条件分岐(YES/NO)
平行四辺形(入出力):データの入力・出力
楕円(端子):開始・終了
矢印(流れ線):処理の順序・流れ方向
while ~ do:条件を満たす間、繰り返す(前判定ループ)
do ~ while:処理後に条件を判定(後判定ループ。最低1回は実行)
for i ← 1 to n:変数を1からnまで変化させながら繰り返す
return:値を返して処理を終了する
擬似言語の例|1からnまでの合計を求める処理
試験問題では「n=4のとき sum の値は何か」という穴埋め形式が多い。変数の変化を表に書き出すトレース法が有効。



フローチャートや擬似言語の問題で悩んだときは、具体的な小さい数値(n=3や n=4)を代入して実際にトレースしてみるのが一番確実だと感じています。抽象的に読もうとするより、手を動かしながら変数の値を追っていくほうが圧倒的にミスが減ります。
過去問で確認する
実際の試験形式に近い練習問題で、理解度を確認しておきましょう。フローチャート・計算量・オブジェクト指向の3テーマから各1問です。
result ← 1
i ← 1
while i ≤ n do
result ← result × i
i ← i + 1
end while
- ア 21
- イ 36
- ウ 720
- エ 1296
i=1: result=1×1=1 → i=2: result=1×2=2 → i=3: result=2×3=6 → i=4: result=6×4=24 → i=5: result=24×5=120 → i=6: result=120×6=720 → i=7でwhile条件が偽になりループ終了。
6! = 1×2×3×4×5×6 = 720。トレース表を書くと確実に追えます。
- ア 線形探索の計算量はO(log n)であり、データ件数が2倍になっても比較回数は1回しか増えない
- イ バブルソートの計算量はO(n log n)であり、クイックソートと同等の効率を持つ
- ウ 二分探索の計算量はO(log n)であり、データがソート済みであることを前提として先頭から探すよりも大幅に効率が高い
- エ クイックソートの最悪計算量はO(n log n)であり、常に安定した性能を発揮する
ア:線形探索はO(n)。O(log n)は二分探索の特徴です。
イ:バブルソートはO(n²)。O(n log n)はクイックソートやマージソートです。
エ:クイックソートの最悪計算量はO(n²)です。ピボットの選び方が偏るとこの状態になります。
- ア カプセル化とは、既存のクラスの機能を引き継いで新しいクラスを定義することであり、コードの再利用性を高める
- イ 継承とは、同じメソッド名でも呼び出すオブジェクトの種類によって異なる処理が実行されることであり、プログラムの柔軟性を高める
- ウ ポリモーフィズム(多態性)とは、同一のインタフェース(メソッド名)に対して、オブジェクトの型によって異なる実装が実行される仕組みであり、処理の差し替えが容易になる
- エ クラスとは、クラスから生成される実体(実際のデータを持つもの)であり、インスタンスとも呼ばれる
アは継承の説明です。カプセル化は「データと処理をまとめ、外部から直接アクセスさせない」こと。
イはポリモーフィズムの説明。継承は「is-a関係で親クラスの機能を子クラスが引き継ぐ」こと。
エはクラスとインスタンスが逆です。インスタンスがクラスから生成された実体。クラスは設計図に当たります。
まとめ
- プログラミング言語は機械語・アセンブリ・高水準言語の3層に分類される
- コンパイラは一括変換して実行ファイルを生成(C言語・Java等)、インタプリタは1行ずつ実行(Python・JavaScript等)
- オブジェクト指向の3原則:カプセル化(情報隠蔽)・継承(is-a関係)・ポリモーフィズム(多態性)
- 探索:線形探索はO(n)、二分探索はO(log n)(ソート済みが前提)
- 整列:バブル・選択・挿入はO(n²)、クイックソート・マージソートはO(n log n)
- 計算量O記法:O(1) 定数 < O(log n) 対数 < O(n) 線形 < O(n log n) < O(n²) 2乗の順で遅くなる
- スタックはLIFO(後入れ先出し)、キューはFIFO(先入れ先出し)
- ハッシュ表は検索・挿入がO(1)で最速。木構造はO(log n)で効率的な検索が可能
- 擬似言語の読み取りは「具体的な数値でトレース」が最も確実な解法
- フローチャートの図形:長方形(処理)・ひし形(判断)・楕円(端子)を確実に覚える









