
[ 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 ]
↑
[1단계]
[ 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 ]
Left Mid Right
[2단계]
[ 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 ]
Left Mid Right
[3단계]
[ 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 ]
Left Mid Right
[4단계]
[ 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 ]
Left=Right=Mid
function binarySearch(arr, target, start, end) {
if (start > end) return -1; // 찾지 못한 경우
let mid = parseInt((start + end) / 2); // 중간 값 인덱스 계산
// 값을 찾은 경우
if (arr[mid] === target) return mid;
// 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
else if (arr[mid] > target) return binarySearch(arr, target, start, mid - 1);
// 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
else return binarySearch(arr, target, mid + 1, end);
}
// n(원소의 개수)와 target(찾고자 하는 값)
let arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19];
let result = binarySearch(arr, target, 0, n - 1);
if (result == -1) console.log('원소가 존재하지 않습니다.');
else console.log(`${result + 1}번째 원소입니다.`);
function binarySearch(arr, target, start, end) {
while (start<=end) {
let mid = parseInt((start+end)/2);
//찾은 경우 중간점 인덱스 반환
if (arr[mid] == target) end = mid-1;
// 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
else if (arr[mid > target) end = mid-1;
// 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
else start = mid + 1;
}
return -1;
}
let n = 10;
let target = 7;
arr = [1,3,5,7,9,11,13,15,17,19];
let result = binarySearch(arr, target, 0, n-1);
if(result == -1) console.log('원소가 존재하지 않습니다');
else console.log(`${result+1}번째 원소입니다`);
lowerBound() 함수와 upperBound() 함수를 사용할 수 있다. lowerBound(arr, x) : 정렬된 순서를 유지하면서 배열 arr에 x를 넣을 가장 왼쪽 인덱스를 반환upperbound(arr, x) : 정렬된 순서를 유지하면서 배열 arr에 x를 넣을 가장 오른쪽 인덱스를 반환function lowerBound(arr, target, start, end) {
while(start < end) {
let mid = parseInt((start+end) / 2);
if(arr[mid] >= target) end = mid; // 최대한 왼쪽으로 이동
else start = mid+1;
}
return end;
}
function upperBound(arr, target, start, end) {
while(start < end) {
let mid = parseInt((start+end) / 2);
if(arr[mid] > target) end = mid;
else start = mid+1;// 최대한 오른쪽으로 이동
}
return end;
}
countByRange() : 정렬된 배열에서 값이 특정 범위에 속하는 원소의 개수를 계산한다. upperBound(), lowerBound() 함수를 통해 구현 가능// 값이 [leftValue, rightValue]인 데이터의개수를 반환하는 함수
function countbyRange(arr, leftValue, rightValue){
let rightIndex = upperBound(arr, rightValue, 0, arr.length);
let leftIndex = lowerBound(arr, leftValue, 0, arr.length);
return rightIndex - leftIndex;
}
max x
s. t. f(x) > C
where f(x) is monotone decreasing function.