通常の線形探索アルゴリズムと、番兵法を導入した線形探索を比較してみます。
通常の線形探索では、配列の範囲チェックと要素比較を毎回同時に行います。
〔プログラム〕
〇整数型: linearSearch(配列型(整数型): A, 整数型: key)
整数型: i
i ← 0
while (i < A の長さ かつ A[i] ≠ key)
i ← i + 1
endwhile
if (i < A の長さ)
return i
else
return -1
endif
特徴
番兵法では、配列の末尾に「探す値 (key)」を一時的に置くことで、必ず探索が終了する保証を作ります。
〔プログラム〕
〇整数型: linearSearchSentinel(配列型(整数型): A, 整数型: key)
整数型: n
n ← A の長さ
整数型: last ← A[n-1] // 元の末尾を保存
A[n-1] ← key // 番兵をセット
整数型: i ← 0
while (A[i] ≠ key)
i ← i + 1
endwhile
A[n-1] ← last // 復元
if (i < n-1 または last = key)
return i
else
return -1
endif
特徴
| 項目 | 通常の線形探索 | 番兵法ありの探索 |
|---|---|---|
| ループ条件 | 範囲チェック+値比較 | 値比較のみ |
| 1 回の比較コスト | 2 回判定が必要 | 1 回判定で済む |
| コードの読みやすさ | やや複雑 | シンプル |
| 実行速度(平均) | 若干遅い | 若干速い |
範囲チェックが不要になるため、比較回数が少なく済む。
「必ず見つかる値(番兵)」を用意することで終了条件が単純になる。
探索アルゴリズムを学ぶとき、条件の単純化や工夫の大切さを理解できる。
※実際のプログラムでは差はわずかですが、低速な環境や処理を大量に繰り返す場合に効果が出ます。