정의
이분탐색이란 검색 범위를 절반씩 줄여 나가면서 원하는 데이터를 검색하는 알고리즘이다
- 검색하는 배열의 데이터가 정렬되어 있어야 한다
- 이분탐색은 범위 설정이 헷갈리고 실수하기 쉽다.
- 시간복잡도는 O(logN)
이분탐색 while문 설정
- 이분 탐색에서 분배를 잘못하면 무한 루프에 빠지므로 while 탈출 조건을 고려해야 한다
while문 조건 | 구간 설정 | 탈출 직전 값 |
lo < hi | lo = mid+1 hi = mid |
lo = hi-1 |
lo <= hi | lo = mid+1 hi = mid-1 |
lo = hi |
lo+1 < hi | lo = mid hi = mid |
lo = hi-2 |
※ 특정 조건마다 사용하는 것이 다른 줄 알았는데 취향이라고 한다.
이분탐색 lo, hi 범위 설정
이분탐색은 정답 범위를 나타낼 수 있어야 한다. 하지만 lo, hi의 잘못된 범위 설정으로 답을 찾지 못할 수 있다.
정답 범위가 0 ~ n 일 때,
1. hi의 답이 0이 나올 수 있다면, lo = -1
2. lo의 답이 n이 나올 수 있다면, hi = n+1
예시 코드
위에 3번째 조건을 적용한 예시
int binary_search(int lo, int hi, int target) {
while(lo+1 < hi) {
int mid = (lo+hi)/2;
// if(arr[mid] < target) // hi 반환
if(arr[mid] <= target) // lo 반환
lo=mid;
else
hi=mid;
}
return arr[lo];
}
STL을 사용한 예시
#include <algorithm>
vector<int> vec;
binary_search(vec.begin(), vec.end())