【2分探索】
整列されたデータを探索キーとの比較によって、可能性のある領域を半分ずつに狭めていく探索法。
効率のよい探索ができる。
配列中のデータが昇順、又は降順に並んでいることが前提となる。
最大探索回数(比較回数)の求め方を覚えること。
データがn個ある場合には、2を底とする対数を使って
log2(n)
と表される(端数は切り上げ)。
(ただし、2,4,8,16,32など2のn乗にあたる数値の場合には
log2(n)+1となることに注意)。
データ数が 2〜 3(2の1乗以上2乗未満):最大探索回数は2回
データ数が 4〜 7(2の2乗以上3乗未満):最大探索回数は3回
データ数が 8〜15(2の3乗以上4乗未満):最大探索回数は4回
データ数が16〜31(2の4乗以上5乗未満):最大探索回数は5回
: : :
: : :
以下、これの繰り返し。
例)
10個のデータあり、次のように昇順で格納されている時
「6」のデータを探索する。
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
まず全体の真ん中である5番目の要素をチェックする。
チェック
↓
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
次に、検索のキーである「6」とチェック対象の「5」を比較すると
5<6 より
該当するデータは「5」より右にあることになる。
┌──┬──┬──┬──┬──┐
│ 6│ 7│ 8│ 9│10│
└──┴──┴──┴──┴──┘
6より右側の5つのデータのうち、真ん中の3番目の要素をチェックする。
チェック
↓
┌──┬──┬──┬──┬──┐
│ 6│ 7│ 8│ 9│10│
└──┴──┴──┴──┴──┘
次に、検索のキーである「6」とチェック対象の「8」を比較すると
6<8 より
該当するデータは「8」より左にあることになる。
┌──┬──┐
│ 6│ 7│
└──┴──┘
2度目のチェックで残った8より左側の2つのデータのうち、1番目の
要素をチェックする。
チェック
↓
┌──┬──┐
│ 6│ 7│
└──┴──┘
検索のキーである「6」とチェック対象の「6」を比較すると
6=6 となり探索完了となる。
ポイント)
2分探索に関しては、最大探索回数がポイントになる。
例)
2,000個の相異なる要素が,キーの昇順に整列された表がある。
外部から入力したキーによってこの表を2分探索して、該当するキーの
要素を取り出す。このときのキーの比較回数は最大何回になるか。
ただし、該当するキーは必ず表中にあるものとする。
公式通り log2(2000) を求める。
2^10=2の10乗=1024
2^11=2の11乗=2048
であるから、
10<log2(2000)<11
となり、端数は切り上げになるので11回となる。
参考)
対数(log)
べき乗を^、Nを底とする対数をlogN(xx)と表す。
2^5=2×2×2×2×2=32
であるから、対数で表すと
log2(32)=5
ということになる。このとき2を底(てい)と呼ぶ。
つまりこの関数は、32は2の何乗になっているかを求めている。
この式を覚えておくだけでもずっと違ってくるので、覚えておいた方が
良い。底としてよく使われるのは、試験では2である。
【線形探索法】
表の先頭の要素から順番に調べていく探索アルゴリズム。
データが整列されている必要はない。
データがn個ある場合の最大探索回数はn。
平均探索回数はn/2回になる。
【番兵法】
線形探索法で探索効率を上げるための手法として「番兵法」というものがある。
通常の線形探索だと、1つのデータに対して2回のチェックが必要となる。
・そのデータが探索対象であるかどうかの比較
・そのデータが探索範囲の最終データであるかどうかの比較
これに対して番兵法では番兵と呼ばれる探索の対象となっているデータを
探索対象の最後に付け加える。これにより、
・そのデータが探索範囲の最終データであるかどうかの比較をする必要が
なくなる。
番兵法では、
・そのデータが探索対象であるかどうかの比較だけを行う。
必ず探索対象のデータが存在しているからである。さらに、探索結果として
得られたデータの格納位置をチェックして、それが番兵であったら
探索対象がなかったと判断する。
比較の回数をほぼ半減することで、データが大量のときには、探索速度が
結構速くなる。
番兵→検索の際にダミー・データを使用することで、
処理を簡潔化するための手法である。配列のうちの
データを格納している要素の直後(A[n+1])に
番兵をおくことで、繰り返し条件の判定が不要となる。
A[i]とXが等しくなったときのiがnより大きい(n+1)の
場合は、番兵との比較まで繰り返したことになるので、
求めるデータはなかった。
_____
( 開 始 )
 ̄ ̄│ ̄ ̄
┌──┴──┐
│x→ A[n+1]│
└──┬──┘
┌──┴──┐
│ 1 → i │
└──┬──┘
┌───→│
│ / \
│ /A[i]:x\ =
│ \ /―――――┐
│ \ / │
│ │≠ / \
│ ┌──┴──┐ / i : n\ >
│ │ i+1 → i │ \ /―――――┐
│ └──┬──┘ \ / │
└――――┘ │≦ │
──┴── ──┴──
( 成 功 ) ( 失 敗 )
 ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄