🪴 Hayul's digital garden

Search

Search IconIcon to open search

이진탐색

Last updated Nov 20, 2022 Edit Source

Note

이진탐색은 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법이다. 이때, log N의 시간복잡도를 가진다. 시작점, 끝점, 중간점을 이용해서 탐색 범위를 설정한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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)

result = binary_search(array, target, 0, n - 1)

if result == None:
	print("원소가 존재하지 않습니다.")
else:
	print(result + 1)

그리고 알아두면 좋은 라이브러리로 bisect 이 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from bisect import bisect_left, bisect_right

a = [1,2,4,4,8]
x = 4

print(bisect_left(a,x))
>>> 2

print(bisect_right(a,x))
>>> 4