문제를 재귀적으로 분할해서 해를 구하고, 그 해들을 결합해서 원래의 해를 구하는 알고리즘
분할 정복의 기본 구조
dnc(int s, int e) {
//1
degenerate case -> conquer
//2
divde
//3
combine
}
이처럼 분할 정복에는 3가지 요소가 필요
이를 식으로 표현하면 f(n) = a * f(n/b) + g(n) +h(n)
예시
분할 정복의 시간 복잡도
T(n) = a * T(n/b) + O(n^d)
이 점화식을 풀기 위해서 마스터 정리(master theorem)을 사용한다.
마스터 정리
O (n^d), if d > log(b)a
O(n^d*log(n)), if d = log(b)a = T(n)
O(n^log(b)a), if d < log(b)a
예) merge sort
T(n) = 2 T(n/2) + O(n) 일때,
a = 2, b = 2, d = 1 = log(b)a = log(2)2임으로
T(n) = O(n1*log(n)) = O(nlog(n))이다.
binary_search(int a, int e) {
if(s == e) // 1. degenate case, g(1)
reutenr (arr[s] == key) ? s : -1;
m = (a + b) /2;
if(arr[m] == key) // divde
return m;
else if(arr[m] > key)
binary_search(m+1, e); // T(n/2)
else
binary_search(a, m-1);
// combinie X h(n) = 0
}