java
[java] binary search (lower bound) 구현하기
hjinm
2021. 8. 29. 23:41
이진탐색은 탐색 대상이 정렬되어있을때 효율적으로 원하는 값을 검색할 수 있는 알고리즘이다.
구현 자체도 어렵지 않을 뿐더러 약간의 변형을 통해 해당 값을 찾는 것 뿐만 아니라 해당 값보다 같거나 큰 값이 나오는 첫 위치(lower bound)도 구할 수 있다.
기본 이진 탐색
public int binarySearch(int[] arr, target){
int low = 0;
int high = arr.size-1;
int mid = 0;
while(low <= high){
mid = (low+high)/2;
if(target == arr[mid]){
return mid;
} else if(target < arr[mid) {
high = mid-1;
} else {
low = mid+1;
}
}
return -1;
}
주어진 정수 배열 전체에서 목표 값을 찾는 함수이다.
Lower Bound
public int lowerBound(int[] arr, int target){
int low = 0;
int high = arr.size;
int mid = 0;
while(low < high){
mid = (low+high)/2;
if(target <= arr[mid]){
high = mid;
} else {
low = mid+1;
}
}
return low;
}
주어진 정수 배열에서 목표 값과 같거나 큰 값이 처음으로 나오는 위치를 반환하는 함수이다.
일반 이진 탐색에서 high를 size-1로 둔 것과 달리 lower bound에서는 목표값보다 큰 값이 없을 수도 있기 때문에 high를 size 값으로 둔다.
upper bound의 경우 위의 코드에서 target값과 arr[mid] 값이 같은 경우를 low = mid+1;로 처리되도록 if문을 변경하면 된다.