[Divide & Conquer] Master Theorem
in Algorithm on Dive & Conquer
Master Theorem
Master Theorem은 Divide & Conquer(분할정복)에 사용되는 Theorem(정리)이다.
 분할 정복에서는 재귀 호출 방식을 사용하는데 이 때 이 모든 연산 절차의 Time Complexity를
 계산하는 일종의 공식이다.
T(n) = a * T( ceil( n / b )) + O(n^d)
 이라고 가정했을 때, 세 가지 상황으로 구분되어 T(n)을 구할 수 있다.
- T(n) = O(n^d) if d > log_b(a)
 - T(n) = O(n^d * log(n)) if d == log_b(a)
 - T(n) = O(n^(log_b(a))) if d < log_b(a)
 
ex) T(n) = 4 * T(n/2) + O(n)
 => a = 4, b = 2, d = 1
 => log_b(a) = log_2(4) = 2
 => d < log_b(a)
 => T(n) = O(n^(log_b(a))) = O(n^2)
Proof

총 재귀되는 level은 ceil( log_b(n) )이다.
 만약 n = 8일 때, 이분할하여(b=2) 연산 한다고 하면,
 총 재귀의 level은 8 - (4, 4) - (2, 2, 2, 2) - (1, 1, 1, 1, 1, 1, 1, 1)
 leve은 보는것처럼 시작이 level = 0 이라고 할 때,
 총 level == 3으로 log_b(a) = log_2(8) = 3이다.
 즉 재귀 level 은 log_b(n) 이다.
 각 재귀로 호출 되는 Task 들의 관계(T(n) = a * T(n/b) + O(n^d))를 계산하면,
 이 모든 work의 합은 등비수열 합의 공식으로 구할 수 있다.
 등비수열의 합 공식은 곱해지는 수에 따라 결과값이 바뀌므로 아래와 같은 세 가지 상황으로 구분되게 된다.
- r == 1
 - r > 1
 - r < 1
 
r = (a/b^d) 이므로, Master Theorem 공식처럼
- d > log_b(a)
 - d == log_b(a)
 - d < log_b(a)
 
세 가지로 구분된다.
d > log_b(a)
등비수열 합 공식에 따라서 아래와 같다.
 
 이 때, d > log_b(a) 이므로, 결국 O(n^d) 가 된다.
d < log_b(a)
위 그림과 똑같지만
 d < log_b(a) 이므로, O(n^(log_b(a))가 된다.
d == log_b(a)
곱해지는 수가 1이면(d == log*b(a)), 총 합은 level * O(n^d) 이 된다.
 r == 1이면 초항 * 개수이므로, 초항 = O(n^d), 개수는 level 수가 된다.
 여기서 level = log_b(n), r = a/b^d 이므로,
 log_b(n) * O(n^d)이므로 결국 O(log(n) * n^d) 
