07 探索のアルゴリズム

【知識】

多くのデータの中から目的の要素を探し出すこと。代表は3つ。

① 線形探索(sequential search)

先頭から順に1つずつ照合。未整列でもOKだが遅い。

② 2分探索(binary search)

整列済みの配列限定。中央と比べて探索範囲を毎回半分に絞る。

探す値 X = 10(整列済み配列)
A[1]5Low
A[2]7
A[3]10
A[4]12mid(中央)
A[5]15
A[6]18
A[7]20High
中央 A[4]=12 と X=10 を比較 → X が小さいので 探索範囲を左半分に絞る(High を A[3] へ)。これを繰返す。

③ ハッシュ表探索(hash)

キーをハッシュ関数で計算し、格納場所を直接求める。最速

計算量(オーダ)

計算量は「データの個数 n が増えたとき、処理の手間(比較回数など)がどれだけ増えるか」の目安。 細かい定数や小さい項を無視して「n が大きいとき一番効く部分」だけで表したものがオーダで、O( ) と書く。

オーダ増え方n を10倍にすると手間は
O(1)n に関係なく一定変わらない
O(log n)とても緩やかに増えるほんの少し(+数回)
O(n)n に比例約10倍

この章の3つの探索法

探索法平均比較回数オーダなぜそのオーダか
線形探索n/2O(n)先頭から順に見るので、最悪 n 個ぜんぶ確認
2分探索約 log₂nO(log n)1回の比較で範囲が半分になるので、半分にできる回数だけで済む
ハッシュ1O(1)計算で格納場所を直接求めるので、基本1回で届く
速さの順は ハッシュ > 2分探索 > 線形探索。ただし2分探索は「整列済み」、ハッシュは「表と関数の準備」が前提。

【演習】理解度チェック

Q1(H16春 問15)★線形探索の流れ図

配列 A の1〜N番目に整数が格納(N>1)。X と同じ値が何番目かを調べる、次の流れ図の実行結果として正しいものはどれか。

k ← 1 k ≦ N ? Yes No 見つからない A[k] = X ? Yes No 見つかった k ← k + 1
「見つかった」で止まったとき k は一致した位置、最後まで無いときは k = N+1
解説を表示

正解:ウ

変数 k は「今何番目を見ているか」。値が一致するとループを抜けるので、

▼速解法:線形探索は前から順。複数一致なら最初の位置で止まる。

過去問道場で確認

Q2 ★2分探索の最大探索回数

2分探索で、整列されているデータの個数が4倍になると、最大探索回数はどう変わるか。

解説を表示

正解:イ(2回増える)

2分探索は1回の比較でデータが半分になる。

▼速解法:データが2倍 → 1回増える を基準に。4倍=2²倍だから2回、8倍なら3回。(最大探索回数 ≒ log₂n の関係)

▼ 解説つきの類題を探す:過去問道場・分野別「アルゴリズム」

Q3(H27春 問6)★2分探索の計算量オーダ

整列済みの n 個のデータから、2分探索で要素を探すときの計算量のオーダはどれか。

解説を表示

正解:ア(O(log n))

1回の比較で範囲が半分になる。n を 1 になるまで半分にする回数が比較回数 → n = 2ˣ より x = log₂n。よって O(log n)。

過去問道場で確認

Q4 ★2分探索の最大比較回数

1,000,000 件の整列済みデータを2分探索するとき、最大比較回数はおよそ何回か。

解説を表示

正解:イ(約 20 回)

2¹⁰ ≒ 1,0002²⁰ ≒ 1,000,000。つまり log₂(1,000,000) ≒ 20
100万件でもたった20回。線形探索なら最大100万回なので、2分探索の速さが分かる。

▼ 解説つきの類題を探す:過去問道場・分野別「アルゴリズム」

Q5 ★ハッシュのシノニム

ハッシュ関数を h(x) = x mod 10(10 で割った余り)とする。データ 12, 25, 32, 45 を格納するとき、同じ格納場所(シノニム)になる組はどれか。

解説を表示

正解:エ

シノニムの組は (12, 32)(25, 45)。衝突したデータの逃がし方(オープンアドレス法/チェイン法)で対処する。

Q6 ★2分探索のトレース

整列済み配列(添字 1〜7)から 21 を2分探索する。中央要素として比較する値を、比較する順に並べたものはどれか。

12Low
25
38
411mid
514
617
721High
最初は Low=1, High=7 → 中央 mid=4(A[4]=11)から比較を始める。
解説を表示

正解:ア(11 → 17 → 21)

LowHighmid(添字)A[mid]21 との比較
1741121 > 11 → 右へ(Low=5)
5761721 > 17 → 右へ(Low=7)
77721一致(発見)

mid = (Low+High)÷2 の整数部。比較したのは 11 → 17 → 21 の3回。

▼速解法:毎回残り範囲の真ん中と比べ、大小で左半分/右半分に絞る。1回で範囲が半分になる。

▼ 解説つきの類題を探す:過去問道場・分野別「アルゴリズム」

ハッシュの練習(各自演習):ハッシュ関数・衝突の問題は 分野別「アルゴリズム」でまとめて解ける。

【練習リンク】