마스터 정리 (Master Theorem)

분할 정복 알고리즘의 점화식 T(n)=aT(n/b)+f(n)을 세 가지 경우로 빠르게 해결하는 마스터 정리를 설명합니다.

· 5 min read · PALDYN Team

지난 글에서 점화식의 개념과 재귀 트리를 이용한 풀이법을 다뤘습니다. 이번에는 분할 정복 형태의 점화식 T(n) = aT(n/b) + f(n)을 손쉽게 해결하는 **마스터 정리(Master Theorem)**를 살펴봅니다. 마스터 정리만 제대로 이해하면 병합 정렬·이진 탐색·Strassen 알고리즘의 복잡도를 암산 수준으로 도출할 수 있습니다.

마스터 정리의 핵심 아이디어

T(n) = aT(n/b) + f(n)에서

  • a : 재귀 호출 수 (≥ 1)
  • b : 문제 크기 축소 비율 (> 1)
  • f(n) : 분할과 병합 비용

c = log_b(a) 를 기준값으로 정의합니다. n^c는 재귀 호출이 만들어내는 단말 노드 수(= 잎 레벨 비용)와 같습니다. f(n)과 n^c를 비교해 세 경우 중 하나를 적용합니다.

마스터 정리 세 가지 경우

Case 1 — 재귀 비용이 지배

f(n) = O(n^(c−ε)) for some ε > 0

f(n)이 n^c보다 다항식적으로 작으면, 재귀 호출 쪽이 전체 비용을 지배합니다.

결론: T(n) = Θ(n^c) = Θ(n^(log_b a))

예: T(n) = 8T(n/2) + n²

  • c = log₂8 = 3
  • f(n) = n² = O(n^(3−1)) → ε = 1 > 0 ✓
  • T(n) = Θ(n³) (일반 행렬 곱셈)

Case 2 — 두 비용이 균형

f(n) = Θ(n^c · log^k n) for some k ≥ 0

가장 자주 등장하는 경우입니다. k = 0 이면 f(n) = Θ(n^c).

결론: T(n) = Θ(n^c · log^(k+1) n)

예: T(n) = 2T(n/2) + n

  • c = log₂2 = 1
  • f(n) = n = Θ(n¹) = Θ(n^c · log⁰n) → k = 0 ✓
  • T(n) = Θ(n log n) (병합 정렬)

Case 3 — 결합 비용이 지배

f(n) = Ω(n^(c+ε)) for some ε > 0 이고 정규성 조건 a·f(n/b) ≤ δ·f(n) (δ < 1) 성립

f(n)이 n^c보다 다항식적으로 크면, 분할/결합 비용이 전체를 지배합니다.

결론: T(n) = Θ(f(n))

예: T(n) = 2T(n/2) + n²

  • c = log₂2 = 1
  • f(n) = n² = Ω(n^(1+1)) → ε = 1 ✓
  • 정규성: 2·(n/2)² = n²/2 ≤ (1/2)·n² ✓
  • T(n) = Θ(n²)

실전 적용 예시

마스터 정리 적용 예시

적용 순서 (체크리스트)

1. a, b, f(n) 확인
2. c = log_b(a) 계산
3. f(n)과 n^c 비교:
   - f(n) = O(n^(c-ε))   → Case 1: T(n) = Θ(n^c)
   - f(n) = Θ(n^c)       → Case 2: T(n) = Θ(n^c · log n)
   - f(n) = Ω(n^(c+ε))  → Case 3: T(n) = Θ(f(n))  [정규성 확인]

마스터 정리가 적용 안 되는 경우

# 아래 점화식들은 마스터 정리 불가
T(n) = T(n-1) + n          # 감소가 n/b 형태가 아님
T(n) = 2T(n/2) + n/log n   # f(n)이 n^c와 다항식 차이가 안 남
T(n) = T(sqrt(n)) + 1      # sqrt(n) = n^(1/2) 형태 — 변수 치환 필요

이런 경우에는 재귀 트리법이나 반복 대입법을 사용합니다.

Python으로 확인하기

import math

def master_theorem(a, b, fn_degree):
    """fn_degree: f(n) = n^fn_degree 라 가정 (단순 다항식 경우)"""
    c = math.log(a, b)
    eps = fn_degree - c
    if eps < -1e-9:
        case, result = 1, f"Θ(n^{c:.4g})"
    elif abs(eps) <= 1e-9:
        case, result = 2, f"Θ(n^{c:.4g} · log n)"
    else:
        case, result = 3, f"Θ(n^{fn_degree})"
    print(f"a={a}, b={b} → c={c:.4g}, Case {case}: {result}")

master_theorem(2, 2, 1)   # 병합 정렬 → Θ(n log n)
master_theorem(1, 2, 0)   # 이진 탐색 → Θ(log n)
master_theorem(7, 2, 2)   # Strassen  → Θ(n^2.807)

정리

  • 마스터 정리는 T(n) = aT(n/b) + f(n) 형태의 점화식을 세 경우로 즉시 해결합니다.
  • 핵심은 기준값 c = log_b(a)f(n)의 차수를 비교하는 것입니다.
  • Case 2 (k=0)가 실무에서 가장 자주 등장하며, f(n) = Θ(n^c)이면 결과는 Θ(n^c log n)입니다.
  • 다음 글에서는 본격적인 자료구조 파트의 첫 단계로 **스택(Stack)**을 다룹니다.

지난 글: 점화식

다음 글: 스택


읽어주셔서 감사합니다. 😊