일부 에 대해 이라 가정할 때, 아래와 같이 표현할 수 있습니다.
즉, 모든 에 대해 이라는 결론을 내릴 수 있습니다.
Binary Search를 이용해 해결할 수 있는 문제는 많습니다. 공통적으로 크기가 다른 여러 개의 선택지에서 적합한 원소를 찾는 경향있습니다.
start
와 end
의 원소를 변경할 때, 무한 루프가 발생하지 않도록 주의해야 합니다.class BinarySearch {
int[] arr;
public BinarySearch(int[] arr) {
Arrays.sort(arr);
this.arr = arr;
}
public boolean binarySearch(int target) {
int start = 0;
int end = arr.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (arr[mid] == target) {
return true;
}
if (target < arr[mid]) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return false;
}
}
scanLeftElementEqualsOrOver()
메서드는 찾는 원소와 같거나 큰 원소 중 배열 가장 왼쪽에 있는 원소를 반환합니다.scanRightElementEqualsOrBelow()
메서드는 찾는 원소와 같거나 작은 원소 중 배열 가장 오른쪽에 있는 원소를 반환합니다.class BinarySearchForRangeScan {
int[] arr;
public BinarySearchForRangeScan(int[] arr) {
Arrays.sort(arr);
this.arr = Arrays.copyOf(arr, arr.length + 1);
}
private int scanRightElementEqualsOrBelow(int target) {
int start = 0;
int end = arr.length;
while (start < end) {
int mid = (start + end) / 2;
if (arr[mid] > target) {
end = mid;
} else {
start = mid + 1;
}
}
return start;
}
private int scanLeftElementEqualsOrOver(int target) {
int start = 0;
int end = arr.length;
while (start < end) {
int mid = (start + end) / 2;
if (arr[mid] >= target) {
end = mid;
} else {
start = mid + 1;
}
}
return start;
}
}
정렬된 배열에서 원소를 찾을 때까지 반복적으로 배열의 반을 나누는 방식으로 동작하며 탐색 속도는 입니다.