アルゴリズムとデータ構造 | 中小企業診断士1次試験 経営情報システム

U
U

「スタックとキューってどっちがLIFOだっけ?」——経営情報システムで最も混乱しやすい部分です。でも実生活のたとえで考えると、一度覚えたら絶対に忘れなくなりますよ。

目次

アルゴリズムとは何か——問題を解く手順の設計

アルゴリズム(Algorithm)とは、ある問題を解くための手順・手続きを明確に定義したものです。コンピュータが理解できるよう、曖昧さなく定義された有限の手順の集まりを指します。

「どのようなアルゴリズムを選ぶか」によって、同じ問題を解くときの計算時間・メモリ使用量が劇的に変わります。診断士試験では、基本的な制御構造・代表的なソートアルゴリズム・データ構造の特性を問う問題が出題されます。

🎯 この記事で押さえるポイント
  • アルゴリズムの3つの基本制御構造(順次・選択・反復)
  • 主要なデータ構造(配列・スタック・キュー・木・グラフ)の特性
  • ソートアルゴリズム5種の特徴と計算量の比較
  • 探索アルゴリズム(線形探索・二分探索)の違い
  • O記法(ビッグオー記法)の読み方と実用的な意味

アルゴリズムの3つの基本制御構造

どんな複雑なプログラムも、以下の3つの制御構造の組み合わせで記述できるとされています。これは「構造化プログラミング」の基本原則であり、プログラムの可読性・保守性を高めます。

① 順次(Sequence)

処理を上から下へ順番に実行する。最も基本的な制御構造。「AをしてからBをする」という形式。

処理A
処理B
処理C
② 選択(Selection)

条件に応じて実行する処理を分岐する。IF文やCASE文がこれにあたる。「条件が成立すればAを、そうでなければBをする」。

IF 条件 THEN
  処理A
ELSE
  処理B
END IF
③ 反復(Iteration)

条件が満たされている間(または指定回数)、同じ処理を繰り返す。WHILE文・FOR文・DO WHILE文などがこれにあたる。

WHILE 条件 DO
  処理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
「LIFO=スタック、FIFO=キュー」は試験で毎回といってよいほど出題されます。
二分探索木(BST:Binary Search Tree)

木構造の中でも特に重要な「二分探索木」は、各ノードについて「左の子 < 親ノード < 右の子」という順序性を持ちます。この性質により、探索・挿入・削除を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] をバブルソートで昇順に整列する場合:

パス1:[3,5,8,1,2]→[3,5,8,1,2]→[3,5,1,8,2]→[3,5,1,2,8](8が末尾へ)
パス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²)となります。

⚠️ 「安定ソート」とは何か
同じ値を持つ要素が複数ある場合に、元の順序が保たれるソートを「安定ソート」と呼びます。例えば「成績でソートしたリストを氏名でソートしたとき、同じ氏名の人の成績順が保たれるかどうか」です。バブルソート・挿入ソート・マージソートは安定。選択ソート・クイックソートは不安定です。

探索アルゴリズム——線形探索と二分探索

探索(サーチ)アルゴリズムとは、データの集合の中から特定のデータを見つける手順です。線形探索と二分探索の違いを理解することが診断士試験の重要ポイントです。

線形探索(Linear Search)

データを先頭から順番に1つずつ比較して目的のデータを探す。

  • 計算量:O(n)(最悪ケース:全件確認)
  • 前提条件:なし(整列不要)
  • 長所:シンプル・どんなデータにも使える
  • 短所:データ量が多いと遅い
二分探索(Binary Search)

整列済みのデータを中央から半分ずつに絞り込んで探す。

  • 計算量: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」を探す場合:

①中央値 = 10番目の中央 = 10(index:4→値:9)→ 11 > 9 なので右半分へ
②中央値 = 右半分の中央(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倍総当たり探索・一部の最適化問題
📌 O記法の直感的な理解

データ量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記法で覚えるべき組み合わせ
・バブル・選択・挿入ソート=O(n²)(遅い3兄弟)
・クイック・マージソート(平均・最悪)=O(n log n)(速い2手法)
・二分探索=O(log n)(整列済みデータ前提)
・線形探索=O(n)(整列不要だが遅い)

木構造の詳細——二分木・ヒープ・B木

木構造(Tree)はデータベース・ファイルシステム・AIの決定木など、実務でも頻繁に登場するデータ構造です。試験では二分木の基本用語と特性が問われます。

木構造の基本用語
用語意味
根(ルート)木の最上位ノード。親を持たない唯一のノード。
節(ノード)木を構成する各要素。データと子へのポインタを持つ。
葉(リーフ)子を持たない末端ノード。
深さ(Depth)ルートからそのノードまでの辺の数。
高さ(Height)ルートから最も遠い葉までの辺の数。
二分木各ノードが最大2つの子(左の子・右の子)を持つ木。
ヒープ(Heap)

完全二分木の一種。最大ヒープでは「親 ≥ 子」の関係が保たれ、ルートに常に最大値が来ます。優先度キューの実装に使われます。ヒープソートはこの構造を利用したO(n log n)のソート手法です。

B木(B-Tree)

データベースのインデックスに使われる多分岐木。ディスク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

Q1. スタックとキューを実生活でどう区別すればよいですか?
スタック=「お皿の積み重ね」。食器棚に積まれたお皿は、一番上(最後に乗せた)ものから取ります→LIFO(後入れ先出し)。キュー=「コンビニのレジ行列」。最初に並んだ人が最初に会計を済ます→FIFO(先入れ先出し)。この2つのイメージを持つだけで試験の引っかけに対応できます。
Q2. クイックソートの最悪ケースはなぜO(n²)になるのですか?
クイックソートは「ピボット(基準値)」を選んで分割する手法ですが、ピボットとして常に最大値または最小値が選ばれると、分割が「1対n-1」に偏ります。この場合、n回の分割が必要になり計算量がO(n²)となります。例えば既にほぼ整列済みのデータに先頭要素をピボットとして使うと、この最悪ケースが発生しやすくなります。乱数でピボットを選ぶ「ランダム化クイックソート」で回避できます。
Q3. 二分探索は必ず整列済みである必要がありますか?
はい、二分探索は「データが整列されていること」が前提条件です。中央値と目的値を比較して「左半分か右半分か」を判断するため、データが順序通りに並んでいないと正確に絞り込めません。整列されていないデータに対しては線形探索を使います。試験では「二分探索の前提条件」として「整列済みデータ」を答えられるようにしておきましょう。
Q4. O(n log n)はO(n²)よりどのくらい速いですか?
n=1,000の場合:O(n log n)≈10,000回、O(n²)≈1,000,000回。つまり100倍の差です。n=1,000,000の場合:O(n log n)≈20,000,000回、O(n²)≈1,000,000,000,000回(1兆回)。約5万倍の差になります。大量データになるほどアルゴリズム選択の重要性が増します。
Q5. 「安定ソート」はなぜ重要なのですか?
複数のキーでソートする場合に重要です。例えば「まず部署でソートし、次に氏名でソート」するとき、不安定ソートを使うと部署内の氏名の順序が保証されません。安定ソートを使えば「部署内での氏名順を保ちながら氏名でソート」が実現できます。マージソートは安定かつO(n log n)のため、実用的なシーンで広く使われます。
Q6. 木構造とグラフの違いは何ですか?
木はグラフの特殊な形です。具体的には「連結かつ閉路(ループ)がない有向グラフ(または無向グラフ)」が木になります。木は必ず根(ルート)を持ち、各ノードへの経路が唯一つに定まります。グラフは閉路があっても構わず、複数の経路が存在できます。組織図・ファイルシステムは木構造、SNSの友人関係・道路網はグラフとして表現されます。
Q7. アルゴリズムと実際のプログラムの違いは何ですか?
アルゴリズムは「問題を解く手順の概念的な記述」であり、特定のプログラミング言語に依存しません。同じアルゴリズムをPython・Java・C言語など異なる言語で実装できます。一方、プログラムは特定の言語構文に従って書かれた実行可能なコードです。診断士試験ではアルゴリズムの概念・特性を問う問題が中心で、特定言語の文法は問われません。

アルゴリズムとデータ構造は、経営情報システムの中で最も「考える力」が試される分野です。スタック(LIFO)とキュー(FIFO)の区別、ソートアルゴリズムの計算量比較、O記法の直感的な理解——この3点を押さえるだけで、試験での得点力が大幅に上がります。実際のシステム開発現場でも「どのデータ構造・アルゴリズムを使うか」の判断は日常的に求められるスキルです。診断士として顧客のITシステム改善を支援する際にも、この知識が土台となります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

中小企業診断士試験勉強中のアラフィフシングルマザーです。
大学卒業後から現在まで、数々の失敗をしながらずっと自営業として試行錯誤を重ねてきました。
もっときちんと経営やビジネスの知識を身につけて、将来は他の事業者の方のお役にも立てたらいいな、と思うようになり、中小企業診断士の試験に挑戦中です。

目次