정렬
된후에 탐색순차탐색이 O(N)이라면 이진탐색은 O(logN)이다.
const binarySearch = (arr, target, start, end) => {
//탐색 실패(값 없음)
if(start > end) return -1;
let mid = parseInt((start+end)/2);
//만약 찾았다면 현재 index return
if(arr[mid] === target) return mid;
//start target mid end
else if(arr[mid] > target) return binarySearch(arr, target, start, mid-1);
//start mid target end
else if(arr[mid] < target) return binarySearch(arr, target, mid+1, end);
}
추후에 세그먼트 트리와 같은 복잡한 알고리즘에서 활용됨
c나 python에서는 lowerBound(), upperBound()라는 함수를 사용해서 해결할 수 있지만, javascript는 직접 구현해야함
cont lowerBound = (arr, target, strat, end) => {
while(start < end){
let mid = parseInt((start+end)/2);
if(arr[mid] >= target) end = mid;
else start = mid + 1;
}
return end;
}
const upperBound = (arr,taret, start, end) => {
while(start < end){
let mid = parseInt((start+end)/2);
//start target arr[mid] end
//start target mid mid mid mid arr[mid] end
if(arr[mid] > target) end = mid;
//start arr[mid] target1 target2 end => start: target1
//start target1 arr[mid] target2 end => start: target2
else start = mid + 1;
}
return end;
}
다른 고급 알고리즘 문제랑도 연결됨
x <= y 이면 f(x) <=f(y)
인 함수를 의미합니다.정렬된 배열
을 다루기 때문에 단조 증가 함수입니다.최적화 문제: 최댓값, 최솟값을 찾는것 저럼 특정한 조건을 만족하는 알맞은 값을 빠르게 찾는 문제