二分探索

数学 Published at March 24, 2025, 8:39 a.m. by admin@senrigan.org

ソート済みの配列から要素を探す

特徴

  • 線形探索より高速
  • 計算量は\(O(\log n)\)

動作 1. 配列の真ん中の要素を取得する 2. 検索対象の要素と比較して、小さいなら右半分を探索 3. 検索対象の要素と比較して、大きいなら左半分を探索 4. 見つかるまで繰り返す

実装

再帰なし

def binary_searh(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = left + (right - left) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

arr = [1,3,5,7,9,11,13,15,17,19,21]
print(arr)
print(binary_searh(arr, 11))
print(binary_searh(arr, 10))

再帰あり

def binary_search(arr, target, left, right):
    if left > right:
        return -1
    mid = left + (right - left) // 2
    if arr[mid] == target:
        return mid
    elif arr[mid] < target:
        return binary_search(arr, target, mid + 1, right)
    else:
        return binary_search(arr, target, left, mid - 1)

arr = [1,3,5,7,9,11,13,15,17,19,21]
print(arr)
print(binary_search(arr, 11, 0, len(arr) - 1))
print(binary_search(arr, 10, 0, len(arr) - 1))