이진 탐색

미미·2023년 4월 13일
0

algorithm

목록 보기
2/7

이진 탐색

: 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법
(시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정)

💡 파라메트릭 서치 문제(최적화 문제를 결정 문제(’예’ 혹은 ‘아니오’)로 바꾸어 해결하는 기법)는 이진 탐색을 이용하여 해결

이진 탐색 동작 예시

-> 이미 정렬된 10개의 데이터 중에서 값이 4인 원소를 찾는 예시


시간 복잡도

  • 단계마다 탐색 범위를 2로 나누는 것과 동일하므로 연산 횟수는 log2N에 비례
  • 이진 탐색은 탐색 범위를 절반씩 줄이며, 시간복잡도는 O(logN)을 보장



재귀적 구현

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 = 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 = 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)

파이썬 이진 탐색 라이브러리

  • bisect_left(a,x): 정렬된 순서를 유지하면서 배열 a에 x를 삽입할 가장 왼쪽 인덱스를 반환
  • bisect_right(a,x): 정렬된 순서를 유지하면서 배열 a에 x를 삽입할 가장 오른쪽 인덱스를
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)) # 6

0개의 댓글

관련 채용 정보