-
Divide-and-Conquer 알고리즘과 Master TheoremAlgorithm 2020. 9. 29. 00:10
Divide and Conquer는 분할 정복이라고 한다
구체적으로는
1️⃣ 주어진 문제를 작은 subproblem으로 쪼갠다 (subproblem이란? 본 문제와 같은 로직이지만, input size가 작은 문제)
-> Divide
2️⃣ 나눈 subproblem들을 Recursively하게 해결한다
3️⃣ 2번에서 푼 subproblem들의 답을 적절하게 조합(combine, merge)해서 원래의 답을 도출한다
-> Conquer
분할 정복 알고리즘의 대표적인 예시로는 Merge Sort가 있다
위의 그림은 A라는 큰 배열을 작은 subproblem으로 나눈 것이다
한 번 나눌 때마다 input size는 2분의 1배가 되므로, divide하는데에는 O(log n)이 소모된다
첫 번째 사진에서 A7과 A8을 merge한 결과가 A4에 반영된다
합칠 때는 A7과 A8을 처음부터 순회하면서 현재 가리키고 있는 두 값을 비교한 뒤, 작은(또는 큰) 값을 push하고, 인덱스를 증가시키면 된다
두 번째 사진에서도 A3과 A4를 merge하면 A1이 나온다
모든 subproblem에 대해, merge연산은 총 N번 시행한다
그러면 해당 알고리즘의 시간복잡도는 어떻게 될까?
위에서 구한 것 처럼, input size가 2분의 1로 되게끔 subproblem을 나눈 뒤 merge하는 과정을 반복한다
이 때 Time Complexity를 T(n)이라 하면 T(n) = 2*T(n/2) + O(n)이라고 할 수 있다.
이와 같이 subproblem이 n/b의 형태를 띨 때에 한해서,
size가 n/b인 a개의 subproblem으로 나눠지며 답을 merge할 때 O(n^d)시간이 걸릴 경우 일반식을 도출해낼 수 있다
T(n) = a*T(n/b) + O(n^d) - Master Theorem
또한 위의 일반해에서 시간복잡도는 다음과 같이 구할 수 있다
예를 들면, T(n) = 5(n/2) + O(n^2)일 때, 2 < log2(5)이므로 T(n)의 시간복잡도는 O(n^log2(5))이다
출처 - 충북대학교 소프트웨어학과 알고리즘 강의자료
'Algorithm' 카테고리의 다른 글
Quick Select를 O(n)에 구현 가능한 Median of Medians 알고리즘 (0) 2021.01.03 Array의 k번째 작은 element 찾기 - QuickSelect 알고리즘 (0) 2021.01.01 시간복잡도 Big-O(빅 오) 표기법 (0) 2020.12.30 Kadane's Algorithm(카다네 알고리즘) SubArray 최대합 구하기 (429) 2020.12.29 Quick Sort 정의, 알고리즘 및 코드에 대해 (0) 2020.05.13