이진 탐색이란?
- 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법
- 시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정하고 찾은 인덱스를 반환한다.
이진 탐색의 시간복잡도
- 단계마다 탐색 범위를 2로 나누므로 연산 횟수는 log(2)N에 비례한다.
- 시간복잡도는 O(logN)을 보장한다.
# 재귀함수 버전
def binary_search(array, target, start, end):
# 탐색할 곳이 안 남으면 None반환
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)
'알고리즘 > 이론' 카테고리의 다른 글
다이나믹 프로그래밍(Dynamic Programming) (0) | 2022.07.01 |
---|---|
정렬 알고리즘 시간복잡도 비교 (0) | 2022.06.22 |
계수 정렬(Count Sort) (0) | 2022.06.22 |
퀵 정렬(Quick Sort) (0) | 2022.06.22 |
삽입 정렬(Insertion Sort) (0) | 2022.06.22 |