문제를 즉각 해결할 수 있을 때까지 재귀적으로 둘 이상의 하위 문제(Sub-problem)들로 나누고(Divide) 문제를 해결한 다음(Conquer) 그 결과를 이용해 다시 전체 문제를 해결하며 합치는 방법이다.
Quick Sort, Merge Sort, 이진탐색 등의 문제가 대표적이다.
public int total_sum(start, end){
if(start == end) {
return start;
}
int mid = start + (end - start) / 2;
return total_sum(start, mid) + total_sum(mid + 1, end);
}
0단계: 1 O(N)
1단계: 2 O(N / 2)
2단계: 4 O(N / 4)
m단계: 2^m O(N / (2^m)) = O(N)
단계별 식을 일반화해 보면 각 단계에서 드는 총합 연산량은 O(N)이다. 이는 매 단계마다 각 문제의 크기 역시 지수적으로 줄어들기 때문이다.
각 단계는 총 O(logN)개 있으므로, 이를 곱해서 O(NlogN) 이라는 시간복잡도를 구할 수 있다.