バイナリナビゲーション&パラメータナビゲーション
23865 ワード
バイナリナビゲーション
整然とした配列でしか使用できません
1.手順
0246810141618始点[0]中点[4]終点[9]
0246810141618始点[0]中点[1]終点[3]
0246810141618始点[2]、中点[2]終点[3]
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)
elif array[mid] < target:
return binary_search(array, target, mid + 1, end)
n, target = map(int, input().split())
array = list(map(int, input().split()))
result = binary_search(array, target, 0, n - 1)
if result is 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 = map(int, input().split())
array = list(map(int, input().split()))
result = binary_search(array, target, 0, n - 1)
if result is None:
print("원소가 존재하지 않습니다.")
else:
print(result + 1)
Lower Bound & Upper Bound
Lower boundは、データの最初の値が値以上の位置を返します.
def lower_bound(data, target):
lo = 0
hi = len(data)
while lo < hi:
mid = (lo + hi) // 2
if target <= data[mid]:
hi = mid
else:
lo = mid + 1
return lo
対分left関数def bisect_left(a, x, lo=0, hi=None):
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo+hi)//2
# Use __lt__ to match the logic in list.sort() and in heapq
if a[mid] < x: lo = mid+1
else: hi = mid
return lo
Upper Boundは、ある値よりも大きい最初の位置を返します.def upper_bound(data, target):
lo = 0
hi = len(data)
while lo < hi:
mid = (lo + hi) // 2
if target >= data[mid]:
lo = mid + 1
else:
hi = mid
return lo
arr=[50, 80, 81, 150, 150, 150, 150, 210, 260]
target=150
lower_bound = 3
upper_bound = 7
たいぶんrightかんすうdef bisect_right(a, x, lo=0, hi=None):
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo+hi)//2
# Use __lt__ to match the logic in list.sort() and in heapq
if x < a[mid]: hi = mid
else: lo = mid+1
return lo
参照パラメータ
最適化問題を意思決定問題に変換する技術
けっていもんだい
ある時点で条件が満たされているが、その時点以降条件が満たされていない場合は最値が検索される(Upper Bound)
ある時点までは条件を満たしていませんが、その時点以降で条件を満たした場合に最小値を検索します.
[f,f,...,t,t]
からf->tの部分に変わる.[t,t,...,f,f]
からt->fの部分に変わる.# 1
def binary_search(arr,lo,hi,value):
while lo + 1 < hi:
mid = (lo + hi) // 2
if arr[mid] <= value:
lo = mid
else:
hi = mid
return arr[lo]
条件
lo + 1 < hi
👉 複文内、arr[lo] < arr[hi]
常成立loとhiの各差1(
hi-lo == 1
)👉
mid <=hi
またはlo <= mid
arr[lo] < arr[hi]
成り立たないかもloとhiの差が1以上(
hi-lo > 1
)👉
arr[lo] < arr[hi]
食べ物は変わらない.評価条件に基づいて、loまたはhiが正解です.
arr[mid] <= value
👉 arr[lo] == value
arr[mid] < value
👉 arr[hi] == value
lo、hi区間の定義👉
lo = 구간의 최솟값 -1
& hi = 구간의 최댓값
lo = 구간의 최솟값
で定義し、hiは区間の最高値にはならない.(
lo + 1 < hi
) # 2
def fn(param):
pass
def binary_search(arr,lo,hi,value):
while lo + 1 < hi:
mid = (lo + hi) // 2
if fn(mid):
lo = mid # 참이면 오른쪽 구간을 탐색
else:
hi = mid # 거짓이면 왼쪽 구간을 탐색
return arr[lo]
fn(param) := param
ある条件を満たし、trueまたはfalseを返すことを表す.param
👉 一般的に、問題で最終的に要求される最も高い/最も高い値は、探しているパラメータです.param
の範囲は連続しているはずです.[lo, hi]
間の値fn(param)
の範囲も連続する.[false, false, ..., false, true, ..., true, true]
または[true, true, ..., true, false, ..., false, false]
false -> true 또는 true -> false 로 바뀌는 부분
1回のみ存在する.어떤 조건
👉 param以上/以下の場合、MグループまたはMグループに分割できますか?Reference
この問題について(バイナリナビゲーション&パラメータナビゲーション), 我々は、より多くの情報をここで見つけました https://velog.io/@guswns3371/이진-탐색-매개-변수-탐색テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol