B.二分探索 / バイナリサーチ

「プログラミング」及び「開発」関連用語集

カテゴリー: 探索アルゴリズム  閲覧数:423 配信日:2016-09-12 10:01


より洗練されたリスト探索アルゴリズム


データが多ければ多いほど線型探索よりも性能がよくなるが
探索前にソートしておく必要がある
※同一データは無い前提

検索対象
・ソート済み配列
※大小関係を使用するため、「未ソートのリスト」や「大小関係の定義されない要素を含むリスト」には二分探索を適用することはできない

処理の流れ
・中央の値を見る
・検索したい値との大小関係を用いて、検索したい値が中央の値の右にあるか、左にあるかを判断
・片側に存在しないことを確かめながら検索していく

n個のデータがある場合、
・時間計算量 … O(log2 n)
・実行時間 … O(log n)

n個のデータの「中央の値」を見ることで、
・1回の操作でn/2個程度(奇数の場合は(n-1)/2個、偶数の場合はn/2個または(n/2)-1個)の要素を無視することができる


データが見つかる具体例


下記配列から25を探し出す
・同一のデータは無い
位置 1 2 3 4 5 6 7 8 9 10
データ 1 3 4 11 12 13 17 22 25 28
1.、配列の中央位置を求める
・(1+10)/2=5 
(端数は切捨、切上のどちらでもいいが、ここは切捨とする。以下同じ)
・位置5のデータは12なので「×」
・位置1~4まではデータを調べなくても「×」と分かる。※予め昇順ソートしているため

2-1.残りの配列の中央位置を求める
・位置6~10の中央位置は、(6+10)/2=8
・位置8のデータは22なので「×」
・位置6~7まではデータを調べなくても「×」と分かる。※予め昇順ソートしているため

2-2.残りの配列の中央位置を求める
・位置9~10の中央の位置は、(9+10)/2=9
(端数は切捨、切上のどちらでもいいが、ここは切捨とする。以下同じ)
・位置9のデータは25なので目的のデータが見つかった
・位置10は調べていないが、同一のデータは存在しないという想定なので「×」としてよい



データが見つからない具体例1


下記配列から4を探し出す
・同一のデータは無い
位置 1 2 3 4 5 6 7 8 9 10
データ 1 3 5 11 12 13 17 22 25 28
1.、配列の中央位置を求める
・(1+10)/2=5 
・位置5のデータは12なので「×」
・位置6~10まではデータを調べなくても「×」と分かる。※予め昇順ソートしているため

2-1.残りの配列の中央位置を求める
・位置1~4の中央の位置は、(1+4)/2=2
・位置2のデータは3なので「×」
・位置1のデータは1なので「×」

2-2.残りの配列の中央位置を求める
・位置3~4の中央の位置は、(3+4)/2=3
・位置3のデータは5なので「×」
・以上でデータが見つからないという結果になる


データが見つからない具体例2


下記配列から29を探し出す
・同一のデータは無い
位置 1 2 3 4 5 6 7 8 9 10
データ 1 3 5 11 12 13 17 22 25 28
データの全体の一番右側が29より小さい
・データが見つからないという結果になる