テクノロジ系アルゴリズムとプログラミング出題頻度 ★★

探索と整列

データを探す「探索」と並べ替える「整列」の代表的なアルゴリズムを、辞書引きとトランプの並べ替えで図解。線形探索と2分探索の比較回数、バブルソート・選択ソート・挿入ソートなどの手順の違いがわかり、試験の四択が解けるようになります。

この単元の用語:アルゴリズム / 線形探索 / 2分探索 / ハッシュ / 整列(ソート) / バブルソート / 選択ソート / 挿入ソート / クイックソート / マージソート

アルゴリズムって、すごく難しいプログラムのことですか?

実は「問題を解くための手順」のことなんだ。中でも定番が「データを探す」と「データを並べ替える」。辞書を引くときやトランプを並べるとき、みんな無意識に使っているよ。

探索と整列とは

  • 探索(サーチ):たくさんのデータの中から、目的のデータを見つけること
  • 整列(ソート):データを小さい順(昇順)や大きい順(降順)に並べ替えること

同じ結果を得るにも、手順によって かかる手間(比較の回数) が大きく変わります。試験では、その違いが問われます。

線形探索:先頭から1つずつ

線形探索 は、データを 先頭から順番に1つずつ 調べる方法です。本棚の端から1冊ずつ背表紙を見ていくイメージです。

  • 長所:データが並んでいなくても使える。手順が単純
  • 短所:データが多いと時間がかかる

データが n 件のとき(目的のデータが必ずある場合)

  • 最大の比較回数:n 回(いちばん最後にあった場合)
  • 平均の比較回数:約 n/2 回

2分探索:真ん中で比べて半分を捨てる

2分探索 は、整列済みのデータ に対して、真ん中の値と比べて、探す範囲を半分に絞り込む ことをくり返す方法です。国語辞典を真ん中あたりで開き、「探したい言葉はもっと後ろだ」と半分を捨てていくのと同じです。

探す値:58(15個のデータは小さい順に整列済み) 3 8 12 15 21 27 33 40 46 52 58 63 71 80 94 ① 中央の40と比べる → 58の方が大きいので右半分へ 3 8 12 15 21 27 33 40 46 52 58 63 71 80 94 ② 中央の63と比べる → 58の方が小さいので左半分へ 3 8 12 15 21 27 33 40 46 52 58 63 71 80 94 ③ 中央の52と比べる → 58の方が大きいので右へ 3 8 12 15 21 27 33 40 46 52 58 63 71 80 94 ④ 58と一致 → 4回の比較で発見!
灰色は候補から外れたデータ。比較のたびに候補がほぼ半分になる

15件のデータでも、最大4回の比較で見つかります。データが2倍になっても、比較回数は 1回増えるだけ です。

2分探索の最大比較回数 の求め方

「2k ≦ データ件数 < 2k+1」となる k を探し、k + 1 回

  • 15件:23=8 ≦ 15 < 16 → 3 + 1 = 4回
  • 100件:26=64 ≦ 100 < 128 → 6 + 1 = 7回
  • 1,000件:29=512 ≦ 1,000 < 1,024 → 9 + 1 = 10回

2分探索は データが整列されていないと使えない。バラバラのデータに使うには、先に整列する手間がかかる。

ハッシュ法

ハッシュ法 は、データの値から計算式(ハッシュ関数)で 格納場所を直接求める 方法です。うまく働けば1回の計算で目的の場所がわかりますが、別のデータが同じ格納場所になる 衝突 への対策が必要です(同じ場所になるデータどうしを シノニム といいます)。

整列の代表的な方法

6 2 9 4 6 > 2 → 交換 2 6 9 4 6 < 9 → そのまま 2 6 9 4 9 > 4 → 交換 2 6 4 9 最大の9が右端に確定
バブルソートの1回目の走査。隣どうしを比べて、大きい方を右へ送っていく
方法手順のイメージ身近な例え
バブルソート(交換法)隣り合う2つを比べ、順番が逆なら交換。これをくり返す泡(バブル)が水面に浮かぶように、大きい値が端へ移動する
選択ソート(選択法)未整列の中から最小値を選んで、先頭と交換する背の順で、残った中で一番低い人を前に呼ぶ
挿入ソート(挿入法)整列済みの部分の正しい位置に、次のデータを挿入するトランプの手札を、1枚ずつ正しい位置に差し込む
クイックソート基準値を決め、それより小さいグループと大きいグループに分けることをくり返すクラスを「150cm未満」「以上」に分け、さらに細かく分ける
マージソートデータを細かく分割し、整列しながら併合(マージ)する2つの整列済みの山を、先頭から比べて1つにまとめる

選択ソート で 6, 2, 9, 4 を小さい順に

  1. 全体の最小値 2 を先頭の 6 と交換 → 2, 6, 9, 4
  2. 残り(6, 9, 4)の最小値 4 を 6 と交換 → 2, 4, 9, 6
  3. 残り(9, 6)の最小値 6 を 9 と交換 → 2, 4, 6, 9(完了)

バブルソートと選択ソートの区別がつきません…。

バブルソートは「隣どうし」だけを比べて、こまめに交換する。選択ソートは「残り全体から最小値を探して」、1回だけ交換する。キーワードは「隣」か「最小」かだよ。

一般に、データ件数が多いときは クイックソート や マージソート の方が、バブル・選択・挿入ソートより速く整列できます。

試験に出るポイント

  • 線形探索:先頭から順に。最大 n 回、平均 約 n/2 回。整列していなくても使える
  • 2分探索:整列済みが前提。中央と比べて半分を捨てる。最大の比較回数は件数が2倍になっても1回増えるだけ
  • ハッシュ法:計算で格納場所を求める。同じ場所になる衝突に注意
  • バブルソート=隣どうしを交換、選択ソート=最小値を選んで交換、挿入ソート=正しい位置に差し込む
  • クイックソート=基準値で分割、マージソート=分割して併合

確認クイズ

選択肢をタップすると、すぐに正解と解説が表示されます。

Q1小さい順に整列された1,000件のデータから、2分探索で目的のデータを探す。比較回数は最大で何回か。

Q21,000件のデータの中に目的のデータが必ず1件ある。線形探索で先頭から探すとき、平均の比較回数はおよそ何回か。

Q32分探索を行うための前提条件として、適切なものはどれか。

Q4データ 5, 3, 8, 1 を、バブルソートで小さい順に並べる。先頭から順に隣り合う2つを比べ、左の方が大きければ交換する操作を、末尾まで1回行った後の並びはどれか。