"분할 정복은 야망 있는 재귀야: 어려운 문제를 독립된 더 작은 것으로 쪼개고, 각각 풀고, 결과를 꿰매. 쪼개기랑 꿰매기가 싸면, 이게 잔혹한 문제를 순하게 만들어."
세 박자 패턴
병합 정렬, 퀵소트, 이진 탐색에서 이미 분할 정복을 만났어 — 이제 공유 모양에 이름 붙여. 분할 정복 알고리즘은: 문제를 더 작은 독립 부분 문제로 나누고, 각각 재귀로 정복하고, 그 답을 전체 해법으로 결합해. 예술은 나누기랑 결합 단계에; 정복은 그냥 '재귀하고 믿어' (믿음의 도약). 이진 탐색이 최소 케이스 — 둘로 나누지만 한 절반만 재귀해, 정확히 그래서 O(log n).
비용을 결정하는 것
재귀-트리 lesson 에서: 비용은 세 손잡이에 달렸어 — 각 호출이 부분 문제를 몇 개 낳고 (분기), 얼마나 작아지고 (줄이는 속도), 나누고 결합하는 일. 병합 정렬: 부분 문제 2개, 각자 반-크기, O(n) 결합 → O(n log n). 이진 탐색: 사실상 부분 문제 1개, 반-크기, O(1) 결합 → O(log n). master theorem 이 이걸 공식으로 바꾸지만, 직관이면 충분해: 싼 결합 + 좋은 줄이기 = 빠른 알고리즘. 결합 단계가 무차별보다 비싸면, 분할 정복은 안 도와 — 그래서 영리함이 부분답을 함께 꿰매는 싼 방법 찾기에 살아.
깔끔한 승리: 빠른 거듭제곱
분할 정복이 허공에서 속도 향상을 만드는 거. a^n 을 당연한 방식으로 계산하면 n−1 곱셈, O(n). 근데 a^n = (a^(n/2))² — 그래서 a^(n/2) 를 한 번 계산하고, 제곱하면, 한 곱셈에 지수를 반 냈어. 재귀하면, 지수가 매 단계 절반: O(n) 대신 O(log n) 곱셈. a^1000000 이 백만이 아니라 ~20 곱셈. 이 '제곱에 의한 거듭제곱' 이 사방에 있어 — 암호학이 수를 거대 거듭제곱하는 법이고, 행렬-거듭제곱 트릭이 피보나치를 O(log n) 에 계산하는 법. 병합 정렬이랑 같은 패턴, 산술을 겨눈.
피파의 고백
a^n = (a^(n/2))² 를 칠판에 쓰고 물었어, "백만을 몇 번 반 낼 수 있어?" 약 스무 번. 루프는 백만 곱셈을 했고; 제곱은 스무 번. 난 분할 정복을 '정렬이 하는 것' 으로 봤는데, 일반 지렛대야: 크기 n 문제를 크기 n/2 문제에서 싸게 다시 지을 수 있으면, 종종 O(n) 을 O(log n) 으로 맞바꿔. 이젠 그 절반 내기를 어디서나 찾아.