プログラミング・アルゴリズムまとめ|オブジェクト指向・探索・整列・計算量を図解で整理

QUESTION

Googleの検索結果は、どうやって「あの順番」に並んでいるのでしょう。

何百億ものページを瞬時に並べ直す裏側には、アルゴリズムという「処理の手順書」があります。診断士試験の経営情報システム科目では、そのアルゴリズムの仕組みと、プログラムを書くための基礎知識が問われます。難しそうに見えますが、考え方さえ押さえれば得点源になる分野です。

プログラミングとアルゴリズムは、経営情報システム科目の中でも「なんとなく苦手」と感じやすい分野です。でも試験で問われるのは、コードを書ける力ではなく「仕組みを読み取る力」です。プログラミング言語の分類からオブジェクト指向・アルゴリズムの種類・計算量・データ構造・フローチャートまで、一つひとつ丁寧に整理していきましょう。

目次

プログラミング言語の分類

プログラミング言語は、コンピュータがどれだけ直接理解できるかという観点で階層に分かれています。試験では「コンパイラとインタプリタの違い」が頻出です。

LOW LEVEL
機械語(マシン語)
CPUが直接理解できる0と1の2進数で記述された言語。人間には読みにくいが、処理は最速。すべてのプログラムは最終的に機械語に変換される。
MID LEVEL
アセンブリ言語
機械語の命令をMOV・ADDなどの英字略語(ニーモニック)で表したもの。アセンブラというツールで機械語に変換する。ハードウェアに近い制御が必要な場面で使われる。
HIGH LEVEL
高水準言語
人間が読み書きしやすい文法で書かれた言語。C言語・Java・Python・JavaScriptなど。機械語への変換方法によってコンパイラ型インタプリタ型に分かれる。
コンパイラ:ソースコード(プログラム全体)を一括で機械語に変換し、実行ファイルを生成する。変換後は高速に動作する。代表例:C言語・Java(バイトコード)・Fortran

インタプリタ:ソースコードを1行ずつ読み取り、その場で解釈しながら実行する。実行ファイルは生成しない。変換と実行が同時進行するため起動は手軽だが、実行速度はコンパイラより遅い傾向がある。代表例:Python・JavaScript・Ruby
コンパイラ型(C言語・Javaなど)
項目内容
変換タイミング実行前に一括変換
実行速度速い(変換済みを実行)
実行ファイル生成される(.exe等)
エラー検出コンパイル時に全体をチェック
移植性環境ごとにコンパイルが必要
インタプリタ型(Python・JSなど)
項目内容
変換タイミング実行時に1行ずつ
実行速度やや遅い(都度解釈)
実行ファイル生成されない
エラー検出実行中にその行で発覚
移植性インタプリタがあれば動く

オブジェクト指向の3原則

オブジェクト指向は、プログラムを「もの(オブジェクト)の集まり」として設計する考え方です。試験ではカプセル化・継承・ポリモーフィズムの3原則の定義と具体例が問われます。

オブジェクト(Object):データ(属性)と処理(メソッド)をひとまとめにしたもの。例えば「自動車」というオブジェクトは「色・スピード」というデータと「走る・止まる」という処理を持つ。
クラス(Class):オブジェクトの設計図。クラスから実際のオブジェクト(インスタンス)を生成する。
ENCAPSULATION
カプセル化(情報隠蔽)
データと処理を一つのオブジェクトにまとめ、外部から直接変更できないようにすること。

身近な例:自動販売機の内部構造は見えないが、ボタンを押せば缶が出てくる。「どう動くか」を知らなくても使える状態にするのがカプセル化。
INHERITANCE
継承(is-a 関係)
既存のクラス(親クラス)の特性を引き継いで、新しいクラス(子クラス)を作ること。

身近な例:「乗り物」クラスを継承して「自動車」「自転車」クラスを作る。「自動車 is-a 乗り物」が成り立つ関係。共通の機能は親クラスにまとめ、個別の機能を子クラスに追加する。
POLYMORPHISM
ポリモーフィズム(多態性)
同じ命令(メソッド名)でも、オブジェクトの種類に応じて異なる動作をすること。

身近な例:「話しかける」という同じ操作でも、犬は「ワン」と返し、猫は「ニャー」と返す。呼び出す側は中身の違いを意識しなくてよい。

主要なアルゴリズムの種類

アルゴリズムとは「問題を解くための手順」のことです。試験では探索(サーチ)整列(ソート)の代表的なアルゴリズムについて、動作原理と計算量の違いが問われます。

探索アルゴリズム:データの集合から目的の値を見つけ出す処理。
整列(ソート)アルゴリズム:データを昇順・降順などの順番に並べ替える処理。
どちらも「何回比較・移動が必要か」を計算量(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件のとき)

O(1)
常に1回。例:ハッシュ表の検索
O(log n)
約10回。例:二分探索(2¹⁰=1024)
O(n)
1,000回。例:線形探索
O(n log n)
約10,000回。例:クイックソート(平均)
O(n²)
1,000,000回。例:バブルソート

データ構造

データ構造とは、データをどのように格納・管理するかの「形式」のことです。目的に合ったデータ構造を選ぶことで、処理を効率化できます。試験では各構造の特徴と適切な使い場面を理解しておく必要があります。

スタック
Stack
後入れ先出し(LIFO)。最後に積んだものを最初に取り出す。お皿の重ね置きをイメージ。

用途:関数の呼び出し管理、「元に戻す」機能(Undo)、ブラウザの戻るボタン
キュー
Queue
先入れ先出し(FIFO)。最初に追加したものを最初に取り出す。コンビニのレジ待ちをイメージ。

用途:印刷待ち(スプーラ)、タスクの処理順管理
リスト
Linked List
各要素が次の要素へのポインタ(番地の参照)を持つ構造。途中への挿入・削除が得意。

配列と違い、メモリ上で連続していなくてもよい。ただし任意の場所へのアクセスは遅い。
木構造
Tree
根(ルート)から枝分かれする階層構造。フォルダ構造や組織図に似た形。

二分探索木は検索・挿入が効率的(O(log n))。ファイルシステム・XMLなどに活用される。
ハッシュ表
Hash Table
ハッシュ関数でキーを変換し、対応する場所にデータを格納。検索がO(1)で非常に高速。

辞書・連想配列・データベースのインデックスに活用。キーの衝突(コリジョン)への対処が課題。
データ構造 アクセス方式 検索 挿入・削除 試験で問われる特徴
配列(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) 最も高速な検索。衝突への対処が必要

フローチャートと擬似言語

試験の経営情報システム科目では、フローチャートや擬似言語(疑似コード)を読み取る問題が頻出です。コードの内容を理解するのではなく、「この処理はどういう条件で繰り返すか」「何の値を返すか」を読み解く力が求められます。

FLOWCHART
フローチャートの図形記号
長方形(処理):代入・計算など一般的な処理
ひし形(判断):条件分岐(YES/NO)
平行四辺形(入出力):データの入力・出力
楕円(端子):開始・終了
矢印(流れ線):処理の順序・流れ方向
PSEUDO CODE
擬似言語の主要な構文
if ~ then ~ else:条件分岐(もし〜なら〜、そうでなければ〜)
while ~ do:条件を満たす間、繰り返す(前判定ループ)
do ~ while:処理後に条件を判定(後判定ループ。最低1回は実行)
for i ← 1 to n:変数を1からnまで変化させながら繰り返す
return:値を返して処理を終了する

擬似言語の例|1からnまでの合計を求める処理

/* 1からnまでの合計を求める関数 */ function 合計(n) i1 /* カウンタ変数の初期化 */ sum0 /* 合計値の初期化 */ while in do /* iがn以下の間ループ */ sumsum + i /* sumにiを加算 */ ii + 1 /* iを1増やす */ end while return sum /* 結果を返す */ end function
読み方のコツ: 変数の「今の値」を追いかけながら読む。上の例では n=5 のとき、i が1→2→3→4→5 と変わるたびに sum が 1→3→6→10→15 と増えていく。while の条件「i ≤ n」が偽になった時点(i=6)でループを抜け、sum=15 が返る。

試験問題では「n=4のとき sum の値は何か」という穴埋め形式が多い。変数の変化を表に書き出すトレース法が有効。
U

フローチャートや擬似言語の問題で悩んだときは、具体的な小さい数値(n=3や n=4)を代入して実際にトレースしてみるのが一番確実だと感じています。抽象的に読もうとするより、手を動かしながら変数の値を追っていくほうが圧倒的にミスが減ります。

過去問で確認する

実際の試験形式に近い練習問題で、理解度を確認しておきましょう。フローチャート・計算量・オブジェクト指向の3テーマから各1問です。

練習問題 1|フローチャートの穴埋め 経営情報システム|基本レベル
次の擬似言語を実行したとき、n = 6 のとき変数 result の値として最も適切なものを選びなさい。

result ← 1
i ← 1
while i ≤ n do
    result ← result × i
    i ← i + 1
end while
  • ア 21
  • イ 36
  • ウ 720
  • エ 1296
解説
正解はウ(720)です。result に i を掛け続ける処理なので、n の階乗(n!)を計算しています。
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。トレース表を書くと確実に追えます。
練習問題 2|計算量とアルゴリズムの組み合わせ 経営情報システム|基本レベル
アルゴリズムの計算量に関する記述として、最も適切なものを選びなさい。
  • ア 線形探索の計算量はO(log n)であり、データ件数が2倍になっても比較回数は1回しか増えない
  • イ バブルソートの計算量はO(n log n)であり、クイックソートと同等の効率を持つ
  • ウ 二分探索の計算量はO(log n)であり、データがソート済みであることを前提として先頭から探すよりも大幅に効率が高い
  • エ クイックソートの最悪計算量はO(n log n)であり、常に安定した性能を発揮する
解説
正解はです。二分探索はデータをソート済みにした上で中央値と比較し、探索範囲を半分に絞り込む手法です。計算量はO(log n)となり、1,000件のデータでも最大10回(2¹⁰=1024)の比較で見つかります。
ア:線形探索はO(n)。O(log n)は二分探索の特徴です。
イ:バブルソートはO(n²)。O(n log n)はクイックソートやマージソートです。
エ:クイックソートの最悪計算量はO(n²)です。ピボットの選び方が偏るとこの状態になります。
練習問題 3|オブジェクト指向の用語 経営情報システム|応用レベル
オブジェクト指向プログラミングに関する記述として、最も適切なものを選びなさい。
  • ア カプセル化とは、既存のクラスの機能を引き継いで新しいクラスを定義することであり、コードの再利用性を高める
  • イ 継承とは、同じメソッド名でも呼び出すオブジェクトの種類によって異なる処理が実行されることであり、プログラムの柔軟性を高める
  • ウ ポリモーフィズム(多態性)とは、同一のインタフェース(メソッド名)に対して、オブジェクトの型によって異なる実装が実行される仕組みであり、処理の差し替えが容易になる
  • エ クラスとは、クラスから生成される実体(実際のデータを持つもの)であり、インスタンスとも呼ばれる
解説
正解はです。ポリモーフィズムは「同じ命令を送っても、受け取るオブジェクトによって動作が変わる」仕組みです。例えば「音を出す」というメッセージに対し、犬は「ワン」、猫は「ニャー」と応答します。
アは継承の説明です。カプセル化は「データと処理をまとめ、外部から直接アクセスさせない」こと。
イはポリモーフィズムの説明。継承は「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)で効率的な検索が可能
  • 擬似言語の読み取りは「具体的な数値でトレース」が最も確実な解法
  • フローチャートの図形:長方形(処理)・ひし形(判断)・楕円(端子)を確実に覚える
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次