마스터 정리 (Master Theorem)
정의
마스터 정리 (Master Theorem) 는 분할 정복 알고리즘의 시간 복잡도를 표현하는 점화식을 닫힌 형태 (closed form) 로 풀어주는 공식입니다.
적용 대상: 다음 형태의 점화식
- : 하위 문제 수
- : 크기 축소 비율
- : 분할/병합 비용
한 줄 요약: “분할 정복 알고리즘의 를 빠르게 판정”.
세 경우
임계 지수:
와 의 상대적 크기로 세 경우:
Case 1: (분할 비용이 작음)
의미: 재귀 트리의 잎 노드가 지배. 각 레벨에서 아래로 갈수록 일 커짐.
예:
- ,
- → Case 1
Case 2: (균형)
의미: 각 레벨의 일이 같음. 레벨 수 배.
예: (병합 정렬)
- ,
- Case 2
Case 3: (분할 비용이 큼)
+ regularity 조건 ():
의미: 재귀 트리의 루트 (최상위 호출) 가 지배.
예:
- ,
- → Case 3
- Regularity: ✓
시각화: 재귀 트리
Level 0: n 총 = n
/ \
Level 1: n/2 n/2 총 = n
/ \ / \
Level 2: n/4 n/4 n/4 n/4 총 = n
...
Level log n: 1 1 1 ... 1 (n 개) 총 = n
전체 = n * log n
개 레벨, 각 레벨 → .
알고리즘 적용 예시
| 알고리즘 | 점화식 | 결과 | Case |
|---|---|---|---|
| 이진 탐색 | 2 | ||
| 병합 정렬 | 2 | ||
| 퀵 정렬 (평균) | 2 | ||
| 카라추바 곱셈 | 1 | ||
| Strassen 행렬곱 | 1 | ||
| 이분 탐색 트리 | 3 | ||
| Closest Pair (2D) | 2 |
계산 절차
- , , 식별
- 계산
- 을 와 비교
- Case 판정 → 결과
예제:
- , ,
- vs : 이 큼 (polynomially larger, 팩터)
- Case 3
- Regularity: for some ✓
판정 흐름도
flowchart TD
A["T(n) = aT(n/b) + f(n)"] --> B["c = log_b(a) 계산"]
B --> C{"f(n) 대 n^c 비교"}
C -->|"f(n) poly smaller"| D["Case 1: Theta(n^c)"]
C -->|"f(n) same order"| E["Case 2: Theta(n^c log n)"]
C -->|"f(n) poly larger"| F{"Regularity 성립?"}
F -->|"Yes"| G["Case 3: Theta(f(n))"]
F -->|"No"| H["마스터 정리 적용 불가"]
Case 사이 gap
모든 경우가 마스터 정리로 안 풀림. 두 gap:
Gap 1-2:
보다 약간 작음, 하지만 polynomially not smaller. 마스터 정리 적용 X.
Gap 2-3:
보다 큼, 하지만 polynomially not larger.
확장 마스터 정리 (Case 2 확장):
예: →
Akra-Bazzi 방법
일반화된 마스터 정리. 다음 형태 처리:
- 여러 분할 크기 ()
- 마스터 정리보다 광범
예: →
수학적 배경 (integral) 필요. 대회에는 잘 안 나옴.
마스터 정리 로 안 되는 예
1. 감소 (subtraction) 점화식
→
→
→
직접 풀기 (반복 대입 또는 트리).
2. 불규칙 크기
→ 변수 치환 후
3. 로그 팩터
→ 마스터 정리 gap. 다른 방법.
실전 팁
- 분할 정복 알고리즘 설계 후 즉시 확인
- 재귀 트리 시각화 로 직관
- 암기하지 말고 유도
- Regularity 조건 잊지 말 것 (Case 3)
함정
WARNING
Case 3 regularity 확인 필수. 안 성립하면 마스터 정리 못 씀.
CAUTION
를 잘못 계산. 이지 아님.
WARNING
은 감소 형태. 마스터 정리 대상 아님 ().
IMPORTANT
재귀 트리로 확인. 마스터 정리 결과가 이해 안 되면 직접 그려보자.
CAUTION
Polynomial difference 필수. 이 와 다항적으로 (not just log) 커야 Case 1/3.
구현: 케이스 판정기
교육용 Python 스크립트. a, b, f 의 지수를 입력하면 케이스를 판정.
import math
def master_theorem(a, b, f_alpha, f_log_beta=0):
"""
T(n) = a T(n/b) + n^f_alpha * log^f_log_beta(n) 케이스 판정.
a: 하위 문제 수, b: 크기 축소 비율
f_alpha: f(n) 의 n 지수, f_log_beta: log 지수 (기본 0)
"""
c = math.log(a) / math.log(b)
eps = 1e-9
if f_alpha < c - eps:
return f"Case 1: T(n) = Theta(n^{c:.4g})"
elif abs(f_alpha - c) < eps:
k = f_log_beta + 1
if k > eps:
return f"Case 2: T(n) = Theta(n^{c:.4g} log^{k:.4g} n)"
else:
return "Gap: 마스터 정리 직접 적용 불가"
else:
return f"Case 3: T(n) = Theta(f(n)) [c={c:.4g}, regularity 확인]"
# 병합 정렬: T(n) = 2T(n/2) + n
print(master_theorem(2, 2, 1))
# 이진 탐색: T(n) = T(n/2) + 1
print(master_theorem(1, 2, 0))
# 카라추바: T(n) = 3T(n/2) + n
print(master_theorem(3, 2, 1))
# Strassen: T(n) = 7T(n/2) + n^2
print(master_theorem(7, 2, 2))
# 확장 Case 2: T(n) = 2T(n/2) + n log n
print(master_theorem(2, 2, 1, 1))Case 2: T(n) = Theta(n^1 log^1 n)
Case 2: T(n) = Theta(n^0 log^1 n)
Case 1: T(n) = Theta(n^1.585)
Case 1: T(n) = Theta(n^2.807)
Case 2: T(n) = Theta(n^1 log^2 n)관련 위키
이 글의 용어 (5개)
- 시간 복잡도 (Time Complexity)algorithm
- 정의 시간 복잡도 (Time Complexity) 는 입력 크기 N 이 증가할 때 알고리즘의 연산 횟수 증가율 을 나타낸다. PS 에서는 주로 최악 케이스 Big-O 표기법 을 …
- 이산수학 (Discrete Mathematics)discrete-math
- 정의 이산수학 (Discrete Mathematics) 은 이산 (discrete, 셀 수 있는) 대상을 다루는 수학의 분야입니다. 연속 (continuous) 대상 을 다루는 …
- 점화식 (Recurrence Relations)discrete-math
- 정의 점화식 (Recurrence Relation) 은 수열 $(an)$ 의 $n$ 번째 항을 앞선 항 (또는 몇 개) 로 표현하는 관계식입니다. 초기 조건 과 점화식이 함께 있…
- 증명 기법 (Proof Techniques)discrete-math
- 정의 증명 (proof) 은 명제가 참임을 논리적으로 확립하는 절차입니다. 컴퓨터 과학에서는 알고리즘 정확성, 자료구조 불변식, 암호 안전성, 형식 검증 등에 필수. 이 문서는 …
- Generating Functionalgorithm
- 정의 Generating Function (생성 함수) 은 수열 를 형식 멱급수 (formal power series) 으로 인코딩한 것. 수열의 산수 를 다항식 / 멱급수의 대…
💬 댓글