線形探索
1導入
この講義では、配列を先頭から順に比較する線形探索について、処理手順、正当性、計算量を説明する。任意の配列に対して等値比較だけを使用し、整列や補助的な検索構造を仮定しない場合、ある要素との比較結果から他の要素を一括して除外することはできない。このため、各要素を個別に検査する方法が基本となる。
2問題設定と用語
長さ n の配列
A=(A_0,A_1,\ldots,A_{n-1})
と目標値 x を入力とする。添字 i が A_i=x を満たすなら、そのような添字のうち最小のものを返す。該当する添字が存在しないなら、探索失敗を返す。
線形探索とは、A_0,A_1,\ldots,A_{n-1} をこの順序で目標値と比較し、最初の一致で終了する探索法である。比較回数とは、等式 A_i=x を判定した回数である。
3処理手順
i=0,1,\ldots,n-1 の順に、次の処理を実行する。
- A_i=x を判定する。
- 等式が成立するなら i を返して終了する。
- 等式が成立しないなら、次の添字へ移行する。
すべての添字において一致しなければ、探索失敗を返す。この手順は配列の整列状態に依存しない。
4不変条件による正当性
ループ不変条件とは、反復処理の所定の時点で常に成立する命題である。添字 i の比較直前に、次の不変条件を設定する。
不変条件は「A_0,A_1,\ldots,A_{i-1} のいずれも x と一致しない」である。
4.1初期化
最初の比較直前では i=0 である。既に比較した要素は存在しないため、空の添字集合に対して不変条件が成立する。
4.2保存
添字 i の比較直前に不変条件が成立すると仮定する。A_i=x なら、i より小さい添字では一致しないため、i は条件を満たす最小の添字である。A_i\ne x なら、既検査部分 A_0,\ldots,A_i のいずれも x と一致しない。したがって、i+1 の比較直前にも不変条件が成立する。
4.3終了
一致によって終了する場合、保存の議論により、返却する添字は最初の一致位置である。一致せずに i=n へ到達する場合、不変条件から A_0,\ldots,A_{n-1} のいずれも x と一致しない。ゆえに、探索失敗という返却結果は正しい。
初期化、保存、終了の三段階により、線形探索は仕様を満たす。
5計算量
n>0 とする。目標値が先頭要素 A_0 と一致する最良の場合、比較回数は 1 であり、時間計算量は \Theta(1) である。
目標値が末尾要素とのみ一致する場合、または配列内に存在しない場合、比較回数は n である。したがって、最悪時間計算量は \Theta(n) である。ループの添字と返却値を除いて入力長に比例する記憶領域を使用しないため、補助空間計算量は \Theta(1) である。
n=0 の場合は比較を実行せず、直ちに探索失敗を返す。
6適用範囲と二分探索への接続
線形探索は、要素を順次取得して等値比較できれば適用でき、整列を必要としない。一方、整列済み配列では、順序情報により複数の候補を一括して除外できる。次の講義では、この性質を利用する二分探索を説明する。
data/lecture/information/algorithm/search/binary-search.lecture.n.md
7まとめ
- 線形探索は、配列要素を先頭から順に目標値と比較する。
- ループ不変条件の初期化、保存、終了により、最初の一致位置または探索失敗を正しく返すことが証明される。
- 最良時間計算量は \Theta(1)、最悪時間計算量は \Theta(n)、補助空間計算量は \Theta(1) である。