수열과 탐색 대상 X 가 주어졌을 때,
를 의미합니다.
더 빠르게 탐색할 수 있는 방법이 있는데, 이진 탐색이다.
정렬이 보장되는 배열에서 기준 X 를 가지고 범위를 "이분" 하면서 탐색하는 방법
O(log N)
주의 : 이진 탐색을 하려면 오름차순 정렬이 되어야만 한다.
L : 탐색할 가치가 있는 범위의 왼쪽 끝 인덱스
R : 오른쪽 끝 인덱스
Result : 탐색한 X 의 위치
탐색 목표 : X 이하의 원소 중에 가장 오른쪽에 있는 원소
N 이 10만 -> log(10만) = 16 만에 탐색이 가능
3위 : L,R 범위를 잘못 설정하거나 Result 의 초기값을 잘못 설정하는 경우
2위 : L,R,M,Result 변수의 정의를 헷갈려서 부등호 잘못 쓰는 경우
1위 : 이분 탐색을 하는데, 정렬을 하지 않는 경우
static int binarySearch(int[] A, int L, int R, int X) {
/*
* A[L...R] 에서 X 미만의 수(X 보다 작은 수) 중 제일 오른쪽 인덱스를 return 하는 함수
* 그런게 없다면 L - 1 을 return 한다.
*/
int result = L -1;
while (L <= R) {
int mid = (L + R) / 2;
if (A[mid] < X) {
result = mid;
L = mid + 1;
} else if (A[mid] >= X) {
R = mid - 1;
}
}
return result;
}