U「スタックとキューってどっちがLIFOだっけ?」——経営情報システムで最も混乱しやすい部分です。でも実生活のたとえで考えると、一度覚えたら絶対に忘れなくなりますよ。
アルゴリズムとは何か——問題を解く手順の設計
アルゴリズム(Algorithm)とは、ある問題を解くための手順・手続きを明確に定義したものです。コンピュータが理解できるよう、曖昧さなく定義された有限の手順の集まりを指します。
「どのようなアルゴリズムを選ぶか」によって、同じ問題を解くときの計算時間・メモリ使用量が劇的に変わります。診断士試験では、基本的な制御構造・代表的なソートアルゴリズム・データ構造の特性を問う問題が出題されます。
- アルゴリズムの3つの基本制御構造(順次・選択・反復)
- 主要なデータ構造(配列・スタック・キュー・木・グラフ)の特性
- ソートアルゴリズム5種の特徴と計算量の比較
- 探索アルゴリズム(線形探索・二分探索)の違い
- O記法(ビッグオー記法)の読み方と実用的な意味
アルゴリズムの3つの基本制御構造
どんな複雑なプログラムも、以下の3つの制御構造の組み合わせで記述できるとされています。これは「構造化プログラミング」の基本原則であり、プログラムの可読性・保守性を高めます。
処理を上から下へ順番に実行する。最も基本的な制御構造。「AをしてからBをする」という形式。
処理B
処理C
条件に応じて実行する処理を分岐する。IF文やCASE文がこれにあたる。「条件が成立すればAを、そうでなければBをする」。
処理A
ELSE
処理B
END IF
条件が満たされている間(または指定回数)、同じ処理を繰り返す。WHILE文・FOR文・DO WHILE文などがこれにあたる。
処理A
END WHILE
診断士試験ではフローチャートの読み方も出題されます。フローチャートの記号:端子(楕円)=開始・終了、処理(長方形)=順次処理、判断(ひし形)=選択分岐、ループ(六角形または矢印の戻り)=反復。フローチャートを見たら「どの制御構造か」を即座に識別できるようにしましょう。
データ構造の種類と特性——配列・スタック・キュー・木・グラフ
データ構造とは、コンピュータ上でデータを効率よく格納・操作するための仕組みです。選択するデータ構造によって、データの追加・削除・検索の速度が大きく変わります。
| データ構造 | 特徴 | 操作の得意・苦手 | 実生活の例え |
|---|---|---|---|
| 配列(Array) | 連続したメモリ領域に同型データを格納。インデックス(番号)でランダムアクセス可能。 | ✅ 検索(インデックス指定)が速い ❌ 挿入・削除は遅い |
番号付き引き出しの棚 |
| リスト(Linked List) | 各要素が次の要素へのポインタを持つ。メモリ上に分散して配置できる。 | ✅ 挿入・削除が速い ❌ ランダムアクセスは遅い |
数珠つなぎの鎖 |
| スタック(Stack) | LIFO(Last In First Out:後入れ先出し)。最後に入れたデータが最初に取り出される。 | ✅ プッシュ・ポップが速い ❌ 途中のデータへのアクセスは不可 |
積み重ねたお皿 |
| キュー(Queue) | FIFO(First In First Out:先入れ先出し)。最初に入れたデータが最初に取り出される。 | ✅ エンキュー・デキューが速い ❌ ランダムアクセスは不可 |
行列・順番待ち |
| 木(Tree) | 階層構造。根(ルート)から枝(ブランチ)・葉(リーフ)へ伸びる。二分木が代表的。 | ✅ 探索・整列に効率的 ❌ バランスが崩れると遅くなる |
組織図・ファイルシステム |
| グラフ(Graph) | 頂点(ノード)と辺(エッジ)で関係を表す。有向グラフ・無向グラフがある。 | ✅ 複雑な関係の表現に最適 ❌ メモリ消費が大きい場合がある |
路線図・SNSの友人関係 |
スタック:「お皿を積む」イメージ。最後に乗せたお皿を最初に取る→LIFO
キュー:「行列に並ぶ」イメージ。最初に並んだ人が最初にサービスを受ける→FIFO
「LIFO=スタック、FIFO=キュー」は試験で毎回といってよいほど出題されます。
木構造の中でも特に重要な「二分探索木」は、各ノードについて「左の子 < 親ノード < 右の子」という順序性を持ちます。この性質により、探索・挿入・削除をO(log n)で効率よく行えます(バランスが保たれている場合)。バランスが崩れた場合(一方向に偏った木)はO(n)になり効率が悪化します。
ソートアルゴリズムの種類と計算量——5手法の徹底比較
ソート(整列)アルゴリズムはデータを特定の順序(昇順・降順)に並べ替える処理です。どのアルゴリズムを使うかによって計算時間が大きく異なります。診断士試験では各手法の特徴と計算量(O記法)を問う問題が出題されます。
| アルゴリズム | 動作原理 | 平均計算量 | 最悪計算量 | 安定性 |
|---|---|---|---|---|
| バブルソート | 隣接する要素を比較・交換して、大きいものを末尾へ「浮かび上がらせる」 | O(n²) | O(n²) | 安定 |
| 選択ソート | 未整列部分から最小値を見つけ、先頭要素と交換する操作を繰り返す | O(n²) | O(n²) | 不安定 |
| 挿入ソート | 未整列部分の先頭要素を、整列済み部分の適切な位置に挿入する | O(n²) | O(n²) | 安定 |
| クイックソート | 基準値(ピボット)を選び、小さいグループ・大きいグループに分割して再帰的にソート | O(n log n) | O(n²) | 不安定 |
| マージソート | 配列を半分に分割し続け、整列済みのものを順序を保ちながら結合(マージ)する | O(n log n) | O(n log n) | 安定 |
- バブル・選択・挿入ソートは「単純だが遅い」O(n²)の手法群
- クイックソートは平均的に最速(O(n log n))だが、最悪ケースでO(n²)になることがある
- マージソートは「常にO(n log n)」で安定しており、大量データに適する
- 実用的なプログラミング言語の標準ライブラリでは、クイックソートとマージソートを組み合わせた「ティムソート」などが使われる
例:[5, 3, 8, 1, 2] をバブルソートで昇順に整列する場合:
パス2:[3,5,1,2,8]→[3,1,5,2,8]→[3,1,2,5,8](5が所定の位置へ)
…繰り返して最終的に[1,2,3,5,8]
n個の要素に対してn-1回のパスが必要で、各パスでn-1回の比較を行います。合計比較回数はn(n-1)/2回≈O(n²)となります。
同じ値を持つ要素が複数ある場合に、元の順序が保たれるソートを「安定ソート」と呼びます。例えば「成績でソートしたリストを氏名でソートしたとき、同じ氏名の人の成績順が保たれるかどうか」です。バブルソート・挿入ソート・マージソートは安定。選択ソート・クイックソートは不安定です。
探索アルゴリズム——線形探索と二分探索
探索(サーチ)アルゴリズムとは、データの集合の中から特定のデータを見つける手順です。線形探索と二分探索の違いを理解することが診断士試験の重要ポイントです。
データを先頭から順番に1つずつ比較して目的のデータを探す。
- 計算量:O(n)(最悪ケース:全件確認)
- 前提条件:なし(整列不要)
- 長所:シンプル・どんなデータにも使える
- 短所:データ量が多いと遅い
整列済みのデータを中央から半分ずつに絞り込んで探す。
- 計算量:O(log n)(1回の比較で範囲が半分に)
- 前提条件:データが整列されていること
- 長所:大量データでも高速
- 短所:整列済みデータにしか使えない
100万件のデータから1件を探す場合:
- 線形探索:最悪1,000,000回の比較が必要
- 二分探索:最大20回の比較で見つかる(log₂(1,000,000) ≈ 20)
この差が「O(n)とO(log n)の違い」の本質です。
整列済み配列 [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] から「11」を探す場合:
②中央値 = 右半分の中央(index:7→値:15)→ 11 < 15 なので左半分へ
③中央値 = (index:5→値:11)→ 一致!→ 3回で発見
計算量の表記——O記法(ビッグオー記法)の読み方
O記法(Big-O Notation)とは、アルゴリズムの計算量(実行時間・メモリ使用量)をデータ量nの関数として表す記法です。定数倍・低次項は無視し、支配的な項のみを残します。
| 記法 | 名称 | 特徴・意味 | 具体例 |
|---|---|---|---|
| O(1) | 定数時間 | データ量に関係なく常に一定時間 | 配列のインデックスアクセス |
| O(log n) | 対数時間 | データが倍増しても処理時間は少量増加 | 二分探索・二分木探索 |
| O(n) | 線形時間 | データ量に比例して処理時間が増加 | 線形探索・リストの走査 |
| O(n log n) | 線形対数時間 | 効率的なソートの標準的な計算量 | クイックソート(平均)・マージソート |
| O(n²) | 2乗時間 | データが2倍になると処理時間は4倍 | バブルソート・選択ソート・挿入ソート |
| O(2ⁿ) | 指数時間 | データが1増えるごとに処理時間が2倍 | 総当たり探索・一部の最適化問題 |
データ量nが1,000の場合の比較:
- O(1):1回
- O(log n):約10回
- O(n):1,000回
- O(n log n):約10,000回
- O(n²):1,000,000回(100万回!)
試験では「O(n log n)はO(n²)より効率的」という認識さえあれば十分です。
・バブル・選択・挿入ソート=O(n²)(遅い3兄弟)
・クイック・マージソート(平均・最悪)=O(n log n)(速い2手法)
・二分探索=O(log n)(整列済みデータ前提)
・線形探索=O(n)(整列不要だが遅い)
木構造の詳細——二分木・ヒープ・B木
木構造(Tree)はデータベース・ファイルシステム・AIの決定木など、実務でも頻繁に登場するデータ構造です。試験では二分木の基本用語と特性が問われます。
| 用語 | 意味 |
|---|---|
| 根(ルート) | 木の最上位ノード。親を持たない唯一のノード。 |
| 節(ノード) | 木を構成する各要素。データと子へのポインタを持つ。 |
| 葉(リーフ) | 子を持たない末端ノード。 |
| 深さ(Depth) | ルートからそのノードまでの辺の数。 |
| 高さ(Height) | ルートから最も遠い葉までの辺の数。 |
| 二分木 | 各ノードが最大2つの子(左の子・右の子)を持つ木。 |
完全二分木の一種。最大ヒープでは「親 ≥ 子」の関係が保たれ、ルートに常に最大値が来ます。優先度キューの実装に使われます。ヒープソートはこの構造を利用したO(n log n)のソート手法です。
データベースのインデックスに使われる多分岐木。ディスクI/Oを最小化するため、各ノードに複数のキーを持ちます。RDBMSのインデックス構造として広く採用されています。
グラフとネットワーク——有向グラフ・無向グラフ
グラフ(Graph)はノード(頂点)とエッジ(辺)で構成されるデータ構造です。木構造はグラフの特殊な形です。ルートを持ち、閉路のない連結グラフが「木」です。
| 種類 | 特徴 | 実用例 |
|---|---|---|
| 無向グラフ | 辺に方向性がない(双方向) | SNSの友人関係・鉄道路線図 |
| 有向グラフ | 辺に方向性がある(一方向) | Webページのリンク・ワークフロー |
| 重み付きグラフ | 辺にコスト(距離・時間等)が付いている | カーナビの最短経路・物流ネットワーク |
幅優先探索(BFS:Breadth First Search):ルートから同じ深さのノードを優先して探索。最短経路問題に適用。キューを使って実装。
深さ優先探索(DFS:Depth First Search):一つのパスを可能な限り深く探索してから戻る。迷路の解法・トポロジカルソートに適用。スタックまたは再帰で実装。
PERT(Program Evaluation and Review Technique)はプロジェクト管理でよく使われる有向グラフです。作業間の依存関係を有向グラフで表し、クリティカルパス(最長経路)を求めることでプロジェクトの最短完了時間と管理すべきボトルネック作業を特定します。診断士の2次試験でも関連問題が出ます。
試験頻出ポイントのまとめ——ここを押さえれば得点できる
| データ構造 | アクセス方式 | 得意操作 | 試験キーワード |
|---|---|---|---|
| 配列 | インデックス(ランダム) | 高速検索 | 連続メモリ・固定サイズ |
| スタック | LIFO(後入れ先出し) | プッシュ・ポップ | 関数呼び出し・アンドゥ |
| キュー | FIFO(先入れ先出し) | エンキュー・デキュー | 順番待ち・印刷スプール |
| 木 | 階層的 | 探索・整列 | ルート・葉・深さ・高さ |
| グラフ | ポインタ(任意) | 関係表現・経路探索 | 有向・無向・重み付き |
| 手法 | 平均 | 最悪 | 安定性 | 特徴 |
|---|---|---|---|---|
| バブルソート | O(n²) | O(n²) | 安定 | 最もシンプルだが最も遅い |
| 選択ソート | O(n²) | O(n²) | 不安定 | 交換回数が少ない |
| 挿入ソート | O(n²) | O(n²) | 安定 | ほぼ整列済みなら高速 |
| クイックソート | O(n log n) | O(n²) | 不安定 | 平均最速・最悪ケースに注意 |
| マージソート | O(n log n) | O(n log n) | 安定 | 常に安定・大量データ向き |
よくある疑問——FAQ
アルゴリズムとデータ構造は、経営情報システムの中で最も「考える力」が試される分野です。スタック(LIFO)とキュー(FIFO)の区別、ソートアルゴリズムの計算量比較、O記法の直感的な理解——この3点を押さえるだけで、試験での得点力が大幅に上がります。実際のシステム開発現場でも「どのデータ構造・アルゴリズムを使うか」の判断は日常的に求められるスキルです。診断士として顧客のITシステム改善を支援する際にも、この知識が土台となります。









