시간 복잡도 분석 연습
Master Theorem
점화식이 T(n) = rT(n/c) + O(f(n))의 형태일 때
case1. f(n) = Ω() 이면 T(n) = O(f(n))
case2. f(n) = Θ () 이면 T(n) = O(f(n)logn)
case3. f(n) = O() 이면 T(n) = O( )
T(n) = 2T(n/2) + O(n) => , f(n) = n => case2 => O(nlogn)
T(n) = T(n/2) + O(n) => , f(n) = n => case1 => O(n)
T(n) = T(n/2) + O(1) => , f(n) = 1 => case2 => O(1logn)
T(n) = 4T(n/2) + O(n) => , f(n) = n => case3 =>O()
T(n) = 3T(n/2) + O(n) => , f(n) = n => case3 => O()
T(n) = T(n/3) + O() => , f(n) = => case1 => O()
T(n) = 2T(n/2) + O(nlogn) => , f(n) = nlogn => case2(k=1) => O()
T(n) = T(n/3) + T(2n/3) + O(n)
Master Theorem 사용 못 함=> recursion tree 사용 => 두 개의 분기로 나뉨 (n/3, 2n/3) => 계속해서 각각 똑같은 비율로 나뉨 => 따라서 각 층 마다 합을 구하면 = n => 최종적으로 O(nlogn)

(2/3)^n = 1 -> 깊이 log_3/2 n
T(n) = T(n - 2) + T(2) + O(n)
= T(n-2) + O(n) = T(n-2) + cn = T(n-4) + c(n-2) + cn = ... => T(n) = O()
A(n) = 2A(n/4) + -> case2 -> O()
B(n) = 2B(n/4) +n -> case1 -> O(n)
C(n) = 2C(n/4) + -> case1 -> O()
D(n) = 3D(n/3) + -> case3 -> O(n)
E(n) = 3E(n/3) +n -> case2 -> O(nlogn)
F(n) =3F(n/3) + -> case1 -> O()
G(n) =4G(n/2) + -> case3 -> O()
H(n) =4H(n/2) +n -> case3 -> O()
I(n) =4I(n/2) + -> case2 -> O()
J(n) = J(n/2) + J(n/3) + J(n/6) + n

깊이: log n, 문제 크기 n으로 일정 -> O(nlogn)
K(n) = K(n/2) + 2K(n/3) + 3K(n/4) +
문제 크기 -> -> ... -> 비례 -> 공비가 1보다 작은 등비수열 -> -> O()
L(n) = L(n/15) + L(n/10) + 2L(n/6) +
-> -> ... -> 에 비례 -> 공비가 1보다 큰 등비수열 -> 노드의 개수와 같음
=> tree 높이 = (n/6이 더 깊이 내려감. 나머지도 걍 있다고 치고 이걸 기준으로 계산)
=> leaf: 1, 4, 4^2,... -> -> O()
트리가 내려갈 수록 노드합이 늘거나 줄거나 일정할 때 다름