[バイナリ探索]範囲を半分に縮小した探索
バイナリサーチ
ソートされたリストでデータをナビゲートするアルゴリズム
バイナリナビゲーションは、位置を表す変数始点、終点、および中点を使用します.
検索するデータを中間位置にあるデータと繰り返し比較して、必要なデータを検索します.これがバイナリ・ナビゲーション・プロシージャです.
<ex)バイナリナビゲーションによる検索方法4
①始点、終点、中点を特定する.中間点が実数の場合、小数点以下は破棄されます.
中間点のデータ8は4より大きいので、中間点の後の値をチェックする必要はありません.
[4]より前の[3]に端点を移動します.
②中間点に位置するデータ2が4未満であるため、値が2未満であることを再確認するデータは不要である.始点を[2]に変更します.
③中間点に位置するデータは4であり,このとき探索を終了する.br/>
合計データは10個ありますが、バイナリ・ナビゲーションを使用して要素を3回見つけることができます.
バイナリナビゲーションの時間的複雑さ
-再帰関数を使用して実装されるバイナリ・ナビゲーション・ソース・コード
(暗記しましょう!)/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はたいぶんこを提供し、バイナリナビゲーションを容易にする.
動画リスト
📘 이것이 취업을 위한 코딩 테스트다 with 파이썬 ::chapter 07
Reference
この問題について([バイナリ探索]範囲を半分に縮小した探索), 我々は、より多くの情報をここで見つけました https://velog.io/@ssongplay/이진-탐색-범위를-반씩-좁혀가는-탐색テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol