정렬된 자료에서만 사용가능하다.
매번 탐색 범위를 절반씩 줄이면서 탐색하기 때문에 원하는 자료가 있는지 O(logN)에 판별할 수 있다.
탐색을 여러번 해야할 때 효율적이다.



이분 탐색 과정
시간복잡도는 O(logN)이다.
이분 탐색 코드
a.sort()
for num in b:
start = 0
end = n - 1
isExist = False
while start <= end:
mid = (start + end) // 2
if (num == a[mid]):
isExist = True
print(1)
break
elif num > a[mid]:
start = mid + 1
else:
end = mid - 1
if not isExist:
print(0)
최적화 문제를 결정 문제로 바꾸어 푸는 기법으로
특정 문제 상황(최적화 문제)에서 답을 직접 구하는 것이 아니라, "이게 답이 될 수 있는가? [Y/N]"(결정 문제)를 반복 확인하여 최솟값 또는 최댓값을 구한다.
이때, 결정 문제에 대한 답이 단조성을 가지는 경우(계속 YES가 나오다가 그 이후로 쭉 NO만 나오거나 그 반대여야 한다.)에만 이분탐색으로 해결할 수 있다.
큰 문제를 더 작은(쉬운) 문제로 분할하고 부분 문제의 답을 결합하여 큰 문제의 답을 구하는 알고리즘으로
보통 재귀함수로 구현하면 편리하다.
분할정복 예시
분할정복 응용
빠른 거듭제곱 : 정수 a, n에 대하여 a^n을 계산하는 방법
재귀함수를 아래와 같이 정의해보면,
F(a, n) = a^n
따라서 n이 계속 절반씩 감소하기 때문에 시간복잡도는 O(logN)이다.