二分探索

投稿者: | 2022-02-09
  • 検索するリストは昇順で並び替えておく
  • 線形探索に比べ、激速い
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)