[バイナリ探索]範囲を半分に縮小した探索



バイナリサーチ



ソートされたリストでデータをナビゲートするアルゴリズム



バイナリナビゲーションは、位置を表す変数始点、終点、および中点を使用します.

検索するデータを中間位置にあるデータと繰り返し比較して、必要なデータを検索します.これがバイナリ・ナビゲーション・プロシージャです.


<ex)バイナリナビゲーションによる検索方法4


①始点、終点、中点を特定する.中間点が実数の場合、小数点以下は破棄されます.

中間点のデータ8は4より大きいので、中間点の後の値をチェックする必要はありません.

[4]より前の[3]に端点を移動します.



②中間点に位置するデータ2が4未満であるため、値が2未満であることを再確認するデータは不要である.始点を[2]に変更します.



③中間点に位置するデータは4であり,このとき探索を終了する.br/>


合計データは10個ありますが、バイナリ・ナビゲーションを使用して要素を3回見つけることができます.




バイナリナビゲーションの時間的複雑さ

O(logN)O\left(\log N\right)




-再帰関数を使用して実装されるバイナリ・ナビゲーション・ソース・コード


(暗記しましょう!)/p>

# 이진 탐색 소스코드 구현 (재귀 함수)
def binary_search(array, target, start, end):
    if start > end:
        return None
    mid = (start + end) // 2
    # 찾은 경우 중간점 인덱스 반환
    if array[mid] == target:
        return mid
    # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
    elif array[mid] > target:
        return binary_search(array, target, start, mid - 1)
    # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
    else:
        return binary_search(array, target, mid + 1, end)

# n(원소의 개수)과 target(찾고자 하는 값)을 입력 받기
n, target = list(map(int, input().split()))
# 전체 원소 입력 받기
array = list(map(int, input().split()))

# 이진 탐색 수행 결과 출력
result = binary_search(array, target, 0, n - 1)
if result == None:
    print("원소가 존재하지 않습니다.")
else:
    print(result + 1)


-繰り返し文を使用して実装されるバイナリ・ナビゲーション・ソース・コード

# 이진 탐색 소스코드 구현 (반복문)
def binary_search(array, target, start, end):
    while start <= end:
        mid = (start + end) // 2
        # 찾은 경우 중간점 인덱스 반환
        if array[mid] == target:
            return mid
        # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
        elif array[mid] > target:
            end = mid - 1
        # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
        else:
            start = mid + 1
    return None

# n(원소의 개수)과 target(찾고자 하는 값)을 입력 받기
n, target = list(map(int, input().split()))
# 전체 원소 입력 받기
array = list(map(int, input().split()))

# 이진 탐색 수행 결과 출력
result = binary_search(array, target, 0, n - 1)
if result == None:
    print("원소가 존재하지 않습니다.")
else:
    print(result + 1)


クイック入力:readline()


バイナリ検索問題は入力データが多いか、検索範囲が広い.

入力データが多い問題では、input()関数を使用すると、動作速度が遅いためにタイムアウトと判定される場合があります.

タイムアウトを回避するには、sysライブラリのreadline()関数!

import sys

# 하나의 문자열 데이터 입력 받기
input_data = sys.stdin.readline().rstrip()
# 입력 받은 문자열 그대로 출력하기
print(input_data)

sysライブラリを使用する場合は、1行の入力を受信した後にrstrip()関数を呼び出す必要があります.

ソースコードにreadline()を入力すると、入力後にエンティティが改行文字で入力されます.この空白文字を削除するには、rstrip()関数を使用する必要があります.(慣例に従って暗記する)
sys.stdin.readline().rstrip()




たいぶんこ


Pythonはたいぶんこを提供し、バイナリナビゲーションを容易にする.




動画リスト