점화식(Recurrence Relation)
점화식(Recurrence Relation)
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)$에 도달 시 값 계산 가능
- $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$ 사용
팩토리얼 반복 대치
def factorial(n):
if n == 1: return 1
return n * factorial(n - 1)
- 알고리즘 수행 시간
- $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$ 가 틀리면 추정과 같은 결로에 도달 불가
- 증명식
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)$
This post is licensed under CC BY 4.0 by the author.