- 이분 탐색이라 말하면 못알아먹는데 Binary Search라 말하면 알아먹는다.
 - [IMP] 정렬된 배열에만 사용 가능한 탐색기법
 - 중앙 값을 기반으로 불필요한 탐색범위를 줄여가는 기법
 - 알고리즘
 
- low <= high라면 아래 과정 반복
 
- low = 현재 탐색 배열의 시작 점
 - high = 현재 탐색 배열의 끝 점
 - middle = (low + high) / 2
 - 탐색 값 > middle
 
- low - middle - 1 범위에서 재탐색(재귀 호출)
 - 탐색 값 = middle
 
- 탐색 완료
 - 탐색 값 < middle
 
- middle + 1 - high 범위에서 재탐색(재귀 호출)
 - low > high라면 탐색 값 존재 X
 
- 시간 복잡도 :
 
int binary_search(vector<int>& v, int num){ int low = 0;//시작점 int high = v.size() - 1;//끝넘 int idx = -1;//반환 값 while(low <= high){ int mid = (low + high) / 2; //1. 탐색 값을 찾으면 멈춤 //2. 탐색 값 < 중앙 값 -> 끝점 갱신 //3. 탐색 값 > 중앙 값 -> 시작점 갱신 if(v[mid] == num){ idx = mid; break; } else if(num < v[mid]) high = mid - 1; else if(v[mid] < num) low = mid + 1; } return idx; }
- C++에선 이진탐색(binary search)에 대한 라이브러리 함수 lower_bound & upper_bound를 제공한다.
 - lower_bound(iter start, iter end, T val)
 
- [start - end) 범위에서 val보다 크거나 같은 iter를 반환
 - upper_bound(iter start, iter end, T val)
 
- [start - end) 범위에서 val보다 큰 iter를 반환
 vector<int> vec = {1,2,2,2,2,2,8,9}; cout << lower_bound(vec.begin(), vec.end(), 2) - vec.begin() << '\n'; // 1 cout << upper_bound(vec.begin(), vec.end(), 2) - vec.begin() << '\n'; // 6