λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🐺 맀일 μ•Œκ³ λ¦¬μ¦˜

Binary search, 이진 탐색


리슀트 A = [ 0, 1, ,2, 3 ] 이 μžˆμ„ λ•Œ, λ§ˆμ§€λ§‰ μ›μ†ŒμΈ '3'을 μ°ΎλŠ”λ‹€κ³  ν•΄λ³΄μž.


Simple search, λ‹¨μˆœ νƒμƒ‰μ˜ 경우

μ²˜μŒλΆ€ν„° 순차적으둜 μ›μ†Œ 값을 ν™•μΈν•œλ‹€.

λ§ˆμ§€λ§‰μ— μœ„μΉ˜ν•˜κ³  μžˆλŠ” μ›μ†ŒμΈ '3'을 μ°ΎκΈ° μœ„ν•΄μ„œλŠ”  리슀트의 길이와 같은 μ‹œκ°„μ΄ κ±Έλ¦°λ‹€.

리슀트의 길이와 κ°™μ€μ‹œκ°„μ„ O(n), linear time μ„ ν˜•μ‹œκ°„ 이라고 ν•œλ‹€.

 Binary search, 이진 탐색은

리슀트의 쀑간에 μžˆλŠ” μ›μ†Œμ˜ 크기에 따라 탐색할 ꡬ간(range)λ₯Ό λ°˜μ”© μ€„μ—¬λ‚˜κ°€ O(log n), logarithm time 둜그 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” 방식이닀. λ§Œμ•½ 100개의 μ›μ†Œλ₯Ό 가지고 μžˆλŠ” 리슀트라면 탐색할 ꡬ간이 100 μ—μ„œ 50, 25, 13, 7, 4, 2, 1 순으둜 쀄어든닀.

λ”°λΌμ„œ, A의 쀑간에 μœ„μΉ˜ν•œ A[2] μœ„μΉ˜μ˜ μ›μ†ŒμΈ '2'은 μ°Ύκ³ μžν•˜λŠ” μ›μ†ŒμΈ '3'보닀 μž‘μœΌλ―€λ‘œ ꡬ간 A[:3] = [ 0, 1] 은 버렀지고,

λ‹€μŒ iterationμ—μ„œλŠ” A[3:] = [3]이 νƒμƒ‰λ˜λŠ” ꡬ간이닀.



Binary search 파이썬 κ΅¬ν˜„ (* 이진 탐색은 탐색할 λ¦¬μŠ€νŠΈκ°€ 이미 μ •λ ¬λ˜μ–΄ μžˆμ„ λ•Œλ₯Ό κ°€μ •ν•œλ‹€.)

'''
INPUT: A = sorted array, i = value want to fine
OUTPUT: If value i is in A, return the index of it,
if not return -1.

low = 탐색 λ²”μœ„ 맨 μ•ž 인덱슀

high = 탐색 λ²”μœ„ 맨 끝 인덱슀

'''

def binarySearch(A,i):
low = 0
high = len(A) -1
while low <= high:
mid = (low + high) // 2
if A[mid] == i:
return mid
elif A[mid] < i:
low = mid+1
else:
high = mid
return -1