๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿบ ๋งค์ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

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