1. 점화식이란?
재귀 알고리즘의 실행 시간을 분석하려면 새로운 도구가 필요하다. 단순 반복문은 시그마(Σ)로 셀 수 있지만, 알고리즘이 자기 자신을 호출하면 얘기가 달라진다.
점화식(Recurrence Relation) 은 수열의 항을 이전 항들로 표현하는 식이다.
예를 들어 Selection Sort를 재귀로 구현하면:
- n개짜리 리스트에서 최솟값 찾기: n번
- 나머지 n-1개를 재귀적으로 정렬
이걸 점화식으로 쓰면:
T(n) = n + T(n-1), T(0) = 0
풀면: T(n) = n + (n-1) + (n-2) + ... + 1 = Θ(n²)
재귀로 구현해도 문제 크기를 1씩 줄이는 건 너무 느리다. 그래서 "절반씩 나누는" Divide and Conquer(분할정복)이 필요하다.
2. Master Theorem
분할정복 알고리즘은 대부분 이 패턴을 따른다:
T(n) = a·T(n/b) + Θ(nᵈ), T(1) = Θ(1)
각 파라미터의 의미:
- a: 서브문제 개수 (몇 개로 나누는가)
- b: 입력 크기가 줄어드는 배수 (얼마나 작아지는가)
- d: 재귀 호출 외 작업의 복잡도 (나누고 합치는 데 드는 비용)
Critical exponent e = log_b(a) 를 구한 뒤 d와 비교한다.
| 조건 | 결과 | 직관 |
|---|---|---|
| d > e | T(n) = Θ(nᵈ) | 루트(현재 단계)가 지배 |
| d = e | T(n) = Θ(nᵈ log n) | 모든 레벨이 균등하게 기여 |
| d < e | T(n) = Θ(nᵉ) = Θ(n^(log_b a)) | 리프(가장 깊은 단계)가 지배 |
예시 1 — Merge Sort:
T(n) = 2T(n/2) + Θ(n)
a=2, b=2, d=1 → e = log₂2 = 1
d = e이므로 T(n) = Θ(n log n)
예시 2 — 일반 분할정복:
T(n) = 4T(n/2) + Θ(n)
a=4, b=2, d=1 → e = log₂4 = 2
d < e이므로 T(n) = Θ(n²)
예시 3:
T(n) = 3T(n/3) + Θ(n²)
a=3, b=3, d=2 → e = log₃3 = 1
d > e이므로 T(n) = Θ(n²)
3. Linear Recurrence — Generating Function
Master Theorem은 n/b 형태(입력을 나누는 것)에만 쓸 수 있다. 피보나치처럼 n-1, n-2 형태(빼는 것)엔 적용 불가다. 이때는 Generating Function을 쓴다.
아이디어
점화식은 aₙ이 aₙ₋₁, aₙ₋₂에 의존하고 있어서 직접 풀기 어렵다. 그래서 수열 전체를 하나의 함수로 포장해 버린다:
F(x) = a₀ + a₁x + a₂x² + a₃x³ + ...
이렇게 하면 점화식이 F(x)에 대한 대수 방정식으로 바뀌고, 그걸 풀어서 x^n의 계수를 읽으면 aₙ이 나온다.
핵심 트릭: x를 곱하면 계수가 한 칸 밀린다
- F(x)의 x^n 계수 → aₙ
- x·F(x)의 x^n 계수 → aₙ₋₁
- x²·F(x)의 x^n 계수 → aₙ₋₂
풀이 흐름
① F(x) 방정식 세우기
점화식을 보고 F(x)에서 뭘 빼야 할지 결정한다.
aₙ = aₙ₋₁ + 6aₙ₋₂이면 → F(x) - x·F(x) - 6x²·F(x)를 전개한다.
전개하면:
- n≥2인 항: 점화식에 의해 자동으로 0이 됨
- n=0, n=1 항만 남음
(1 - x - 6x²)F(x) = a₀ + (a₁ - a₀)x
주의: x의 계수는 a₁이 아니라 (a₁ - a₀) 다. x를 곱하면 F(x)의 a₀이 x¹ 자리로 밀려오기 때문에, 그걸 빼고 남은 값이 계수가 된다. 추측하지 말고 직접 전개해서 계산하는 습관을 들이자. 연습문제를 혼자 처음 풀 때 주어진 F(x)값을 보정하기 위해서 a_0과 a_1을 그냥 더해서 구했다가 점화식을 직접 전개했을 때의 값과 달라서 뭐가 틀렸는지 찾느라 한참 걸렸다.
a₀=1, a₁=1이면: (1 - x - 6x²)F(x) = 1 + (1-1)x = 1
F(x) = 1 / (1 - x - 6x²)
② 분모 인수분해 + 부분분수 분해
1 - x - 6x² = (1-3x)(1+2x)이므로:
F(x) = A/(1-3x) + B/(1+2x)
A, B 구하는 법: 양변에 분모를 곱한 뒤, 한쪽 항이 0이 되는 x값을 대입한다.
- x = 1/3 대입 → B항 사라짐 → A = 3/5
- x = -1/2 대입 → A항 사라짐 → B = 2/5
③ 등비급수로 계수 추출
등비급수 공식: 1/(1-r) = Σ rⁿ
- 1/(1-3x) = Σ (3x)ⁿ = Σ 3ⁿ xⁿ
- 1/(1+2x) = 1/(1-(-2x)) = Σ (-2x)ⁿ = Σ (-2)ⁿ xⁿ
따라서:
aₙ = (3/5)·3ⁿ + (2/5)·(-2)ⁿ = (3^(n+1) + 2·(-2)ⁿ) / 5
검증:
- a₀ = (3 + 2) / 5 = 1 ✓
- a₁ = (9 - 4) / 5 = 1 ✓
- a₂ = (27 + 8) / 5 = 7 ✓ (점화식: 1 + 6·1 = 7)
4. 피보나치와 Binet's Formula
피보나치도 같은 방식으로 풀 수 있다.
f₀=0, f₁=1, fₙ = fₙ₋₁ + fₙ₋₂
F(x) = x / (1 - x - x²)
분모의 근이 황금비 φ = (1+√5)/2 ≈ 1.618, ψ = (1-√5)/2 ≈ -0.618과 관련되어 있어서, 부분분수 분해 후 정리하면:
fₙ = (φⁿ - ψⁿ) / √5
|ψ| < 1이므로 ψⁿ → 0. 피보나치는 지수적으로 증가하고, 충분히 큰 n에서 fₙ ≈ φⁿ / √5가 된다.
5. 핵심 정리
Master Theorem 요약:
| 조건 | T(n) |
|---|---|
| d > e = log_b(a) | Θ(nᵈ) |
| d = e | Θ(nᵈ log n) |
| d < e | Θ(nᵉ) |
Generating Function 흐름:
점화식 세우기 → F(x) 방정식 전개 (직접 계산!) → closed form → 부분분수 → 등비급수로 aₙ 추출
'공부 기록 > 이산구조' 카테고리의 다른 글
| 이산구조를 마치며: 유한하고 이산적인 세계를 엄밀하게 다루는 법 (0) | 2026.06.18 |
|---|---|
| 24. Series (0) | 2026.06.14 |
| 23. Counting Subsets (0) | 2026.06.11 |
| 18. Coloring (0) | 2026.06.10 |
| 17. Connectivity (0) | 2026.06.09 |