tmxklab
[알고리즘 기초] 05 재귀 트리(Recursion Tree Method) 본문
※ 재귀트리(Recursion Tree Method)
→ 좋은 추측식을 고안해내기 위한 직접적인 방법(치환법으로 추측이 불가능할 때)
→ 각 노드가 재귀호출되는 하위 문제 하나의 비용을 나타냄
→ 레벨당 비용의 집합을 얻기 위해 트리의 각 레벨마다 그 비용을 합한 후, 재귀의 모든 레벨에서의 총 비용을 결정하기 위해 모든 레벨당 비용을 합함
Example 1)
1단계 : 재귀트리를 이용하여 추측식을 구함
■ Recurrence : T(n)=3T(⌊n/4⌋)+Θ(n2)
1) 위 Recurrence식 수정
T(n)=3T(n/4)+cn2 // 내림과 올림은 그리 중요하지 않으므로 제거, c>0사용
2) 재귀트리 사용
n이 정확한 4의 거듭제곱이라고 가정(정수를 만들기 위해)


이때, 리프 노드의 비용은 총 리프 노드의 개수이므로 깊이가 k일 때, T(n)과 개수를 통해 다음과 같이 변환해준다.

이제, 깊이에 따른 비용의 합이 곧 "재귀 트리의 총 비용"이므로 식을 세운다.
i=0,1,2,⋯,log4(n−1)에 대해 모든 노드의 총 비용(이때, i는 깊이이며, 깊이 i의 각 노드 총 비용은 c⋅(n/4i)2이다.)


∴ Recurrence T(n)=3T(⌊n/4⌋)+Θ(n2)에 대해 T(n)=O(n2)라는 추측식을 이끌어냄
2단계 : 치환법을 이용하여 구한 추측식이 Recurrence식의 상한임을 검증
▶ Guess : T(n)=O(n2)
▶ Prove by induction : T(n)≤d⋅n2, 어떤 상수 d>0에 대해 만족해야 함
▶ Inductive assumption :
n<k가 참이면, (즉, T(n)≤d⋅n2)
n=k 또한 참임을 만족시켜야 한다.
특히, n=k/4에 대해 만족해야 한다. (즉, T(k/4)≤d⋅(k/4)2 )
T(k)=3T(⌊k/4⌋)+ck2, c>0
위의 식에 부등식을 대체(치환)하면,
T(k)≤3d⌊k/4⌋2+ck2
≤3d(k/4)2+ck2
≤(3/16)dk2+ck2
≤(3d/16+c)k2
≤dk2

∴d≥16c/13, T(k)≤dk2
Example 2)
1단계 : 재귀트리를 이용하여 추측식을 구함
■ Recurrence : T(n)=T(n/3)+T(n/2)+Θ(n)
1) 위 Recurrence식 수정
T(n)=T(n/3)+T(n/2)+cn
2) 재귀트리

위와 같이 확장했을 시 왼쪽 서브트리와 오른쪽 서브트리가 균형이 맞지 않는 것을 알 수 있다.
또한, 왼쪽 서브트리가 오른쪽 서브트리에 비해 더 빨리 T(1)에 가까워지는 것을 알 수 있다.


따라서, 루트부터 리프까지 가장 긴 경로는 오른쪽 서브트리
각 레벨의 비용 : cn
트리의 높이 : log2/3n
점화식의 해가 많아봐야 위의 두 식을 곱한 것을 넘지 않으므로(오른쪽 트리가 왼쪽 트리보다 노드 수가 더 많기 때문)
O(cn⋅log2/3n) = O(cn⋅log2/32⋅log2n) = O(nlgn)
또한, 리프의 비용을 고려하기 위해 트리 높이가 log2/3n인 완전 이진 트리라면,

∴ O(nlgn)
2단계 : 치환법을 이용하여 구한 추측식이 Recurrence식의 상한임을 검증
▶ Guess : T(n)=O(nlgn)
▶ Prove by induction : T(n)≤d⋅nlgn, d>0에 대해 만족해야 함
▶ Inductive assumption :
n<k이 참이면 (즉, T(n)≤d⋅nlgn)
n=k또한 만족해야 한다.
n=k/3, n=2k/3 => 부분적으로 귀납적 가정을 만족시켜야 함
즉, T(k/3)≤d(k/3)lg(k/3), T(2k/3)≤d(2k/3)lg(2k/3)
T(k)=T(k/3)+T(k/2)+2k
위의 식에 부등식을 대체(치환)하면,
T(k)≤d⋅(k/3)⋅lg(k/3)+d⋅(2k/3)⋅lg(2k/3)+ck
≤(d(k/3)lgk−d(k/3)lg3) + ≤(d(2k/3)lg2k−d(2k/3)lg3) + ck
≤dklgk−dk(lg3−2/3)+ck (lg2=1)
∴d≥c/(lg3−(2/3)), T(k)≤dklgk
'Algorithm' 카테고리의 다른 글
[정렬 알고리즘] 02 퀵 정렬(Quick Sort)이론 및 구현 (0) | 2020.01.31 |
---|---|
[정렬 알고리즘] 01 삽입 정렬(Insertion Sort)이론 및 구현 (1) | 2020.01.31 |
[알고리즘 기초] 04 치환법(Substitution Method) (0) | 2020.01.29 |
[알고리즘 기초] 03 점화식(Recurrence) (0) | 2020.01.28 |
[알고리즘 기초] 02 알고리즘 설계(분할 정복) (0) | 2020.01.28 |