점화식(Recurrence Relation)¶
1절. 점화식
2절. 반복 대치
3절. 추정 후 증명
4절. 마스터 정리
1절. 점화식¶
점화식(Recurrence Relation)¶
- 알고리즘 수행 시간 분석에 필요한 핵심 도구
- 어떤 함수를 자신과 동일한 함수로 이용 후 표현
| 알고리즘 | 계산식 | 점화식 |
|---|---|---|
| 피보나치(단순 재귀) | \(f(n)\) = \(f(n-1)\) + \(f(n-2)\) | \(T(n) = T(n - 1) + T(n-2)+ c\) |
| 피보나치(메모이제이션) | \(f(n)\) = \(f(n-1)\) + \(f(n-2)\) | \(T(n) = T(n - 1) + c\) |
| 분할 정복 | max(f(left), f(right)) | $T(n) = 2 T(n/2) + c $ |
점근적 분석 방법¶
- 점화식으로 표현된 식의 점근적 복잡도 분석 방법
-
\(O(g(n))\) 과 같은 복잡도 계산
-
반복 대치
- 추정 후 증명
- 마스터 정리
2절. 반복 대치¶
반복 대치 분석 과정¶
- 점화식을 반복 대치 후 경계 조건 대입
- \(T(0)\)에 도달 시 값 계산 가능
\[
\begin{aligned}
T(n) &= T(n - 1) + 2 \\
&= T(n - 2) + 2 + 2 \\
&= T(n - 3) + 2 + 2 + 2 = T(n - 3) + 3(2) \\
&= T(n - 4) + 2 + 2 + 2 + 2 = T(n - 4) + 4(2) \\
&= T(0) + n(2) = T(0) + 2n
\end{aligned}
\]
- \(T(0) = 1\)일 경우
- \(T(n) = 2n + 1 = O(n)\)
병합 정렬의 반복 대치¶
- 병합 정렬 함수
# A[p ... r] 정렬
def mergeSort(A, p, r):
if (p < r):
q = floor((p + r)/2)
# p, r의 중간 지점 계산
mergeSort(A, p, q)
# 전반부 정렬
mergeSort(A, q+1, r)
# 후반부 정렬
merge(A, p, q, r)
# 병합
def merge(A, p, q, r):
# 정렬된 배열 A[p ... q]와 A[q+1 ... r] 병합
# 정렬된 하나의 배열 A[p ... r] 생성
- mergeSort() 중간 지점 계산
- 이등분 후 절반 감소
- 병합 정렬 과정
- 전반부 정렬
- 후반부 정렬
- 병합
- 알고리즘 수행 시간
- \(T(n) = 2T(n / 2) +\) 후처리 시간
- \(T(n) = 2T(n / 2) + n\), \(T(1) = 1\) 로 표현
- \(k = log n\), \(2^k = n\) 사용
\[
\begin{aligned}
T(n) &= 2T(n / 2) + n\\
&= 2(2T(n / 2^2) + n / 2) + n = 2^2T(n / 2^2) + 2n\\
&= 2^2(2T(n / 2^3) + n / 2^2) + 2n = 2^3T(n / 2^3) + 3n\\
&···\\
&= 2^kT(n / 2^k) + kn\\
&= n + n log n\\
&= O(n log n)\\
\end{aligned}
\]
팩토리얼 반복 대치¶
- 알고리즘 수행 시간
- \(O(n) = T(n)\)
- \(c\)는 자기 호출을 제외한 나머지 수행 시간
\(T(n) = T(n - 1) + c\) \(T(1) \leq c\)
\[
\begin{aligned}
T(n)&= T(n - 1) + c\\
&= (T(n - 2) + c) + c = T(n - 2) + 2c\\
&= (T(n - 3) + c) + 2c = T(n - 3) + 3c\\
&···\\
&=T(1) + (n - 1)c\\
&\leq c + (n - 1)c\\
&= cn\\
\end{aligned}
\]
3절. 추정 후 증명¶
추정 후 정리 분석 과정¶
- \(T(n) = 2T(n / 2) + n\)
-
추정 : \(T(n) = O(n\) \(log\) \(n)\) 즉, \(T(n) \leq c\) \(n\) \(log\) \(n\)
-
방법
- 우리가 찾고자 하는 식 \(T(n) \leq c\) \(n\) \(log\) \(n\) 을 증명에 적용하니 맞았음
- 따라서 우리가 제시한 추정이 맞는 것 같다는 논리
-
만약 식 \(T(n) \leq c\) \(n\) \(log\) \(n\) 가 틀리면 추정과 같은 결로에 도달 불가
-
증명식
\[
\begin{aligned}
T(n) &=2T(n / 2) + n\\
& \leq 2c(n / 2) log (n / 2) + n\\
&= cn log n - cn log 2 + n\\
&= cn log n + (-c log 2 + 1)n\\
& \leq cn log n\\
\end{aligned}
\]
4절. 마스터 정리¶
마스터 정리 분석 과정¶
- \(T(n) = aT(\frac {n} {b}) + f(n)\) 으로 표현된 경우 정리를 통해 복잡도 계산 가능
-
\(h(n) = n^{log_b a}\)
-
\(\displaystyle \lim\_{n \to \infty} \frac{f(n)}{h(n)}\) 이 0으로
- 수렴하거나
- 무한대로 발산하거나
-
어떤 상수로 수렴하는가
-
위의 3가지 경우에 따라 점근적 복잡도 결정
마스터 정리 경우의 수¶
- \(T(n) = aT(\frac {n} {b}) + f(n)\), \(h(n) = n^{log_b a}\)
- \(\displaystyle \lim\_{n \to \infty} \frac{f(n)}{h(n)}\) 의 값이 0으로 수렴할 때 \(T(n) = \Theta(h(n))\)
- \(\displaystyle \lim\_{n \to \infty} \frac{f(n)}{h(n)}\) 의 값이 무한대로 발산할 때 \(af(\frac{n}{b}) \leq f(n)\) 이라면 \(T(n) = \Theta (f(n))\)
- \(\displaystyle \lim\_{n \to \infty} \frac{f(n)}{h(n)}\) 의 값이 \(\Theta(1)\) 일 때 \(\\Theta(h(n)log n)\)
ex 1) \(T(n) = 2(\frac{n}{3}) + c\)¶
- a = 2, b = 3, h(n) = \(n^{log_32}\), f(n) = c
- h(n)과 f(n)을 비교하면 h(n)의 차수가 높으므로 1번 정리에 해당
-
h(n)이 수행 시간 결정
-
수행 시간 : \(T(n) = \Theta(h(n)) = \Theta(n^{log_32})\)
ex 2) \(T(n) = 2(\frac{n}{4}) + n\)¶
- a = 2, b = 4, h(n) = \(n^{log_42}\), f(n) = n
- h(n)과 f(n)을 비교하면 f(n)의 차수가 높으므로 2번 정리에 해당
-
f(n)이 수행 시간 결정
-
수행 시간 : \(T(n) = \Theta(f(n)) = \Theta(n)\)
ex 3) \(T(n) = 2(\frac{n}{2}) + n\)¶
- a = 2, b = 2, h(n) = \(n^{log_22}\), f(n) = n
-
h(n)과 f(n)을 비교하면 차수가 동일하므로 3번 정리에 해당
-
수행 시간 : \(T(n) = \Theta(n log n)\)