반응형
Parametric Search
최적화 문제를 결정 문제로 바꿔 푸는 것 O(logN)
ex) Binary Search (이분 탐색)을 이용해서 Lower/Upper Bound를 구하는 경우가 많습니다.
※ 이분 탐색할 때 보통 데이터가 정렬된 상태이어야 합니다.
예시
에 총 N개의 집이 있으며, 한 집에 한 개의 공유기를 설치가능.
공유기 C개를 설치할 때, 가장 인접한 두 공유기(집) 사이의 거리를 최대로 하기.
▶ 두 집사이의 거리(간격)을 기준(mid)으로 공유기 개수 C를 만족하는지 확인
▶ 원하는 조건을 만족하는 가장 알맞는 값을 특정한 오차범위 이내에서 알고 싶은 경우
(범위는 문제조건 마다 다릅니다.)
구현
- Lower Bound: (최소값을 구하는 경우) 최소값이 x라면, x이상의 값에 대해서는 모두 조건을 만족
int solve() {
int start = MIN, end = MAX, mid, sol = 0;
while (start <= end) {
mid = (start + end) / 2;
if (isPossible(mid)) {
sol = mid; end = mid - 1;
}
else {
start = mid + 1;
}
}
return sol;
}
- Upper Bound: (최대값을 구하는 경우) 최대값이 x라면, x이하의 값에 대해서는 모두 조건을 만족
int solve() {
int start = MIN, end = MAX, mid, sol = 0;
while (start <= end) {
mid = (start + end) / 2;
if (isPossible(mid)) {
sol = mid; start = mid + 1;
}
else end = mid - 1;
}
return sol;
}
※ Lower/Upper Bound를 결정하였다면 isPossible() 함수를 구현하는 것 중요합니다.
▷ Binary Search + YES / NO Problem
Binary Search vs Parametric Search
Binary Search: 배열에서 중앙값(middle)이 가리키는 값이 내가 찾는 값인지 중요
Parametric Search: 원하는 조건을 만족하는 가장 알맞는 값을 찾는 것
Reference
반응형
'알고리즘' 카테고리의 다른 글
계수 정렬(Counting Sort) (0) | 2021.03.06 |
---|---|
LCP (Longest Common Prefix) (0) | 2021.03.06 |
PS시 어떤 정렬을 선택하는 것이 좋을까? (0) | 2021.03.02 |
합병 정렬(Merge Sort) (0) | 2021.03.02 |
연속된 부분 합(연속합) - 2 (Prefix Sum) (0) | 2021.02.28 |
댓글