211207
알고리즘
이진탐색 템플릿
1 2 3 4 5 6 7
| const 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); }
|
반복문으로 왠만하면 반복문이 빠름
1 2 3 4 5 6 7 8
| function binarySearch(arr, tareget, start, end) { while (start <= end) { let mid = parseInt((start + end) / 2); if (arr[mid] == target) return mid; else if (arr[mid] > target) end = mid - 1; else start = mid + 1; } }
|
lowerBound(a, x) 하한선 → 정렬된 데이터가 있을때 정렬을 유지하면서 배열 a 에 x를 가장 왼쪽에 넣을 인덱스 반환
upperBound(a, x) 상한선 → 정렬 유지하면서 배열 a 에 가장 오른쪽에 넣을 인덱스 반환
lowerBound:
1 2 3 4 5 6 7 8
| 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 }
|
uppserBound :
1 2 3 4 5 6 7 8
| 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 }
|
countByRange : 같이 사용하는 것
1 2 3 4 5
| function countByRange(arr, leftValue, rightValue) { let rightIndex = upperBound(arr, rightValue, 0, arr.length); let leftIndex = lowerBound(arr, leftValue, 0, arr.length); return rightIndex - leftIndex; }
|
보통 3가지중 하나
- 단순 이진 탐색
- countByRange
- 파라메트릭 서치 → 이진탐색이 아닌거 같지만 이진탐색인걸 찾아야 함. (예 혹은 아니오로 )