- 検索するリストは昇順で並び替えておく
- 線形探索に比べ、激速い
def binary_search(data, value):
left = 0 # 探索する範囲の左端を設定
right = len(data) - 1 # 〃 右端
while left <= right:
mid = (left + right) // 2
if data[mid] == value:
# 中央の値と一致した場合は位置を返す
return mid
elif data[mid] < value:
# 中央の値より大きい場合は探索範囲の左を変える
left = mid + 1
else:
# 中央の値より小さい場合は探索範囲の右を変える
right = mid - 1
# 見つからなかった場合
return -1
data = [i for i in range(100000000)]
%%timeit
binary_search(data, 85684500)
# >> 4.91 µs ± 20.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
# cf.線形探索
def linear_search(data, value):
for i in range(len(data)):
if data[i] == value:
return i
return -1
%%timeit
linear_search(data, 85684500)
# >> 4.88 s ± 76.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)