第 11 章 アルゴリズムとデータ構造
並べる・探す・しまう。この章では次の 16 個の知識点を、解説・インタラクティブ教材・練習問題で学びます。
アルゴリズムと流れ図・基本 3 構造
アルゴリズムは問題を解く手順、プログラムはそれをコンピュータ向けの言語で書いたもの。手順は流れ図で表し、どんなアルゴリズムも 順次・選択・繰返し の 3 つの組合せで書ける。流れ図の問題は、変数の値を表にして追う(トレース)のが基本。
配列(1 次元・2 次元と添字)
配列は同じ型のデータを入れる箱を並べたもの。各箱は添字(要素番号)で指定する:1 次元は List[4]、2 次元は List2[行, 列]。添字が 0 から始まるか 1 から始まるかは問題文の指定に従う(科目 B の擬似言語は 1 から)。
リスト(ポインタ・単方向 / 双方向)
リストは、各データに「次のデータの場所(ポインタ)」を持たせて数珠つなぎにしたデータ構造。挿入・削除はポインタを付け替えるだけで、他のデータを移動しなくてよい。双方向リストは「次」と「前」の 2 つのポインタを持つ。
キューとスタック
キューは先に入れたものから出す(FIFO:待ち行列)、スタックは後に入れたものから出す(LIFO:積み重ね)。スタックに入れる操作を PUSH、取り出す操作を POP という。
木構造(2 分木・2 分探索木・ヒープ)
木構造は階層でデータを持つ。一番上が根、子をもたない節が葉。2分探索木は 左の子 < 親 < 右の子、ヒープは 親 ≧ 子(または親 ≦ 子) が常に成り立つ 2 分木。ヒープは配列で表すと [i] の子が [2i]・[2i+1]。
線形探索法(番兵を含む)
線形探索法は先頭から 1 つずつ順に比べて探す方法。データが整列されていなくても使えるが、比較回数は平均で約 n/2、最大 n 回(O(n))。番兵を末尾に置くと「配列の終わりか」の判定を省ける。
2 分探索法
2分探索法は、整列済みのデータの真ん中と比べ、目的のデータがある側の半分だけを残すことを繰り返す探索法。比較のたびに候補が半分になるので、最大比較回数は約 (⌊log₂n⌋ + 1 回)。
ハッシュ探索法(ハッシュ関数・シノニム)
ハッシュ探索法は、データからハッシュ関数で格納位置を計算し、その位置を直接見に行く方法。データ数に関係なくほぼ 1 回で見つかる(O(1))。異なるデータが同じ位置になることを衝突(コリジョン)といい、そのデータをシノニムという。
基本交換法(バブルソート)
基本交換法は隣り合う 2 つを比べ、順序が逆なら交換することを繰り返す整列法。1 周するごとに端に 1 つ値が確定する(泡が浮かぶように移動するのでバブルソート)。計算量は O(n²)。
基本選択法(選択ソート)
基本選択法は、未整列部分から最大(最小)値を選び、未整列部分の先頭と交換することを繰り返す整列法。1 周ごとに先頭側に 1 つ確定する。比較回数は n(n−1)/2 で O(n²)、交換は 1 周に 1 回だけ。
基本挿入法(挿入ソート)
基本挿入法は、整列済みの部分に、次のデータを正しい位置へ挿入することを繰り返す整列法。最悪 O(n²) だが、データがほぼ整列済みなら非常に速い(ずらす回数が少ない)。
シェルソート
シェルソートは、一定の間隔ごとに取り出したグループ内で並べ替え、間隔を狭めて 1 になるまで繰り返す整列法。最初に大まかに整えておくので、最後の間隔 1(普通の挿入法)が速く終わる。基本挿入法の改良版。
クイックソート
クイックソートは、基準値(ピボット)を選び、それより小さいグループと大きいグループに分けることを、グループが 1 個になるまで繰り返す(再帰)整列法。平均 O(n log n) で実用上とても速い。
ヒープソート
ヒープソートは、データをヒープ(親 ≧ 子の 2 分木)にして根(最大値)を取り出し、一番下の葉を根に移してヒープを作り直すことを繰り返す整列法。O(n log n)。配列では [i] の子が [2i]・[2i+1]。
マージソート
マージソートは、データが 1 個になるまで半分に分割し、整列しながら併合(マージ)して元に戻す整列法。併合は「2 つの列の先頭どうしを比べ、小さい(大きい)方から取る」だけ。O(n log n)。
計算量とオーダー記法
計算量は、データ量 n が増えたときに処理回数がどう増えるかを表す。オーダー記法では最も増え方の大きい項だけを残す()。探索:線形 O(n)・2 分 O(log n)・ハッシュ O(1)。整列:基本 3 手法 O(n²)・クイック / ヒープ / マージ O(n log n)。