21문제로 보는 알고리즘의 한 풍경. 약 359,000자.
도구를 알면, 도구가 태어난 세계가 보인다.
"프로그래밍의 어려움은 우리의 도구가 아직 어리다는 데 있다. 도구가 자라기를 기다리는 동안, 우리는 도구를 읽어야 한다." — Edsger W. Dijkstra, The Humble Programmer (1972 ACM Turing Award lecture)
이 책의 모든 장은 어딘가에 문 이 하나 서 있다. 문 뒤에는 알고리즘이 살고, 문 앞에는 그 알고리즘이 처음 마주쳤던 현실 문제가 놓여 있다. 우리는 스물한 개의 문을 차례로 두드린다.
이 스물한 개는 어디서 온 것일까. 자매책 — cho.books 책방의 expert-algorithms — 에 풀이가 정리되어 있는 Expert 난도의 알고리즘 대회 문제 스물한 개에서 왔다. 풀이 자체는 그 책에 있다. 의사코드, 자료구조 선택, 시간 복잡도 계산까지. 그런데 풀이를 다 읽고 나면 매번 같은 자리에서 멈춘다. 왜 이렇게 풀어야 하는가. 왜 다익스트라가 이 자리에서 옳고, 왜 그리디는 저 자리에서 무너지며, 왜 시뮬레이티드 어닐링은 온도를 그렇게 떨어뜨려야 하는가. 풀이의 옳음 은 풀이 안에서는 답해지지 않는다. 그 답은 그 알고리즘 자체 의 역사와 정리와 증명 안에 있다.
이 책은 그 왜 를 위한 책이다. 풀이가 아니라, 풀이를 떠받치는 도구 — 알고리즘 그 자체 — 가 주인공이다. 그래서 한 장에 한 알고리즘이 들어가고, 그 알고리즘이 태어난 자리부터, 그것이 무엇을 보장하는지의 정리와 증명까지, 끝까지 따라간다. 스물한 개의 알고리즘은 — 다익스트라, 로컬 서치, 그리디 교환, 유니온-파인드, 시뮬레이티드 어닐링, 파티클 필터, 적분 영상, … — 컴퓨터 과학의 한 세기를 가로지른다. 1956년 로테르담의 자판기 옆부터 1990년대 잠수함 항법 필터까지. 우리는 그 한 세기의 단면을 스물한 번 베어내 들여다본다.
스물한이라는 숫자에 깊은 뜻은 없다. Expert 문제의 풀이가 거기까지 정리되어 있었고, 그 스물한 개가 마침 컴퓨터 과학의 굵직한 가지들을 골고루 건드리고 있을 뿐이다. 그래도 이 책을 다 읽었을 때 독자가 가진 알고리즘 지도는, 어떤 의미에서는, 그래프와 흐름과 탐색과 확률과 기하의 굵은 줄기들을 다 한 번씩 더듬어 본 셈이 된다.
그 지도를 미리 펴 보면 이렇다. 그래프 위의 거리 가 세 장에 나타난다 — 다익스트라 (1장), BFS layering (6장), MST (12장). 조합 최적화의 휴리스틱 이 네 장을 통과한다 — 로컬 서치 (2장), NN+Or-opt (5장), 시뮬레이티드 어닐링 (8장), VRP 의 Savings (14장). 흐름과 매칭 이 두 장 — Min-Cost Flow (7장), Hungarian (10장). 동적 계획법과 그 변주 가 두 장 — Bitmask DP (11장), Convex Hull Trick (16장). 기하 가 세 장 — Sweep Line (9장), Integral Image (13장), Closest Pair (21장). 확률과 추정 이 두 장 — Lloyd k-means (19장), Particle Filter (20장). 온라인과 게임 이 두 장 — 온라인 알고리즘 (17장), Pursuit-Evasion (18장). 자료구조 가 한 장 — Union-Find (4장). 근사 알고리즘 이 한 장 — Facility Location (15장). 교환 논증 이 한 장 — 그리디 교환 (3장). 스물한 가지 가지가 마치 한 그루의 나무처럼 줄기에서 갈라져 나간다.
이 나무의 뿌리는 어디인가. 깊이 들어가 보면 — 책의 후기 (제22장) 에서 한 번 더 정리하겠지만 — 두 가지 뿌리가 있다. 최적성을 어떻게 보장하는가 의 뿌리와, 최적성이 불가능할 때 무엇을 보장하는가 의 뿌리. 다익스트라·MST·Hungarian·Flow 가 첫 번째 뿌리에서 자랐고, 로컬 서치·SA·VRP·근사·온라인이 두 번째 뿌리에서 자랐다. 둘 사이의 경계선 — 정확히 그 경계선 — 위에 Expert 문제들이 놓여 있다.
책 전체를 가로지르는 두 개의 줄이 있다. 두 개의 줄은 시작은 다르지만 결국 같은 그림으로 모인다.
바깥 줄: 도구와 세계. 알고리즘은 진공에서 태어나지 않는다. 다익스트라의 알고리즘은 1956년 로테르담의 자판기 옆에서, 머릿속에서, 암스테르담에서 흐로닝언까지 의 최단 경로를 잡으려다 떠올랐다고 본인이 회상한다. 유니온-파인드의 경로 압축은 1964년 Hopcroft 와 Ullman 이 Fortran 컴파일러의 등가 클래스 합병을 더 빠르게 하려고 다듬은 것이고, 파티클 필터는 1960년대 군용 잠수함의 항법 필터에서 가지를 친 사촌이다. 알고리즘은 어떤 현실 문제 가 어떤 책상 위에 놓였을 때 누군가의 손 으로 종이에 옮겨진다. 책상과 손과 종이를 빼면, 알고리즘은 절반쯤 잃어버린다. 우리는 그 절반을 되찾는다.
안쪽 줄: 그리디가 끝나는 곳. Expert 난도의 문제는 거의 모두가 단순 그리디로는 풀리지 않는 자리에 있다. 그 경계선 — 그리디가 무너지는 그 자리 — 에 서 보면 신기한 풍경이 보인다. 그 자리에 로컬 서치 가 태어났고, 시뮬레이티드 어닐링 이 태어났고, 교환 논증 (exchange argument) 이라는 정밀한 도구가 태어났다. 그리디가 왜 무너지는지 알면, 그것을 어떻게 메우는지가 자연스럽게 따라온다. 책 전체가 "그리디 → 그리디가 무너지는 지점 → 무너진 자리를 메우는 방법" 의 변주다.
두 줄은 결국 한 그림이다. 알고리즘은 어떤 현실 문제 (바깥 줄) 가 그리디로는 안 되는 자리에 놓였을 때 (안쪽 줄) 누군가에 의해 발명되어 왔다. 그 발명을 따라가는 일이 곧 이 책의 일이다.
조금 더 구체적으로 말하면 이렇다. 그리디 — 매 순간 가장 좋아 보이는 선택을 내리는 전략 — 는 놀랍게도 어떤 문제에서는 전역적으로 최적이다. 다익스트라 알고리즘은 그리디인데도 최단 경로를 정확히 찾는다. MST 의 크루스칼·프림도 그렇다. 매트로이드 위의 최적화는 모두 그렇다. 이게 가능한 이유는 그 문제들의 구조 — 부분 구조의 최적성, 교환 가능성, 매트로이드 성질 — 가 그리디의 근시안 을 전체 시야 와 일치시키기 때문이다. 책의 1, 3, 4, 12 장은 이 풍경 안에 있다.
그러나 외판원 문제 (TSP) 에서는 그리디가 무너진다. 가장 가까운 도시로 가는 욕망 — Nearest Neighbor — 은 결국 최악의 경우 최적해의 ⌈log n⌉ 배까지 늘어날 수 있다 (Rosenkrantz–Stearns–Lewis, 1977). 시설 입지 (Facility Location) 에서도, VRP 에서도, k-center 에서도 마찬가지다. 그리디는 가까운 미래만 본다. 멀리 보는 것이 수학적으로 불가능한 문제들이 있다. NP-난해의 핵심이 거기 있다. 그래서 — 그리디가 끝나는 자리에서 — 우리는 국소 최적 (local optimum) 을 잡아내는 로컬 서치 를, 국소 최적의 함정에서 빠져나오는 시뮬레이티드 어닐링 의 무작위 점프를, 그리고 최악의 경우 비율 (approximation ratio) 을 정량적으로 보장하는 근사 알고리즘 의 LP 라운딩을 발명했다. 2, 5, 8, 14, 15, 17 장이 이 풍경 안에 있다.
그리고 그 사이 — 그리디가 무너지지는 않았지만 단순 그리디만으로는 충분하지 않은 자리 — 에는 다른 종류의 보강이 필요하다. 6장의 BFS layering 은 다익스트라를 층별로 잘라 더 빠르게 만들고, 7장의 Min-Cost Flow 는 그리디를 전체 경로 단위로 묶고, 11장의 Bitmask DP 는 상태 공간 자체를 잘게 쪼개 그리디의 시야를 모든 부분집합 으로 확장한다. 한 권의 책 안에서 이 모든 변주를 한 번씩 본다는 것은, 알고리즘 설계의 언어 를 배운다는 것이다.
이 책은 두 가지 방향으로 읽을 수 있다.
순서대로 읽으면 — 1장에서 21장까지 — 알고리즘이 등장하는 순서 는 곧 사용자가 Expert 문제를 풀어본 순서다. 1장의 다익스트라는 4장의 유니온-파인드와 12장의 크루스칼 MST 안에서 다시 등장한다 (한 번은 거리 함수를 다루는 자료구조로, 다음에는 사이클 검출의 자료구조로). 6장의 BFS layering 은 1장의 다익스트라의 원시 형태 였다는 사실이 두 장 사이의 거리만큼 천천히 드러난다. 같은 도구가 다른 옷을 입고 다른 장에 나타나는 모습을 따라가는 것은, 한 도구가 어떻게 진화 하는지를 보는 일이기도 하다.
알고리즘별로 골라 읽으면 — 책 끝의 index.md 가 길잡이가 된다 — 한 장만 떼어 읽어도 그 알고리즘 하나 에 대해서는 다른 어떤 한국어 자료보다 더 깊이 알고 일어난다. 한 장은 자체로 완결되어 있다. 다른 장을 참조하는 자리는 모두 참고용 일 뿐, 그 장을 이해하기 위해 다른 장을 먼저 읽을 필요는 없다. 이건 약속이다. 책의 어느 장이든 첫 페이지에서 시작해 마지막 페이지까지 닫혀 있다.
대부분의 독자는 두 방식을 섞을 것이다. 1장부터 시작해서 흐름을 타다가, 8장의 시뮬레이티드 어닐링이 흥미로워지면 그 장에 머무르고, 다음 날 12장의 MST 로 건너뛰어도 좋다. 책은 그렇게 읽혀지도록 짜여 있다.
스물한 장 모두가 같은 골격 으로 짜여 있다. 일관성이 곧 가독성이고, 일관성이 곧 신뢰다.
각 장은 세 층으로 나뉜다.
§ Light (가벼이 읽는 층, 약 12쪽). 문제의 세계, 도구의 탄생, 한눈에 보는 알고리즘. 의사코드 한 쪽과 그림 한 장이 들어 있다. 여기까지 읽으면 그 알고리즘이 무엇을 하는 알고리즘인지 — 입력과 출력, 핵심 아이디어 — 가 잡힌다. 누워서 읽어도 좋은 층이다.
§ Deep (깊이 들어가는 층, 약 28쪽). 정의와 표기, 핵심 보조정리, 정확성 정리와 그 증명, 복잡도 정리와 그 증명, 변형 알고리즘들. 수식이 등장하고 증명이 끝까지 풀린다. 이 층은 대학교 교재 의 깊이다. 차 한 잔 곁에 두고, 한 절씩 천천히 읽어야 할 층이다. 모든 수식과 정리 앞에는 왜 이 식이 필요한가 의 평문 단락이 한 번씩 선행한다. 수식을 잠시 건너뛰어도 결론은 잡히도록 만들었지만, 결국 돌아와서 수식을 마주칠 때 그 자리에서 길을 잃지 않게 길잡이를 깔아두었다.
§ Origin (뿌리로 돌아가는 층, 약 8쪽). 원논문 산책, 인물과 시대, Expert 문제로 돌아오기. 그 알고리즘의 원논문을 PDF 로 펴 두고 한 단락씩 짚어가며 어떻게 읽는지 — 그 시대의 표기로 어떻게 옮겨야 하는지 — 풀어준다. 발명자의 약력과 그 시대의 분위기. 마지막에는 자매책 expert-algorithms 의 풀이 글로 가는 다리가 놓여 있다. 이 장에서 다룬 알고리즘이 Expert N번 풀이의 어느 줄에서 어떻게 살아 있는지 가 한두 단락에 정리된다.
세 층의 합은 한 장에 약 24,000자 — 단행본의 한 챕터로 매우 두꺼운 분량이다. 모든 장이 그렇다. 스물한 장과 서문·후기를 합치면 책은 약 900쪽 안팎의 단행본이 된다.
이 책이 하지 않는 일을 분명히 밝혀두는 것이 정직하다. 책의 성격은 거기서 더 잘 드러난다.
이 책은 — 풀이의 코드 자체를 다시 설명하지 않는다. Expert N번 문제의 코드는 자매책에 이미 있다. 우리는 코드의 옳음의 근거 인 알고리즘 자체에 머문다.
이 책은 — 경시대회를 위한 책이 아니다. 트릭, 팁, 시간 복잡도 계산 연습이 아니라, "이 알고리즘이 왜 이런 모양인가" 가 주제다. 시험 직전에 펼치는 책이 아니라, 자기 전에 펼치는 책이다.
이 책은 — 연습문제가 없다. 끝까지 산문이다. 한 페이지를 넘기는 일과 한 문제를 푸는 일은 다른 일이라고 본다. 풀고 싶다면 자매책의 Expert 문제를 풀면 된다. 거기에 풀이가 있다.
이 책은 — 부정확한 일화를 단정형 으로 인용하지 않는다. "다익스트라가 결혼식 다음 날 알고리즘을 발명했다" 같은 이야기 — 매혹적이지만 출처가 분명치 않은 — 는 전해진다 거나 본인 회상에 따르면 으로 명시한다. 책의 신뢰도는 한 줄의 단정형이 무너지면 무너진다.
이 책은 — 인터랙티브 시각화가 없다. 자매책 expert-algorithms 가 그 일을 한다. 이 책은 읽는 책이다. 한 손에 들고, 누워서.
이 책은 자매책과 상보적 관계다.
| expert-algorithms (자매책) | expert-algorithms-textbook (이 책) | |
|---|---|---|
| 주인공 | 문제와 풀이 | 알고리즘 자체 |
| 어조 | 풀이의 단계와 시각화 | 정의-정리-증명의 산문 |
| 핵심 분량 | deep-dive 21편 (장당 8~12p) | chapter 21장 (장당 40~50p) |
| 묻는 질문 | "어떻게 풀었는가?" | "왜 이렇게 풀어야 하는가?" |
| 매체 | 인터랙티브 웹 + 시각화 | 누워서 읽는 md/책 |
두 책은 §11 (Expert 문제로 돌아오기) 에서 한 번씩 손을 맞잡는다. 이 책의 §11 은 짧다 — 두 단락 정도. 그 두 단락이 끝나는 자리에 자매책 deep-dive 글로 가는 다리가 놓여 있다. 다리를 건너면 풀이의 코드와 시각화가 기다린다. 다리를 건너지 않아도 — 이 책만 읽어도 — 알고리즘 자체는 닫혀 있다.
자매책을 읽지 않은 독자도 이 책을 읽을 수 있다. Expert 문제의 자세한 내용을 모르더라도, 각 장의 §1 (문제의 세계) 이 문제의 윤곽을 충분히 그려준다. 이 책은 자매책의 부록 이 아니다 — 자매책과 나란히 서 있는 책이다.
이제 첫 장으로 들어간다.
1956년 로테르담. 28세의 Edsger W. Dijkstra (1930–2002) 가 약혼자와 함께 시내 어딘가의 카페에서 커피를 마신다. 약혼자가 화장실에 간 사이, 그는 자판기 옆에 앉아 멍하니 생각한다 — 새 컴퓨터 ARMAC 의 시연을 위해 무슨 문제 를 풀어 보일까. 머릿속에 떠오른 문제는 단순했다. 네덜란드의 도시 64개를 잇는 도로망 위에서, 암스테르담에서 흐로닝언까지의 최단 경로 를 구하는 것. 그는 펜과 종이 없이, 카페 안에서, 머릿속으로 알고리즘을 짠다. 본인의 회상에 따르면 20분쯤 걸렸다. 그 알고리즘이 3년 뒤 1959년 Numerische Mathematik 의 두 페이지짜리 논문이 되었고, 그 논문은 오늘날 모든 컴퓨터 과학 교과서의 Chapter 22 안팎에 자리잡았다.
그 자판기 옆에서, 28세의 청년의 머릿속에서, 정확히 무엇 이 일어났는가. 그가 본 것은 무엇이며, 우리가 지금 그 풍경을 다시 보려면 어떤 길로 들어가야 하는가.
다음 페이지를 넘기면, 그 자판기 옆에 함께 앉는다.
다음 장: 제1장 — 로봇청소기 · Dijkstra
그리디는 빠르고, 다익스트라는 옳다. 그리고 가끔, 둘은 같다.
"Problem 2. Construct the tree of minimum total length between the n nodes. Problem 1. Construct the path of minimum total length between two given nodes P and Q." — Edsger W. Dijkstra, A Note on Two Problems in Connexion with Graphs, Numerische Mathematik 1 (1959), p. 269.
| 항목 | 값 |
|---|---|
| Expert № | 01 |
| 주연 | Dijkstra's algorithm (Edsger W. Dijkstra, 1959) |
| 조연 | A*, Bidirectional Dijkstra, Bellman–Ford, Fibonacci heap Dijkstra, Δ-stepping, Thorup, Dial |
| 원논문 | Dijkstra (1959). "A Note on Two Problems in Connexion with Graphs." Numerische Mathematik 1: 269–271. |
| 대표 교과서 | CLRS Ch. 22.3, Sedgewick–Wayne §4.4 |
| 분량 체크 | ⬜ Light(?자) ⬜ Deep(?자) ⬜ Origin(?자) |
한밤중의 사무실. 사람들은 모두 퇴근했고, 형광등은 절전 모드로 흐릿하다. 책상 사이를 누비며 한 마리의 작은 기계 — 로봇 청소기 — 가 일을 시작한다. 로봇은 매 순간 단순한 결정을 내려야 한다. 어디로 갈 것인가. 같은 자리를 또 청소하는 것은 점수 깎임이고, 미청소 칸을 끝까지 남기는 것은 즉시 실격이다. 시간도 무한하지 않다. 정해진 턴 안에 사무실 전체를 빠짐없이, 그러나 겹치지 않게 청소해야 한다.
로봇의 시야는 좁다. 자기가 서 있는 칸과 그 주변 몇 칸만이 보인다. 멀리 떨어진 미청소 칸이 어디에 있는지는 모른다. SCAN 이라는 비싼 동작을 호출하면 더 넓게 볼 수 있지만, SCAN 자체가 시간을 갉아먹는다. 너무 많이 호출하면 청소가 끝나기 전에 시간이 모두 닳는다.
이 작은 기계의 머릿속에 들어가 보면, 두 가지 결정이 동시에 일어나고 있다. 어디를 청소할지 (이동 전략) 와 어디까지 봐 둘지 (정보 전략). Expert 1번 — 로봇청소기 — 의 세계는 정확히 이 두 결정의 협주다. 이 장에서는 그 협주 안에서 이동 전략 의 한쪽 끝에 있는 도구를 본다. 다익스트라 알고리즘이다.
다익스트라가 푸는 질문은 단순하다. 그래프가 주어졌을 때, 시작점 s 에서 모든 다른 정점까지의 최단 거리 를 구하라. 간선의 가중치는 음수가 아니라고 가정한다 — 이것이 곧 알고리즘의 옳음을 떠받치는 단 하나의 가정이다. 로봇청소기의 격자 세계에서는, 각 칸이 정점이고, 이웃한 칸 사이가 가중치 1의 간선이다 (이동 비용이 균일하니까). "이 칸에서 가장 가까운 미청소 칸은 어디인가" 라는 로봇의 일상적 질문은, 곧 다익스트라가 푸는 단일 출발점 최단 경로 문제다.
그러나 로봇은 다익스트라를 매 순간 호출할 수는 없다. 호출당 비용이 크기 때문이다. 64×64 격자의 모든 칸을 한 번 다익스트라로 펼치면 약 4,000 개의 정점을 우선순위 큐에 넣고 빼야 한다. 매 턴마다 이 일을 하면 시간이 닳는다. 그래서 로봇은 다익스트라를 언제 부를지 영리해야 한다. 인접한 미청소 칸이 있는 동안에는 그리디 보행으로 충분하다 — 그냥 그쪽으로 한 칸 가면 된다. 그리디가 막혀 사방이 청소됐거나 벽일 때, 비로소 다익스트라를 부른다. 다익스트라는 비싸지만 옳다. 그리디가 막힌 그 자리에서 가장 가까운 미청소 칸까지의 최소비용 경로를 정확히 찾아 준다.
이 협주 — 싸고 빠른 그리디 와 비싸지만 옳은 다익스트라 의 협주 — 가 Expert 1번 풀이의 골격이다. 그런데 이 협주가 왜 옳은가 라는 질문은, 풀이의 코드를 아무리 들여다봐도 답해지지 않는다. 그 답은 다익스트라 알고리즘 자체의 정리와 증명 안에, 그리고 1956년 로테르담의 한 자판기 옆에서 일어난 일 안에 있다.
1956년 어느 봄날, 네덜란드 로테르담. 28세의 청년 에드스거 다익스트라는 약혼자 마리아와 함께 시내 카페에서 커피를 마시고 있다. 마리아가 잠시 자리를 비운 사이, 다익스트라는 자판기 옆 의자에 앉아 멍하니 생각에 잠긴다. 머릿속을 채운 것은 — 일주일 뒤로 다가온 — 새 컴퓨터 ARMAC 의 공식 시연이었다. ARMAC 은 그가 일하던 암스테르담 Mathematisch Centrum 이 막 완성한 네덜란드의 새 컴퓨터. 시연에서 무슨 문제 를 풀어 보일 것인가. 그 문제는 결과가 눈으로 보기에 명백 해야 했고, 동시에 기계가 사람보다 잘하는 것이어야 했다.
머릿속에 떠오른 문제는 단순했다. 네덜란드의 도시 64개 — 암스테르담, 로테르담, 헤이그, 위트레흐트, 흐로닝언 ··· — 가 도로망으로 이어져 있다. 두 도시 사이에는 거리가 있다. 암스테르담에서 흐로닝언까지의 최단 경로 를 찾아라. 사람이 지도를 펴 놓고 풀려면 한참 걸리지만, 답은 한 줄의 수로 떨어진다. 시연에 딱 맞는다.
다익스트라는 펜과 종이를 꺼내지 않는다. 자판기 옆 의자에 앉은 채로, 머릿속에서, 알고리즘을 짠다. 본인의 회상에 따르면 — 2001년 Communications of the ACM 인터뷰 — 약 20분 만에 알고리즘이 완성된다. 마리아가 자리에 돌아왔을 때, 그는 새 알고리즘 하나를 머릿속에 담고 있었다. "Twenty minutes later, I had the algorithm." 이 인용은 본인이 직접 한 말이다.
자판기 옆에서 떠올린 그 알고리즘은 너무도 단순했다. 모든 정점에 "현재까지의 최단 거리 추정값" 을 적어 둔다. 시작점은 0, 나머지는 무한대. 그리고 가장 작은 추정값을 가진 정점을 하나 골라 — 그것이 확정 된 정점이다 — 그 정점에서 뻗어 나가는 모든 간선을 완화 (relax) 한다. 즉, 이웃 정점의 추정값을 "지금까지의 추정값" 과 "확정 정점을 거쳐 가는 거리" 중 작은 쪽으로 갱신한다. 그리고 다시 가장 작은 추정값을 가진 정점을 고른다. 이 과정을 모든 정점이 확정될 때까지 반복한다.
다익스트라는 자판기 옆에서 떠올린 이 알고리즘을 사흘 뒤 사무실에서 종이에 옮겨 적었고, 3년 뒤인 1959년 Numerische Mathematik 1권 269~271 페이지에 두 페이지짜리 노트로 발표했다. 제목은 A Note on Two Problems in Connexion with Graphs — "그래프와 관련된 두 문제에 관한 노트". 두 문제 중 하나는 최단 경로 (Problem 1), 다른 하나는 최소 신장 트리 (Problem 2). 자판기 옆에서 동시에 두 문제를 풀어낸 셈이다.
이 두 페이지짜리 노트가 — 66년이 지난 오늘날까지 — 모든 컴퓨터 과학 교과서의 한 장을 차지하고, 모든 GPS 내비게이션의 핵심에 자리잡고, 그리고 우리의 작은 로봇청소기의 머릿속에서 매번 호출되고 있다. 다익스트라 본인은 2002년 사망 직전까지 텍사스 대학교 오스틴 캠퍼스에서 가르쳤다. 그가 손으로 쓴 EWD 라 불리는 1,318 편의 노트는 텍사스 대학교 디지털 아카이브에 남아 있다. 그 노트들 어딘가에는, 어쩌면, 자판기 옆 의자에 앉아 본 풍경의 기억도 적혀 있을 것이다.
이제 다익스트라 알고리즘 자체를 보자. 단순하다 — 자판기 옆에서 20분 만에 떠올린 알고리즘은 단순할 수밖에 없다. 핵심은 우선순위 큐 (priority queue) 라는 자료구조 하나와, 완화 (relaxation) 라는 한 줄의 갱신 연산이다.
algorithm Dijkstra(G, s):
# 입력: 그래프 G=(V, E), 시작점 s. 간선 가중치 w(u, v) >= 0.
# 출력: 모든 정점 v 에 대해 d[v] = s 에서 v 까지의 최단거리.
for each v in V:
d[v] = infinity
d[s] = 0
Q = PriorityQueue() # (key, value) = (d[v], v)
Q.insert(0, s)
while Q is not empty:
u = Q.extract_min() # 가장 작은 d[u] 를 가진 정점
if u is settled: continue
mark u as settled
for each (u, v, w) in E:
if d[u] + w < d[v]:
d[v] = d[u] + w # relax
Q.insert(d[v], v)
return d
이 의사코드를 한 줄씩 풀어 본다. 첫 번째 블록은 초기화. 모든 정점의 거리 추정값을 무한대로 두고, 시작점만 0 으로 둔다. 우선순위 큐에는 시작점만 들어 있다. 두 번째 블록은 주 반복문. 큐에서 가장 작은 추정값을 가진 정점 u 를 꺼낸다. 이미 확정된 정점이면 (앞서 더 작은 키로 한 번 꺼낸 적 있다면) 건너뛴다. 그렇지 않으면 확정 표시를 하고, u 에서 뻗어 나가는 모든 간선 (u, v, w) 에 대해 완화를 시도한다. 완화는 한 줄이다 — u 를 거쳐 가는 거리 d[u] + w 가 현재 추정값 d[v] 보다 작으면 갱신한다.
작은 예시로 한 단계씩 따라가 보자. 정점이 5개 인 작은 그래프를 상상한다.
그림 1.1 ― 5 정점 그래프와 다익스트라의 첫 3 단계.
2
s ───── A
│ │
4│ │1
│ 3 │
B ───── C ─── D
5
단계 0: 초기화
d[s]=0, d[A]=∞, d[B]=∞, d[C]=∞, d[D]=∞
Q = [(0, s)]
단계 1: u = s 꺼냄. 완화: A→2, B→4.
d = [s:0, A:2, B:4, C:∞, D:∞]
Q = [(2, A), (4, B)]
단계 2: u = A 꺼냄. 완화: C→2+1=3.
d = [s:0, A:2, B:4, C:3, D:∞]
Q = [(3, C), (4, B)]
단계 3: u = C 꺼냄. 완화: B→3+3=6? 아니, 이미 4. 그대로. D→3+5=8.
d = [s:0, A:2, B:4, C:3, D:8]
Q = [(4, B), (8, D)]
⋯
이 예시에서 눈여겨봐야 할 것은 B 의 거리가 갱신될 뻔했지만 갱신되지 않았다는 점이다. C 를 거쳐 가는 경로 0 → 2 → 3 → 6 은 이미 B 까지의 직접 경로 0 → 4 보다 멀다. 다익스트라는 작은 쪽을 유지 한다. 이 단순한 갱신 규칙이 — 비음수 가중치 가정과 결합되어 — 알고리즘 전체의 옳음을 보장한다. 왜 그런가는 §5와 §6의 일이다.
조금 더 추상적인 그림을 그려 보자.
그림 1.2 ― 다익스트라가 펴 나가는 양파 모양.
확정됨 아직 확정 안됨
┌──────────────────┬─────────────────┐
│ d[v] 가 진짜 │ d[v] 가 추정값 │
│ 최단거리 δ(s,v) │ d[v] ≥ δ(s,v) │
│ │ │
│ s │ │
│ ●━━━●━━● │ ○──○──○ │
│ ┃ ┃ │ │ │
│ ●━━━╋━━●━━━━━━━━● │ │
│ ┃ (next to extract) │
└──────────────────┴─────────────────┘
(settled set S) (V \ S)
다익스트라는 매 단계 경계선 — settled set S 와 그 바깥의 경계 — 에서 가장 가까운 정점을 하나 끌어들인다. 끌어들인 정점은 영원히 settled. 다시 나가지 않는다. 이것이 그리디 의 본질이다. 그리고 이 그리디가 옳다 는 사실 — 끌어들인 정점의 거리가 정말로 진짜 최단거리라는 사실 — 이 다익스트라의 모든 마법의 근원이다.
여기까지 — Light 의 마지막 줄 — 이 그 마법을 받아들이는 첫 단계다. 다음 절부터는 그 마법을 증명 한다.
이 장의 정리들에 들어가기 전에 표기를 한 자리에 모은다. 새 기호는 도입하지 않는다 — 모두 책 전체의 glossary.md 에 있는 것들이다. 다만 이 장에서 반복적으로 쓰일 것들이라 한 번 더 정리해 둔다.
그래프와 가중치. G = (V, E) 는 정점 집합 V 와 간선 집합 E 로 이루어진 그래프다. n = |V|, m = |E|. 각 간선 (u, v) ∈ E 에는 비음수 가중치 w(u, v) ≥ 0 이 붙어 있다. 이 비음수 가정이 이 장 전체를 떠받친다. 음수가 들어오면 §6 의 정리가 무너진다.
거리 함수. 정점 s 에서 v 까지의 진짜 최단거리를 δ(s, v) 로 쓴다. 그리스 문자 델타. 이 값은 우리가 알지 못하는 값이다 — 알고리즘이 끝나야 알 수 있다. 알고리즘 내부에서는 추정 값을 d[v] 로 쓴다. 라틴 d. 추정값은 알고리즘이 진행되면서 점점 줄어든다. 핵심 invariant 는 d[v] ≥ δ(s, v) — 추정값은 항상 진짜 값 이상이다. 이 invariant 가 §5의 보조정리 1.2가 된다.
Settled set. 알고리즘이 "확정" 표시를 한 정점들의 집합을 S 로 쓴다. 초기에 S = ∅. 한 정점이 큐에서 꺼내져 settled 마크가 붙으면 S 에 들어간다. 다시 나가지 않는다. 알고리즘 종료 시 S = V. 이 단조 증가 가 다익스트라의 두 번째 invariant.
완화. 간선 (u, v, w) 에 대한 완화 연산은 한 줄이다 — if d[u] + w < d[v]: d[v] = d[u] + w. 이 한 줄이 BFS 와 Bellman–Ford 와 다익스트라를 가르는 호출 순서 의 차이를 만든다. BFS 는 거리 1짜리 간선만 다루고 한 층씩 균등하게 완화한다. Bellman–Ford 는 모든 간선을 반복적으로 완화한다. 다익스트라는 우선순위에 따라 완화한다 — 가장 가까운 정점부터.
우선순위 큐. Q 는 (키, 값) 쌍을 저장하는 자료구조다. 키 = 거리 추정값, 값 = 정점. Q.insert(k, v) 는 삽입, Q.extract_min() 은 가장 작은 키를 가진 쌍을 꺼낸다. 자료구조의 내부 — 배열인지 이진 힙인지 Fibonacci 힙인지 — 는 §7의 복잡도 정리에서 결정된다. 지금까지는 추상 자료구조다.
다익스트라의 정확성은 세 개의 보조정리에 기댄다. 하나씩 본다.
왜 이 보조정리들이 필요한가. 우리는 §6에서 다익스트라가 옳다 — 알고리즘이 종료할 때 d[v] = δ(s, v) 가 모든 정점에 대해 성립한다 — 를 증명하려 한다. 이 증명은 귀납이다. 귀납은 두 개의 사실에 기댄다. (1) 최단거리의 구조 — 최단경로의 일부분도 최단경로다. (2) 알고리즘이 유지하는 invariant — 추정값은 항상 진짜 값 이상이다. (3) 그리디 가 그 invariant 와 양립한다 — 큐에서 꺼낸 정점의 추정값은 진짜 값과 같다. 이 세 사실이 보조정리 1.1, 1.2, 1.3 이다. 정확성 정리는 이 셋을 하나로 묶는다.
보조정리 1.1 (Optimal Substructure).
s → v_1 → v_2 → ⋯ → v_k = t가s에서t까지의 최단경로라면, 그 어떤 부분경로v_i → v_{i+1} → ⋯ → v_j도v_i에서v_j까지의 최단경로다.
증명. 모순으로 보인다. 어떤 부분경로 v_i → ⋯ → v_j 가 최단이 아니라고 가정하자. 그러면 v_i 에서 v_j 까지 더 짧은 다른 경로 P' 가 존재한다. 원래 경로의 그 부분을 P' 로 교체 하자. 그러면 s → ⋯ → v_i ⤳ v_j → ⋯ → t (여기서 ⤳ 가 P') 가 더 짧은 s → t 경로다. 원래 경로가 최단이라는 가정에 모순. ∎
이 보조정리는 단순해 보이지만 모든 최단경로 알고리즘의 기둥 이다. Bellman–Ford 의 점화식도, BFS 의 층별 진행도, A* 의 휴리스틱도 모두 이 한 가지 사실 위에 서 있다. "최단의 일부는 최단" — 이 한 줄이 동적 계획법 의 가능성을 연다.
왜 다음 보조정리가 필요한가. 보조정리 1.1 은 정답의 구조 에 대한 사실이지, 알고리즘에 대한 사실은 아니다. 알고리즘의 상태 가 어떤 invariant 를 유지하는지를 따로 보여야 한다.
보조정리 1.2 (Relaxation Invariant).
알고리즘 어느 시점에서나, 모든 정점
v에 대해d[v] ≥ δ(s, v). 즉, 거리 추정값은 결코 진짜 거리보다 작아질 수 없다.
증명. d[v] 가 어떻게 갱신되는지 본다. 초기에는 d[s] = 0 = δ(s, s) 이고 다른 모든 v 에 대해 d[v] = ∞ ≥ δ(s, v). invariant 가 성립한다. 갱신은 완화 한 줄 — d[v] ← d[u] + w(u, v) — 으로만 일어난다 (작은 쪽으로 갱신). 귀납 가정으로 갱신 직전 d[u] ≥ δ(s, u) 다. 그렇다면
d[v] ← d[u] + w(u, v) ≥ δ(s, u) + w(u, v) ≥ δ(s, v).
마지막 부등식은 삼각 부등식 — s 에서 v 로 가는 진짜 최단경로의 길이는 s → u → v 의 길이 이하 — 이다. 따라서 갱신 후에도 invariant 가 성립. ∎
이 보조정리의 본질은 완화가 안전하다 는 것이다. 완화는 추정값을 줄이지만 결코 진짜 값 아래로 끌어내리지 못한다. 알고리즘이 진행됨에 따라 추정값은 진짜 값을 향해 위에서 내려온다. 결코 통과하지 않는다.
그림 1.3 ― Relaxation invariant 의 직관.
d[v] (추정값) δ(s,v) (진짜 최단거리)
┃ ┃
∞ ┃ ┃
┣━━━━━━━ 초기 ┃
┃ ┃
┣━━━━━━━ 첫 완화 후 ┃
┃ ┃
┣━━━━━━━ 두 번째 완화 후 ┃
┃ ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ (수렴)
┃ ┃
d[v] 는 단조 감소. ┃
δ(s,v) 아래로 내려갈 수 없다. ┃
왜 마지막 보조정리가 필요한가. 보조정리 1.2 는 d[v] ≥ δ(s, v) 만 말한다. 동등성 — d[v] = δ(s, v) — 은 언제 도달하는가? 다익스트라의 그리디가 옳다면, 큐에서 꺼낸 정점은 그 순간 이미 동등성이 성립해야 한다. 다음 보조정리가 이 사실을 정확히 한다.
보조정리 1.3 (Greedy Choice).
알고리즘이 큐에서 정점
u를 꺼내 settled 표시를 하는 순간,d[u] = δ(s, u)가 성립한다 (비음수 가중치 가정 아래).
증명. 귀납. u 를 꺼낸 시점에 settled set S 의 모든 정점에 대해 d[·] = δ(s, ·) 라고 가정 (귀납 가정). s 에서 u 까지의 진짜 최단경로 P 를 생각하자. 이 경로는 s 에서 출발해 어디선가 처음으로 S 밖으로 나간다. 그 첫 번째 외부 정점을 x 라고 부르자. P 는 s → ⋯ → y → x → ⋯ → u 의 모양이며, y ∈ S, x ∉ S.
이제 거리를 잰다. P 의 s → y 부분은 — 보조정리 1.1 (부분경로의 최단성) 에 의해 — s 에서 y 까지의 최단경로다. 즉 이 부분의 길이는 δ(s, y) = d[y] (귀납 가정). 그리고 y → x 간선의 가중치는 w(y, x) ≥ 0. 따라서
δ(s, x) = δ(s, y) + w(y, x) = d[y] + w(y, x).
그런데 y 는 settled 가 될 때 자신의 모든 외향 간선을 완화했다. 그 완화의 결과로 d[x] ≤ d[y] + w(y, x) = δ(s, x). 보조정리 1.2 와 결합하면 d[x] = δ(s, x). 즉 x 의 추정값은 그 시점에 이미 정답 이다.
이제 결정적 한 걸음. x 는 P 위에 있고, P 의 s → u 부분의 일부다. 따라서 δ(s, u) ≥ δ(s, x) = d[x]. 그런데 알고리즘이 큐에서 u 를 꺼낸다 — 이는 u 의 키 d[u] 가 큐 안의 모든 키 이하 라는 뜻이다. 특히 d[u] ≤ d[x]. 두 부등식을 합치면 d[u] ≤ d[x] = δ(s, x) ≤ δ(s, u). 그리고 보조정리 1.2 에 의해 d[u] ≥ δ(s, u). 따라서 d[u] = δ(s, u). ∎
이 증명의 마지막 두 줄을 다시 본다. δ(s, u) ≥ δ(s, x) 라는 부등식은 비음수 가중치 가정 없이는 성립하지 않는다. 음수 간선이 있다면, s 에서 u 로 가는 경로가 x 를 통과한 뒤 음수 간선을 타고 되돌아와 더 짧아질 수 있기 때문이다. 음수 가중치는 보조정리 1.3 을 무너뜨린다. 다익스트라가 음수 가중치에서 오답 을 내는 이유다.
그림 1.4 ― 보조정리 1.3 의 증명 골격.
s ────────── y ───── x ─────── ... ─────── u
│ │ │ │
└ settled ──┘ └─ not settled ────────┘
진짜 최단경로 P: s → ... → y → x → ... → u
여기서 y ∈ S (settled), x ∉ S (큐 안에 있음).
부등식 사슬:
d[u] (큐의 최소키) ≤ d[x] (x 도 큐 안)
= δ(s, x) (y 가 settled 되면서 완화됨)
≤ δ(s, u) (P 의 부분경로 ─ 비음수 가정 필요!)
≤ d[u] (보조정리 1.2)
결론: d[u] = δ(s, u). □
세 보조정리가 갖춰졌다. 이제 정확성 정리로 간다.
왜 이 정리가 필요한가. 보조정리 1.3 은 큐에서 꺼내는 순간 의 동등성만 보장한다. 그러나 우리가 진짜 원하는 것은 알고리즘이 종료할 때 모든 정점에 대한 동등성이다. 보조정리 1.3 을 모든 정점에 대해 일관되게 적용하면 — 즉 큐에서 순서대로 꺼내는 동안 그 보조정리가 반복적으로 성립한다고 보이면 — 정리는 자동으로 따라온다.
정리 1.4 (Dijkstra Correctness).
가중치가 비음수인 그래프
G = (V, E)와 시작점s가 주어졌을 때, Dijkstra 알고리즘은 종료 시 모든v ∈ V에 대해d[v] = δ(s, v)를 만족한다.
증명. settled set S 에 정점이 추가되는 순서대로 귀납한다. 귀납 가설은 "S 에 들어 있는 모든 정점 u 에 대해 d[u] = δ(s, u)" 다.
기저. 첫 번째로 settled 되는 정점은 s 자신이다 (초기 d[s] = 0 이 유일한 유한값이므로). 그리고 δ(s, s) = 0 = d[s]. 기저 성립.
귀납 단계. S 의 크기가 k 일 때 가설이 성립한다고 가정. 다음 단계에서 큐의 최소키 정점 u 가 꺼내져 S 에 추가된다. 보조정리 1.3 — 비음수 가중치 가정과 귀납 가정 — 에 의해 d[u] = δ(s, u). 따라서 |S| = k+1 인 상태에서도 가설이 성립.
알고리즘이 종료할 때 (큐가 비었을 때) 모든 도달 가능한 정점이 settled 되었고, 도달 불가능한 정점은 d[·] = ∞ = δ(s, ·). ∎
증명이 깨지는 가정. 이 증명의 어느 자리에서 가정이 깨지면 어디가 무너지는가? 첫째, 비음수 가중치 가정 이 깨지면 보조정리 1.3 의 마지막 부등식 δ(s, u) ≥ δ(s, x) 가 무너진다 — 음수 간선이 s → u 경로의 길이를 부분경로 길이보다 작게 만들 수 있기 때문이다. 다익스트라는 이 경우 오답을 낼 수 있다. 대안은 Bellman–Ford (O(VE)) 또는 Johnson's algorithm (재가중치 후 다익스트라). 둘째, 도달 가능성 이 깨지면 — 즉 s 에서 도달할 수 없는 정점이 있으면 — 그 정점은 큐에 들어가지 않고 d[·] = ∞ 로 종료한다. 이건 오류 가 아니라 정의대로의 동작 이다. δ(s, v) = ∞ 가 정의에 따라 옳기 때문. 셋째, 우선순위 큐가 진짜 최솟값을 반환하는가 가 깨지면 — 즉 자료구조 구현이 잘못되었으면 — 보조정리 1.3 의 마지막에서 d[u] ≤ d[x] 가 성립한다고 말할 수 없다. 따라서 정리도 무너진다. 이건 구현 의 책임이다.
왜 이 복잡도가 정확한가. 우리는 알고리즘이 옳다 는 것을 증명했다. 이제 빠르다 는 것을 증명한다. 다익스트라의 시간 복잡도는 우선순위 큐의 구현 에 따라 달라진다 — 이것이 다익스트라가 가르치는 두 번째 큰 교훈이다. 알고리즘과 자료구조는 분리될 수 없다. 같은 알고리즘이 자료구조에 따라 O(V²) 도 되고 O((V+E) log V) 도 되고 O(E + V log V) 도 된다.
정리 1.5 (Time Complexity).
Dijkstra 알고리즘의 시간 복잡도는 우선순위 큐의 구현에 따라 다음과 같다. (a) 배열 (linear scan):
O(V² + E) = O(V²)(조밀한 그래프일 때 최선). (b) 이진 힙:O((V + E) log V). (c) Fibonacci 힙:O(E + V log V)(이론적 최적, 비교 기반 모델).
증명. 알고리즘은 extract_min 을 정확히 V 번 호출 (각 정점이 settled 될 때 한 번), insert (또는 decrease-key) 를 최대 E 번 호출 (각 간선마다 완화 시 한 번). 자료구조별 연산 비용을 곱하면:
(a) 배열: extract_min 은 O(V) (선형 스캔), insert/decrease-key 는 O(1). 합: V × O(V) + E × O(1) = O(V² + E). 조밀한 그래프 (E = Θ(V²)) 에서는 이것이 최선.
(b) 이진 힙: extract_min 은 O(log V), insert/decrease-key 도 O(log V). 합: V × O(log V) + E × O(log V) = O((V + E) log V). 희소한 그래프 (E = O(V)) 에서 O(V log V).
(c) Fibonacci 힙 (Fredman–Tarjan, 1987): extract_min 은 amort. O(log V), decrease-key 는 amort. O(1). 합: V × O(log V) + E × O(1) = O(E + V log V). ∎
하계. 비교 기반 모델에서 단일 출발점 최단경로는 정렬 을 환원할 수 있다 — 모든 입력 수를 가중치로 하는 단순한 그래프를 만들면, 다익스트라의 출력 순서가 곧 정렬 결과다. 비교 기반 정렬의 하계 Ω(n log n) 에 의해 다익스트라의 하계 Ω(V log V) 가 따른다. Fibonacci 힙은 이 하계를 달성 한다. 비교 기반 모델에서 다익스트라보다 근본적으로 빠른 단일 출발점 최단경로 알고리즘은 존재하지 않는다.
그러나 Thorup (1999) 는 비방향, 정수 가중치 라는 추가 가정 아래 — 즉 비교 기반 모델을 떠나 정수 연산 을 허용하면 — O(V + E) 선형 시간 으로 해결 가능함을 보였다. 이는 비교 모델의 하계를 우회 하는 결과로, 발표 당시 학계에 큰 충격을 주었다.
그림 1.5 ― 자료구조 선택과 점근 복잡도.
그래프 밀도 → 희소 (E=Θ(V)) 중간 (E=Θ(V·√V)) 조밀 (E=Θ(V²))
─────────────────────────────────────────────────────────────────────────
배열 O(V²) O(V²) O(V²) ← 최선
이진 힙 O(V log V) O(V·√V·log V) O(V² log V)
Fib 힙 O(V log V) O(V·√V) O(V²)
─────────────────────────────────────────────────────────────────────────
↑ Fib/이진 힙 우세 ↑ 비등 ↑ 배열 우세
이 표는 현실에서 어떤 자료구조를 골라야 하는지를 알려준다. 64×64 격자에서 E ≈ 4V (각 칸이 평균 4개 이웃) 이면 희소 그래프 — 이진 힙이 옳다. 도시 네트워크처럼 E ≈ V·log V 도 이진 힙. 완전 그래프 — 모든 쌍이 연결 — 라면 배열이 빠르다. Fibonacci 힙은 이론 적으로는 최선이지만 상수 인자가 커서 실용 에서는 잘 쓰이지 않는다.
다익스트라는 한 점이 아니라 한 가족 이다. 비음수 가중치라는 가정을 풀거나, 끝점이 하나로 주어진다거나, 휴리스틱이 있다거나, 가중치가 정수라거나 — 각 가정의 변화가 새 알고리즘을 낳았다. 이 절에서는 다섯 친척을 차례로 본다.
*A (Hart–Nilsson–Raphael, 1968).** 끝점 t 가 미리 주어지고, 각 정점에 휴리스틱 h(v) — v 에서 t 까지의 추정 거리 — 가 붙어 있다고 하자. 다익스트라는 d[v] 만으로 우선순위를 매기지만, A* 는 d[v] + h(v) 로 매긴다. 휴리스틱이 admissible — 즉 h(v) ≤ δ(v, t) 항상 — 이면 A* 는 다익스트라와 같은 답을 더 적은 정점 으로 찾아낸다. SRI 의 로봇 Shakey 의 경로 계획에서 1968년에 태어났다. 1968년 IEEE Transactions on Systems Science and Cybernetics 에 게재된 원논문은 오늘날까지 인공지능과 경로 계획의 기둥이다. 휴리스틱이 consistent (삼각 부등식 h(u) ≤ w(u, v) + h(v)) 이면 A* 는 다익스트라처럼 settled set 의 단조 성장 성질을 그대로 보존한다.
Bidirectional Dijkstra (Nicholson 1966, Pohl 1971). 한 점에서 다른 한 점으로 가는 거리만 필요하다면 — Expert 1번처럼 — 양 끝에서 동시에 다익스트라를 돌리는 것이 더 빠르다. 시작점에서 출발하는 forward 탐색과 끝점에서 출발하는 backward 탐색이 어딘가에서 만난다. 평균적으로 √ 배 적은 정점을 펼친다. 도로 네트워크 같은 평면적 그래프에서 특히 효과적. 1971년 Pohl 의 학위논문 Bi-directional Search 가 이 알고리즘을 정리했다.
그림 1.6 ― Bidirectional Dijkstra 가 양 끝에서 펴 가다가 중간에서 만나는 모습.
●━━━●━━━● ●━━━●━━━●
│ │ │ │
s━━━●━━━●━━━●━━━ ⋯ meeting ⋯━━━●━━━●━━━●━━━t
│ │ │ │
●━━━●━━━● ●━━━●━━━●
←─ forward backward ─→
평균 펼침 √ 만큼 적음.
Bellman–Ford (Bellman 1958, Ford 1956). 비음수 가정을 버린다. 음수 가중치를 허용하되 모든 간선을 V-1 번씩 완화한다. O(VE) 로 다익스트라보다 훨씬 느리다. 그러나 음수 간선을 다룰 수 있고, 음수 사이클을 검출 한다 (한 번 더 완화했을 때 갱신되는 간선이 있으면 음수 사이클 존재). 외환 차익 거래 (음수 로그 환율) 등 음수 가중치가 자연스럽게 등장하는 문제의 표준 도구.
Fibonacci heap Dijkstra (Fredman–Tarjan, 1987). 우선순위 큐를 Fibonacci 힙으로 바꾼 변형. decrease-key 가 amortized O(1). 다익스트라의 이론적 최적 O(E + V log V) 를 달성. 1987년 Journal of the ACM 에 게재된 논문은 다익스트라뿐 아니라 흐름 알고리즘과 매칭 알고리즘 전반의 복잡도를 개선했다. 실용에서는 상수 인자가 커서 잘 쓰이지 않지만, 이론적 으로는 다익스트라의 최종 형태.
Δ-stepping (Meyer–Sanders, 1998). 우선순위 큐 대신 버킷 — 거리 구간 [iΔ, (i+1)Δ) — 을 사용. 같은 버킷 안의 정점들은 동시에 처리 가능 → 병렬화 친화. 가중치가 한정된 범위 안에 있을 때 다익스트라보다 실용 적으로 빠르다. 슈퍼컴퓨터의 그래프 알고리즘 라이브러리 (Graph500 등) 에서 표준.
Thorup (1999). 비방향, 정수 가중치 그래프 한정으로 O(V + E) 선형 시간. 비교 기반 하계 Ω(V log V) 를 우회 하는 충격적 결과. 핵심 아이디어는 위계적 군집화 (hierarchical bucketing) — 그래프를 정점들의 가중치 구조에 따라 재귀적으로 분해. 1999년 Journal of the ACM 의 32 페이지짜리 논문. 발표 당시 학계가 "이게 가능할 줄은 몰랐다" 는 반응. 비방향과 정수라는 두 가정이 깨지면 적용 불가.
Dial's algorithm (Dial, 1969). 가중치가 작은 정수 — w ∈ [0, W] — 인 경우. 버킷 W+1 개로 우선순위 큐를 대체. O(V + E + WV). W 가 작을 때 매우 빠르다. BFS 의 자연스러운 일반화 — 사실 0-1 BFS 가 Dial 의 특수 경우 (W = 1).
이 가족 안에서 다익스트라는 원형 이다. 비음수 가정을 풀면 Bellman–Ford. 끝점 휴리스틱이 있으면 A. 끝점이 하나면 Bidirectional. 큐 자료구조를 갈면 Fibonacci. 병렬화하면 Δ-stepping. 비방향 정수면 Thorup. 작은 정수면 Dial. 모든 변형이 다익스트라의 어느 가정* 을 풀거나 어느 부분 을 갈아끼운 결과다.
그림 1.7 ― 다익스트라 가족 가계도.
Dijkstra (1959)
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
끝점 있음 큐 자료구조 가중치 모델
│ │ │
┌───────┼─────┐ ┌─────┼─────┐ ┌─────┼─────┐
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
A* Bidir ALT 배열 이진 Fib 음수 정수 비방향+정수
(1968) (1971)(2005) (1987) (BF) (Dial) (Thorup)
(1958) (1969) (1999)
│
Δ-step
(1998)
ALT (Goldberg–Werneck, 2005) 는 랜드마크 기반 휴리스틱 으로 A* 를 향상시킨 변형으로, 본문에 자세히 다루지 않았지만 도로 네트워크 라우팅 (Google Maps 의 일부) 에서 핵심 도구다.
다익스트라의 1959 원논문은 두 페이지짜리 노트다. Numerische Mathematik 1권 269~271 페이지. 제목은 A Note on Two Problems in Connexion with Graphs. 단순한 제목 — 그래프와 관련된 두 문제에 관한 노트 — 이 컴퓨터 과학사의 한 페이지를 열었다.
논문은 짧다. 첫 문단은 두 문제의 진술 이다. Problem 1: 두 정점 P 와 Q 사이의 최소 길이 경로. Problem 2: n 개 정점을 잇는 최소 길이 트리 (오늘날의 MST). 다익스트라는 두 문제를 동시에 다루기로 한다. 그는 두 문제의 해법이 같은 골격 을 공유한다고 본 것이다 — 경계선에서 가장 가까운 후보를 하나 끌어들이는 그리디.
논문의 두 번째 문단은 Problem 2 (MST) 의 해법이다. 이것이 오늘날 프림 알고리즘 으로 불리는 것의 (재)발견이다. (Prim 의 발표는 1957년, Jarník 의 발표는 1930년. 다익스트라는 1956년 독립 발견.) "We construct a tree by adding edges one by one, each new edge being the shortest possible that does not form a cycle with the already chosen edges."
세 번째 문단은 Problem 1 (최단경로) 의 해법이다. 이것이 오늘날 다익스트라 알고리즘. 그는 정점을 세 부족 으로 나눈다: 확정된 정점 (set A), 확정되지 않았지만 후보 인 정점 (set B), 그리고 아직 보지 못한 정점 (set C). 매 단계 B 에서 가장 작은 추정값을 가진 정점을 골라 A 로 옮긴다. 옆 정점 중 C 에 있던 것은 B 로 옮기고, B 에 있던 것은 추정값을 갱신한다. 오늘날 우리가 settled set 과 우선순위 큐 라고 부르는 것의 원형이 이 세 부족이다.
논문은 증명 을 거의 하지 않는다. 두 알고리즘의 옳음 은 원논문에서 "it is obvious" 정도로 처리된다 (이는 다익스트라가 쓴 영어 표현의 직접 인용). 다익스트라의 시대 — 1950년대 후반 — 의 알고리즘 논문은 오늘날 의미의 형식적 증명을 거의 요구하지 않았다. 정확성의 직관 을 보이고, 시연 으로 확인하는 것이 표준이었다. 형식적 증명은 1970년대 이후 Knuth 의 The Art of Computer Programming 과 Aho–Hopcroft–Ullman 의 The Design and Analysis of Computer Algorithms (1974) 이후에 표준이 된다.
논문의 마지막 문단은 복잡도 에 대한 짧은 언급이다. 다익스트라는 "the labour involved" — 즉 수행되는 일의 양 — 가 n² 에 비례한다고 추정한다. 이는 배열 기반 우선순위 큐의 복잡도 — O(V²) — 와 일치한다. 우선순위 큐를 명시적으로 자료구조로 분리한 것은 1980년대의 일이다. 다익스트라의 1959 시점에서는 그냥 배열 이었다. Fibonacci 힙은 28년 뒤에 등장한다.
이 두 페이지짜리 노트를 오늘 PDF 로 펴 보면 — Springer 의 Numerische Mathematik 아카이브에서 다운로드 가능 — 글씨가 작고 문체가 옛스럽지만 알고리즘의 핵심은 그대로 읽힌다. 다익스트라는 자판기 옆에서 떠올린 단순함을 종이 위에 그대로 옮겼다. 그것이 이 노트가 66년이 지난 지금까지 살아 있는 이유다.
Edsger Wybe Dijkstra. 1930년 5월 11일 로테르담 출생. 부친은 화학자, 모친은 수학자였다 — 이 사실은 그가 평생 수학의 엄밀함 과 공학의 실용성 사이를 오간 배경을 설명한다.
Leiden 대학교에서 이론물리를 전공했지만 1952년 — 22살에 — Mathematisch Centrum (MC, 암스테르담의 수학 연구소) 에 입사하면서 컴퓨터 과학으로 진로를 옮긴다. 본인 회상에 따르면 "그 당시 네덜란드에는 프로그래머 라는 직업이 존재하지 않았다. 나는 프로그래머 라고 직업을 적어 결혼 신고서를 냈는데, 시청 직원이 그런 직업은 없다고 거부했다." (이 일화의 정확한 출처는 EWD 아카이브의 어느 편지로, 본인의 말이지만 세부 — 어느 해, 어느 시청 — 는 인터뷰마다 약간씩 다르다.)
1956년 ARMAC 시연 알고리즘 → 1959 Numerische Mathematik 노트 → 1968 Go-To Statement Considered Harmful (CACM 의 짧은 편지로, 구조적 프로그래밍의 시작이 된 글) → 1972 ACM Turing Award. 수상 강연 The Humble Programmer 에서 그는 "프로그래밍은 인간의 능력의 한계를 다루는 일" 이라고 말했다. 이 강연은 오늘날까지 컴퓨터 과학 교육의 고전이다.
후기 — 1984년부터 — 텍사스 대학교 오스틴 캠퍼스의 Schlumberger Centennial Chair. 강의실 칠판에 문제 를 적고, 그 문제의 해법 을 학생들과 함께 유도 해 나가는 그의 강의 스타일은 전설로 남아 있다. 그는 2002년 8월 6일 사망했다. 향년 72세. 그가 손으로 쓴 1,318 편의 EWD 노트 는 텍사스 대학교 디지털 아카이브 (cs.utexas.edu/users/EWD/) 에 무료로 공개되어 있다. 어느 EWD 를 무작위로 펼쳐 보면, 그 안에서 알고리즘이 증명되어 가는 모습을 따라갈 수 있다. 그의 알고리즘이 왜 옳은가 를 그 자신이 어떻게 보았는지의 증거다.
이 장에서 우리는 다익스트라 알고리즘 — 비음수 가중치 그래프의 단일 출발점 최단경로 — 을 끝까지 따라갔다. 세 보조정리, 정확성 정리, 복잡도 정리, 일곱 변형. 이제 Expert 1번 로봇청소기 의 풀이로 돌아가, 다익스트라가 그 풀이의 어디에 살아 있는지를 본다.
Expert 1번 풀이의 핵심 루프는 이렇다. 로봇이 매 칸에서 인접한 미청소 칸이 있으면 그리디 보행 — 한 칸 전진 — 으로 처리. O(1). 그러나 사방이 청소되었거나 벽이라면 그리디가 막힌다. 이 자리에서 풀이는 다익스트라를 호출한다 — 현재 위치에서 가장 가까운 미청소 칸까지의 최소비용 경로를 계산. 다익스트라가 끝나면 그 경로를 따라 점프. 점프 후에는 다시 그리디 보행.
여기서 다익스트라는 완전성을 보장하는 도구 다. 그리디는 빠르지만 — 호출당 O(1) — 막다른 골목에 갇힐 수 있다. 다익스트라는 비싸지만 — 호출당 O((V+E) log V), 64×64 격자에서 약 4,000 × 12 = 48,000 연산 — 막힌 상태에서 반드시 빠져나오는 길을 찾는다. 그 길이 존재한다면 (즉 그래프가 연결되어 있다면) 다익스트라는 반드시 그것을 찾는다. 우리가 §6에서 증명한 정리 1.4 가 정확히 이것을 보장한다.
풀이의 두 번째 영리함은 — 본 장에서는 다루지 않았지만 자매책 deep-dive 에 자세히 — SCAN 의 사용 빈도 를 줄이는 정보 전략에 있다. 첫 sub-task 에서 SCAN 으로 맵 전체를 알아낸 뒤, 그 맵을 4 방향 회전본으로 저장해 둔다. 그 후 sub-task 부터는 몇 칸의 SCAN 만으로 현재 집이 4 회전본 중 어느 것인지 추론할 수 있다. 다익스트라는 이 알려진 맵 위에서 동작하므로 호출당 정확히 O((V+E) log V) 가 보장된다.
요약하면 — Expert 1번에서 다익스트라는 최후의 수단 이다. 그리디가 모든 길을 잃었을 때, 정리 1.3 (Greedy Choice) 의 비음수 가중치 보장이, 그리고 정리 1.4 (Correctness) 의 종료 보장이, 로봇에게 반드시 진전이 있다 는 약속을 한다. 그 약속이 있기에 그리디는 대담하게 빠르게 보행할 수 있다 — 막혀도 다익스트라가 구해줄 것을 알기 때문에.
이 협주의 더 자세한 풀이 — 의사코드와 시각화 — 는 자매책 deep-dive 글에서 볼 수 있다.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/01-robot-vacuum.html
[Dijkstra1959] Edsger W. Dijkstra. "A Note on Two Problems in Connexion with Graphs."
Numerische Mathematik 1 (1959): 269–271. DOI: 10.1007/BF01386390.
[Dijkstra2010] Philip L. Frana. "An Interview with Edsger W. Dijkstra."
Communications of the ACM 53, no. 8 (2010): 41–47.
[CLRS2022] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein.
Introduction to Algorithms (4th ed.). MIT Press, 2022.
Ch. 22 "Single-Source Shortest Paths", pp. 620–676.
[SedgewickWayne2011]
Robert Sedgewick, Kevin Wayne. Algorithms (4th ed.).
Addison-Wesley, 2011. Ch. 4.4 "Shortest Paths", pp. 638–680.
[FredmanTarjan1987]
Michael L. Fredman, Robert E. Tarjan. "Fibonacci heaps and their uses
in improved network optimization algorithms."
Journal of the ACM 34, no. 3 (1987): 596–615.
[Thorup1999] Mikkel Thorup. "Undirected single-source shortest paths with positive
integer weights in linear time."
Journal of the ACM 46, no. 3 (1999): 362–394.
[HartNilssonRaphael1968]
Peter E. Hart, Nils J. Nilsson, Bertram Raphael. "A Formal Basis for the
Heuristic Determination of Minimum Cost Paths."
IEEE Transactions on Systems Science and Cybernetics 4, no. 2 (1968): 100–107.
[Dial1969] Robert B. Dial. "Algorithm 360: Shortest-Path Forest with Topological
Ordering." Communications of the ACM 12, no. 11 (1969): 632–633.
[Pohl1971] Ira Pohl. "Bi-directional Search." Machine Intelligence 6 (1971): 127–140.
[MeyerSanders2003]
Ulrich Meyer, Peter Sanders. "Δ-stepping: A Parallelizable Shortest Path
Algorithm." Journal of Algorithms 49, no. 1 (2003): 114–152.
[BellmanFord] Richard Bellman. "On a routing problem."
Quarterly of Applied Mathematics 16 (1958): 87–90.
Lester R. Ford. "Network flow theory." RAND Paper P-923 (1956).
전역을 모르겠으면, 발 밑이라도 단단하게.
"We seek not the best, but the locally best — and the locally best, when made local enough, is sometimes good enough." — Shen Lin & Brian W. Kernighan, paraphrased from An Effective Heuristic Algorithm for the Traveling-Salesman Problem (1973).
| 항목 | 값 |
|---|---|
| Expert № | 02 |
| 주연 | Local Search · 2-opt (Lin, 1965) |
| 조연 | 3-opt, Lin–Kernighan, Tabu Search, VNS, Iterated Local Search, Random Restart |
| 원논문 | Lin (1965). "Computer Solutions of the Traveling Salesman Problem." BSTJ 44: 2245–2269. |
| 대표 교과서 | Papadimitriou–Steiglitz Ch. 19, Aarts–Lenstra (2003) Ch. 1 |
| 분량 체크 | ⬜ Light(?자) ⬜ Deep(?자) ⬜ Origin(?자) |
도시 외곽의 황량한 들판. 군데군데 안테나 탑이 세워질 자리가 표시되어 있고, 그 자리에 안테나를 어떻게 배치 할지 결정해야 한다. 안테나는 각각 자기 위치에서 일정 반경 내의 가구를 덮는다. 같은 가구를 두 안테나가 동시에 덮으면 신호는 더 강해지지만 한 안테나가 낭비 된다. 어떤 가구도 덮지 못하면 벌점 이 부과된다. 안테나의 위치를 어디로 옮기느냐가 전체 점수를 결정한다.
이 문제의 첫인상은 연속 공간 의 최적화다. 안테나의 좌표는 실수다. 무한히 많은 후보 위치가 있다. 모든 후보를 시도하는 것은 불가능하고, 미적분의 도구로 풀려고 하면 — 안테나가 서로 상호작용 하고 벌점 함수가 불연속 이라 — 도함수가 매끄럽지 않다. 미분으로 푸는 길은 막혀 있다.
그러면 어떻게 할까. 답은 단순하면서도 깊다. 현재 위치에서 조금만 움직여 보고, 더 좋으면 옮긴다. 좋아지지 않으면 다른 방향을 시도한다. 모든 작은 움직임이 다 더 나쁘면 — 거기서 멈춘다. 우리는 그 자리를 국소 최적 (local optimum) 이라 부른다. 이 단순한 절차의 이름이 Local Search 다.
Expert 2번 — 안테나 — 의 풀이는 정확히 이런 구조다. 그리디로 초기 배치를 잡고, 그 다음 2-opt 비슷한 이웃 연산 — 두 안테나의 위치를 바꿔보기, 한 안테나를 작은 거리만큼 흔들기 — 을 반복한다. 더 이상 향상이 없으면 멈춘다. 그러나 — 그리고 이것이 핵심이다 — 멈춘 자리가 전역 최적이라는 보장은 없다. 더 멀리 다른 산봉우리가 있을지 모른다. 우리가 서 있는 자리는 발 밑의 봉우리 일 뿐이다.
이 장에서 우리는 그 발 밑 의 풍경을 끝까지 본다. 왜 로컬 서치가 멈추는가 (terminates), 왜 국소 최적이 전역 최적이 아닌가, 왜 그래도 충분히 좋은가, 그리고 — 매우 흥미롭게 — 1988년 Johnson–Papadimitriou–Yannakakis가 보인 "2-opt 국소 최적을 다항 시간에 찾을 수 있는가?" 가 현재까지 미해결 이라는 사실까지.
이 장의 흥미는 1장 다익스트라와의 대비 에서 한 번 더 드러난다. 다익스트라는 그리디인데도 전역 최적 이라는 기적 의 사례 — 비음수 가중치라는 구조가 그리디를 옳게 만든다. Local Search는 그리디가 옳지 못한 자리 — 즉 NP-난해의 자리 — 에서 그리디의 유일한 정직한 대안. 우리는 전역을 포기 한다. 그러나 체계적으로 포기한다. 그 체계가 곧 로컬 서치의 이론 — 이웃 함수, 종료 보장, 복잡도 상계, PLS-completeness — 이다.
1965년 미국 뉴저지. AT&T Bell Telephone Laboratories. 셴 린 (Shen Lin) — 중국계 미국 수학자, Bell Labs의 운영연구부 소속 — 이 외판원 문제 (TSP) 의 새로운 해법을 Bell System Technical Journal 에 발표한다. 논문 제목은 Computer Solutions of the Traveling Salesman Problem. 25 페이지짜리, 차분한 톤의 글.
그 시점에 TSP는 이미 난해함의 상징 이었다. 1954년 Dantzig–Fulkerson–Johnson이 cutting plane 으로 미국 49개 도시 사례를 풀었다는 것이 큰 뉴스였다. 그러나 그것은 특수한 경우 — 정밀하게 짜인 한 사례 — 였고, 일반적인 큰 TSP는 여전히 손을 댈 수 없었다. Lin의 1965 논문은 다른 길을 택한다. 완전한 해 가 아니라 충분히 좋은 해 를 빠르게. 그 길은 2-opt 라 불리는 단순한 아이디어 위에 서 있었다.
2-opt 의 아이디어를 그림 한 장으로 보일 수 있다. 외판원의 현재 순회 (tour) 에서 두 간선을 골라 빼고, 그 두 간선이 연결하던 도시들을 다른 방식으로 다시 연결한다. 두 간선을 떼면 순회는 두 조각으로 갈라진다. 한 조각의 방향을 뒤집어 다시 잇는다. 이것이 2-opt 의 한 swap 이다. 이 swap이 순회를 짧게 만든다면 채택한다. 그렇지 않으면 다른 두 간선 쌍을 시도한다. 모든 쌍이 다 나쁘면 — 거기서 멈춘다.
8년 뒤 1973년, Lin은 같은 부서의 동료 Brian Kernighan과 함께 Lin–Kernighan 알고리즘을 발표한다. Kernighan은 — 그 Kernighan — C 프로그래밍 언어의 K&R 책으로 유명한 인물. 두 사람은 2-opt의 한계를 본 뒤, 가변 깊이 의 swap 으로 일반화한다. 한 단계에서 몇 개 의 간선을 동시에 교체할지를 알고리즘이 스스로 결정 한다. 결과는 충격적이었다 — 작은 사례에서 거의 항상 전역 최적 을 찾았다. 1973년 발표된 Lin–Kernighan의 변형은 오늘날까지 실용 TSP 해법 의 표준이다 (Concorde TSP solver의 내부에도 들어 있다).
로컬 서치의 일반론 — TSP가 아닌 모든 조합 최적화에 적용 — 은 1980년대에 정착한다. 1986년 Glover의 Tabu Search, 1990년대 Mladenović–Hansen의 Variable Neighborhood Search, 동시기 Lourenço–Stützle 의 Iterated Local Search. 이 모두가 "국소 최적에서 빠져나오는 방법" 의 변주다. 안테나 문제는 이 일반론의 한 응용이다.
로컬 서치의 일반 골격을 의사코드로 적으면 매우 짧다.
algorithm LocalSearch(initial_solution s0, neighborhood N, cost c):
s = s0
while True:
s' = argmin_{x in N(s)} c(x) # 이웃 중 가장 비용 낮은 것
if c(s') >= c(s):
return s # 국소 최적 — 향상이 없으면 멈춤
s = s'
여기서 핵심은 N(s) — 이웃 함수 — 다. N(s) 가 어떻게 정의되느냐에 따라 알고리즘의 성능이 완전히 달라진다. TSP의 경우 N(s) = "s에서 2-opt swap 하나로 만들 수 있는 모든 순회" = O(n²) 개. 안테나 문제의 경우 N(s) = "한 안테나의 좌표를 ±δ 흔들거나 두 안테나의 위치를 swap한 모든 배치".
향상이 있을 때마다 전체 이웃을 다시 평가하면 시간이 닳는다. 영리한 구현은 증분 평가 (delta evaluation) 를 한다 — 한 swap이 비용에 얼마나 영향 을 주는지만 계산한다. TSP 2-opt에서는 swap 하나가 네 간선 만 변경하므로 평가는 O(1). 전체 이웃 O(n²) 개를 한 번에 평가하는 비용은 n² 곱하기 O(1) = O(n²). 이것이 한 향상 단계 의 비용.
그림 2.1 ― 2-opt swap의 그림.
before: after:
a━━━━━b a━━━━━b
╲ \ /
╲ \ /
╲ X
╲ / \
╲ / \
╲ / \
d━━━━━c d c
(edges (a,b),(d,c) + (edges (a,c),(d,b) +
rest of tour) reversed segment)
2-opt swap 한 번은 두 간선 (a,b), (d,c) 를 빼고 (a,c), (d,b) 로 잇는다. 그 사이의 순회 일부분은 역순 으로 뒤집힌다. 거리가 줄어드는지 확인하려면 단지 dist(a,b) + dist(d,c) 와 dist(a,c) + dist(d,b) 를 비교하면 된다. 이 한 비교가 swap의 delta evaluation.
작은 예시. 4개 도시 A, B, C, D 가 정사각형 꼭짓점에 있고 (간선 길이 1, 대각선 √2). 현재 순회가 A → B → D → C → A 라면 — 이건 X자 교차 순회로 길이 1+√2+1+√2 = 2+2√2 ≈ 4.83. 2-opt swap으로 간선 (A,B), (D,C) 를 바깥쪽 으로 풀어 A → C → D → B → A 로 만들면 길이 1+1+1+1 = 4. 0.83만큼 짧아졌다. 이런 향상이 더 이상 없을 때까지 swap을 반복한다.
그림 2.2 ― 4-도시 정사각형 예제: X자 → 정사각형 둘레.
before (X자): after (둘레):
A━━━B A───B
│ ╳ │ │ │
│╱ ╲│ │ │
C━━━D C───D
비용 2+2√2 ≈ 4.83 비용 4
향상 ≈ 0.83
이제 지형 의 비유를 더 그려본다. 모든 가능한 순회 (또는 안테나 배치) 의 집합이 공간 을 이루고, 각 점은 자기 비용을 고도 로 갖는다. 로컬 서치는 이 지형을 내려가는 도보다. 이웃의 가장 낮은 점으로 한 걸음씩 옮긴다. 그러다 모든 이웃이 현재 위치보다 높으면 멈춘다. 그 자리가 분지 (basin) 의 바닥. 우리가 서 있는 그 봉우리에서 가장 낮은 곳. 그러나 — 옆 분지에 더 낮은 바닥이 있을 수 있다. 그것이 전역 최적 일 수도 있고, 또 다른 국소 최적일 수도 있다.
그림 2.3 ― 1차원 지형 비유.
비용
┃ ╱╲ ╱╲
┃ ╱ ╲ ╱╲ ╱ ╲
┃ ╱ ╲ ╱ ╲ ╱ ╲
┃ ╱ ╲ ╱ ╲ ╱ ╲ ← 3 개의 국소 최적
┃ ╱ ╲ ╱ ╲ ╱ ╲ 한 개의 전역 최적
┃──────────────────────────────────────────── 해 공간 →
▼ ▼
local opt 1 global opt
(local opt 2)
여기까지가 Light. 로컬 서치는 지형을 내려간다. 멈춘 자리가 가장 낮은지는 지형을 다 보지 않고는 알 수 없다. 그런데도 — 그리고 이것이 매혹적이다 — 실용적으로 충분히 좋다. 그 왜 가 Deep의 일이다.
해 공간. 우리가 다루는 문제의 모든 후보 해 의 집합을 S 로 쓴다. TSP에서는 S = "n 개 도시의 순회 집합" = (n-1)!/2 개 (양 끝과 방향 고려). 안테나에서는 S = "안테나 위치 배치의 이산화된 집합" — 좌표를 격자로 이산화하면 유한, 안 하면 무한.
비용 함수. c : S → ℝ 가 각 해에 비용을 부여한다. 최소화 문제로 통일.
이웃 함수. N : S → 2^S 가 각 해 s 에 이웃 부분집합 N(s) ⊆ S 를 부여한다. 보통 s ∈ N(s) 는 제외 — 이웃은 자기 자신이 아니다.
국소 최적. s ∈ S 가 국소 최적 이란, ∀ s' ∈ N(s) : c(s') ≥ c(s). 즉 모든 이웃이 자기보다 좋지 않다.
전역 최적. s* ∈ S 가 전역 최적 이란, ∀ s' ∈ S : c(s') ≥ c(s*). 모든 해보다 좋다.
핵심 표기 한 가지 더. 이웃이 대칭 이면 (s' ∈ N(s) ⟺ s ∈ N(s')), N 은 무방향 그래프 (S, E_N) 를 정의한다. 2-opt 이웃은 대칭이다 — 한 swap을 되돌리면 원래로 돌아온다.
Move vs Operator. 이 장 전체에서 move 와 operator 라는 두 용어가 섞여 쓰일 수 있어 미리 정리한다. operator 는 함수 f : S → S — 한 해를 다른 해로 사상 하는 결정적 변환. move 는 한 operator를 한 번 적용하는 행위. 2-opt에서 한 swap이 한 move, swap operator는 모든 가능한 swap의 집합 으로 매개화된 함수 가족. 책 전체에서 move 가 행위, operator 가 함수 의 의미로 일관되게 쓰인다.
Cost landscape. 비용 함수와 이웃 그래프의 결합 (S, N, c) 를 fitness landscape 라 부른다 (생물 진화론에서 빌린 용어, Wright 1932). 같은 문제도 이웃 선택 에 따라 다른 landscape를 가진다. 좋은 이웃 의 정의는 landscape를 단조롭게 만드는 것 — 분지가 적고, 분지의 폭이 넓고, 전역 최적이 큰 분지의 바닥 에 있는 모양. 어떤 이웃이 좋은가는 문제 의존 적이고, 그 자체가 한 연구 주제.
왜 이 보조정리들이 필요한가. 우리는 (1) 알고리즘이 반드시 멈춘다 — 무한 루프가 없다 — 와 (2) 멈춘 결과는 국소 최적 임을 보여야 한다. 이 둘이 보조정리 2.1, 2.2. 그 다음 (3) 국소 최적은 일반적으로 전역 최적이 아님 을 명확한 반례로 본다.
보조정리 2.1 (Strict Descent Implies Termination).
비용 함수
c가 유한 해 공간S에서 정의되어 있고, 각 단계에서 엄격하게 비용이 감소한다면 —c(s_{k+1}) < c(s_k)— 알고리즘은 유한 단계 안에 멈춘다.
증명. |S| = N (유한). 매 단계 비용이 엄격 하게 감소하므로 같은 해를 두 번 방문할 수 없다 — 두 번 방문하면 그 사이에 비용이 돌아온다. 따라서 알고리즘은 최대 N 단계 안에 멈춘다. ∎
이 보조정리의 가정이 엄격한 감소다. c(s_{k+1}) ≤ c(s_k) (등호 허용) 만 보장되면 순환이 가능하다. 따라서 의사코드에서 if c(s') >= c(s) 의 >= 는 중요 하다 — 등호 포함. 향상이 없을 때 멈춘다.
왜 다음 보조정리가 필요한가. 보조정리 2.1 은 멈춤 만 보장한다. 멈춘 결과의 성질 — 그것이 국소 최적이라는 것 — 은 별개의 사실로 명시해야 한다.
보조정리 2.2 (Termination at Local Optimum).
알고리즘
LocalSearch가 해s에서 종료한다면,s는 이웃 함수N에 대한 국소 최적이다.
증명. 알고리즘이 s 에서 종료한다는 것은 — 의사코드에 따르면 — c(s') ≥ c(s) for all s' ∈ N(s) 가 성립함을 뜻한다. 이는 정확히 국소 최적 의 정의. ∎
이 두 보조정리는 단순하다. 그러나 알고리즘의 행동을 보장 하는 두 기둥이다. 다음으로 — 왜 국소 최적이 전역 최적이 아닌가 — 를 본다.
관찰 2.3 (Local ≠ Global).
일반적인 NP-난해 문제에서, 다항 크기의 이웃 함수
N에 대해 국소 최적이 항상 전역 최적인 알고리즘은 존재하지 않는다 (P = NP가 아니라면).
증명. 만약 그런 N 이 존재하면 — 다항 크기 이웃에서 국소 최적이 곧 전역 최적이면 — 다항 시간에 이웃을 탐색해 향상하는 알고리즘이 NP-난해 문제를 다항 시간에 푼다. P ≠ NP 가정 아래 모순. ∎
이 관찰은 왜 우리가 영원히 만족할 수 없는지 를 알려준다. 더 큰 이웃을 잡으면 국소 최적이 적어진다 — 극단적으로 N(s) = S 면 모든 국소 최적이 전역 최적. 그러나 그 경우 한 단계 이웃 탐색이 Θ(|S|) 시간을 먹는다 — 다항이 아니다. 이웃의 크기 와 질 사이에 trade-off가 있다.
그림 2.4 ― 국소 최적과 전역 최적의 반례 (5-도시 TSP).
A
╱│╲
╱ │ ╲
╱ │ ╲
╱ │ ╲
E │ B
╲ │ ╱
╲ │ ╱
╲ │ ╱
╲│╱
D━━━C
2-opt local optimum: A-B-C-D-E-A (대각선 횡단 포함)
global optimum: A-B-C-D-E-A 또는 A-E-D-C-B-A 의 대칭본
(꼭짓점 둘레 따라)
여기서 두 해의 비용은 정확히 같다 — 이 사례는 무의미.
그러나 거리 행렬에 작은 변동을 주면 (가령 (A,C) 사이 거리 ↑↓)
local optimum이 global보다 5% 가량 비싸지는 사례가 만들어진다.
좀 더 정량적인 결과. 정리 (Chandra–Karloff–Tovey, 1999): 2-opt local optimum의 worst-case 비용은 전역 최적의 Θ(log n / log log n) 배까지 나빠질 수 있다 (특수 구성된 입력에서). 이는 최악의 경우 의 보장이고, 평균적으로는 훨씬 좋다.
보조정리 2.8 (Symmetric Neighborhood Connectivity).
2-opt 이웃 그래프
(S, E_N)는 연결 되어 있다 — 즉 어떤 두 순회s, s'사이에도 2-opt swap의 유한 수열 로 도달 가능.
증명. n 도시 순회는 모두 n 개 간선을 갖는다. 두 순회 s, s' 의 대칭 차 — s 에는 있고 s' 에는 없는 간선 + 그 반대 — 를 본다. 대칭 차의 크기가 2k > 0 이라면 s 와 s' 가 다르다. 이 때 항상 적어도 한 쌍의 간선 (a,b), (c,d) ∈ s \ s' 가 존재해, 이들을 2-opt swap으로 교체하면 결과가 적어도 한 간선만큼 s' 에 가까워진다. 귀납으로 유한 단계에 s' 에 도달. (자세한 구성은 Lin 1965 §4에 있다.) ∎
이 보조정리의 의미는 깊다. 2-opt 이웃에서 어느 점에서든 어느 점으로든 도달 가능 — 즉 지형이 한 덩어리 다. 분지 (basin) 들은 벽으로 막힌 분지가 아니라 언덕 으로 막힌 분지. 충분히 올라가면 (즉 더 비싼 해를 받아들이면) 다른 분지로 갈 수 있다. 이것이 Simulated Annealing 이 작동하는 위상수학적 근거 다.
그림 2.4ᵇ ― 이웃 그래프의 연결성과 분지 구조.
순회 공간 (꼭짓점) ─ 2-opt 인접 (변)
global local1 local2
● ──── 길 ─── ● ──── 길 ─── ●
╱│╲ │ ╱│╲
╱ │ ╲ │ ╱ │ ╲
● ● ● ● ● ● ●
"분지 1" "분지 2" "분지 3"
분지 사이는 *높은 능선* 으로 분리되지만 변은 *존재*.
엄격 감소 로컬 서치는 한 분지 안에서 갇힘.
탈출은 *비향상 이동* (Tabu) 또는 *재시작* (Random Restart) 또는
*확률적 받아들임* (Simulated Annealing) 으로.
왜 이 정리가 필요한가. 로컬 서치는 전역 최적을 보장하지 않는다. 그렇다면 무엇을 "정확성" 으로 부를 것인가? 답은 국소 최적성의 보장 — 알고리즘이 멈춘 결과는 국소 최적임이 확실 — 이다. 이것이 정리 2.4.
정리 2.4 (Local Search Correctness).
알고리즘
LocalSearch(s0, N, c)가 유한 해 공간S와 엄격 향상 규칙으로 실행되면, 알고리즘은 유한 시간 안에 종료하며 그 결과s_final은(N, c)에 대한 국소 최적이다.
증명. 보조정리 2.1 (Termination) 에 의해 알고리즘은 유한 단계 안에 멈춘다. 보조정리 2.2 (Termination at Local Optimum) 에 의해 멈춘 시점의 해는 국소 최적이다. ∎
증명이 깨지는 가정. (1) 해 공간이 무한 — 연속 좌표에 안테나를 놓는 경우 — 이면 보조정리 2.1 의 가정이 깨진다. 수렴 은 더 이상 유한 종료 가 아니다. 실제로는 좌표를 격자로 이산화하거나, 향상 임계값 ε > 0 을 두어 c(s') < c(s) - ε 일 때만 받아들이는 식으로 우회한다. (2) 동가 비용 이웃 — c(s') = c(s) 인 이웃을 받아들이면 — 무한 순환 가능. 의사코드의 >= 는 이를 차단한다. (3) 비결정적 이웃 평가 — 이웃을 다 보지 않고 첫 향상에서 멈추는 first improvement 변형 — 은 동일하게 정확성 성립. 단 결과 해는 달라질 수 있다 (탐색 순서 의존).
왜 이 복잡도가 정확한가. 로컬 서치의 복잡도는 두 부분으로 나뉜다. 한 단계 의 비용 — 이웃 탐색과 평가 — 과 전체 단계 수 — 향상의 누적 횟수. 둘을 곱한 것이 총 비용. 흥미롭게도 전체 단계 수 의 worst-case 는 NP-난해의 경계에 닿아 있다.
정리 2.5 (Per-step Complexity for 2-opt TSP).
2-opt 이웃의 한 단계 향상 탐색은
O(n²)시간 (n = 도시 수). 증분 평가 (delta evaluation) 로 각 swap 평가가O(1).
증명. 2-opt 이웃 크기는 C(n,2) = n(n-1)/2 = O(n²). 한 swap의 비용 변화는 네 간선 — 빠진 두 개 + 더한 두 개 — 만 보면 되므로 O(1). 총 O(n²) × O(1) = O(n²). ∎
정리 2.6 (Total Steps Worst-case).
정수 가중치 TSP의 2-opt 향상 단계는 worst-case 에서
O(n · 2^n)까지 가능 (Englert–Röglin–Vöcking, 2007). 그러나 smoothed complexity 에서는 다항 시간.
증명 스케치. worst-case bound는 정밀하게 구성된 입력에서 증명됨 (논문 참조 — 본 책 범위 초과). smoothed complexity 결과는 평균적 입력에서 다항 시간 향상 누적을 보임. ∎
정리 2.7 (PLS-completeness, Johnson–Papadimitriou–Yannakakis 1988).
"TSP의 2-opt 국소 최적을 찾는 일" 은 PLS-complete (Polynomial Local Search class에서 가장 어려운 문제 중 하나). 이 문제가 다항 시간에 풀리는지 (PLS = P 인지) 는 현재까지 미해결.
증명 개요. JPY 1988 은 PLS 클래스를 정의하고, 여러 자연 문제 — TSP/2-opt, MAX-CUT/flip neighborhood, MAX-SAT/flip — 의 국소 최적 찾기 가 그 클래스의 complete 문제임을 보임. 환원은 tight PLS reduction 이라 불리는 정밀한 환원. 자세한 내용은 원논문 §5. ∎
이 정리들이 알려주는 풍경은 흥미롭다. 한 단계 는 빠르다 (O(n²)). 전체 시간 은 평균적으로 다항이지만, worst-case 는 지수 가능. 다항 보장 알고리즘 의 존재는 수학적 미해결. 로컬 서치는 실용에서 잘 작동 하지만 이론에서는 깊은 미스터리 다.
하계. 2-opt 보다 근본적으로 좋은 다항 시간 TSP 휴리스틱이 존재하는가는 미해결. Lin–Kernighan은 실용적 으로 더 좋지만 worst-case 보장은 유사. Christofides 알고리즘 (1976) 은 근사 비율 3/2 의 다항 보장 — 단 metric TSP 한정. 2021년 Karlin–Klein–Oveis Gharan 이 3/2 - ε (매우 작은 ε) 로 처음 개선했다.
왜 smoothed complexity 가 필요한가. worst-case 가 지수, 평균이 다항이라는 두 결과 사이에 현실의 정확한 그림 은 어디 있는가? Smoothed analysis (Spielman–Teng, 2001 — 2008 Gödel Prize) 가 답한다. worst-case 입력에 작은 가우시안 잡음을 더한 뒤 평균 을 본다. 그러면 지수 worst-case 가 다항으로 매끄러워진다. 2-opt 의 smoothed complexity 는 O(n^{4+δ}) (Manthey–Veninga, 2013). 이는 시간 복잡도 이론의 한 핵심 분야 — 현실의 알고리즘이 왜 잘 작동하는가 의 수학적 답.
보조정리 2.9 (Delta Evaluation Soundness).
2-opt swap을
(a,b),(c,d)→(a,c),(b,d)로 정의할 때, 비용 변화는Δ = w(a,c) + w(b,d) − w(a,b) − w(c,d). 이는 전체 순회를 다시 평가하지 않고O(1)시간에 정확히 계산된다.
증명. 새 순회의 총 비용은 c(s') = c(s) − w(a,b) − w(c,d) + w(a,c) + w(b,d) — 두 간선이 빠지고 두 간선이 더해진다. 그 사이의 반전된 부분 순회 의 내부 간선들은 모두 동일 (방향만 뒤집힘, 대칭 거리 가정 아래 비용 불변). 따라서 Δ = c(s') − c(s) 는 위 네 간선만으로 결정. ∎
이 보조정리가 왜 중요한가. 한 swap의 평가가 O(n) 이면 전체 이웃 평가가 O(n³) — 큰 사례에서 한 단계가 너무 비싸 실용 불가. delta evaluation 으로 O(n²) 로 떨어진다. 이것이 Lin (1965) 이후 모든 2-opt 구현의 핵심 트릭. 비대칭 거리 (asymmetric TSP) 에서는 반전된 부분 순회의 내부 간선들도 방향이 뒤집혀 다른 비용을 가질 수 있으므로 delta가 O(n) 으로 늘어난다 — 이것이 asymmetric TSP에서 2-opt가 실용에서 덜 효과적 인 이유.
로컬 서치는 조합 최적화의 도구상자 중 가장 큰 가족이다. 핵심 변주를 본다.
3-opt, k-opt. 2-opt 의 자연스러운 일반화. k 개 간선을 동시에 교체. 3-opt 이웃은 O(n³), 그래도 한 swap 평가는 O(1). 향상은 더 좋지만 단계 비용 비싸짐.
Lin–Kernighan (1973). 변동 깊이 k-opt. 한 단계에서 k 가 알고리즘이 결정. 시작 간선 하나를 빼고, 어디서 닫을지를 시도하며 결정. 실용에서 가장 강력한 TSP 휴리스틱.
Tabu Search (Glover, 1986). 최근에 방문한 해 의 목록 (tabu list) 을 유지. 그 해로의 복귀를 금지. 국소 최적에서 비향상 이동을 허용해 빠져나옴. 이름은 폴리네시아어 "taboo" 에서.
Variable Neighborhood Search (Mladenović–Hansen, 1997). 여러 이웃 함수 N_1, N_2, …, N_k 를 순서대로 시도. N_1 에서 국소 최적이면 N_2 로. 더 큰 이웃에서는 또 향상 가능.
Iterated Local Search. 국소 최적에 도달하면 perturbation (해를 약간 망가뜨림) 후 다시 로컬 서치. 대분지 도약.
Random Restart. 가장 단순한 빠져나옴 — 처음부터 다시 시작. 많은 초기 해에서 시도해 최선 을 채택.
그림 2.5 ― 변형 가계도.
LocalSearch (개념)
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
2-opt (1965) 이웃 확장 탈출 전략
│ │ │
▼ ┌────┴────┐ ┌────┼────┬────────┐
3-opt, k-opt LK VNS Tabu ILS Random Simulated
(1973) (1997) (1986) Restart Annealing
(Ch. 8)
마지막 화살표 — Simulated Annealing — 은 이 책의 8장 우주선 의 주연. 로컬 서치의 가장 정교한 친척이다. 비향상 이동 을 확률적으로 허용하되, 그 확률을 시간에 따라 줄여간다. 8장에서 자세히.
연속 공간 로컬 서치. 안테나처럼 좌표가 실수 인 문제는 이산 TSP와 다른 이웃 구조를 쓴다. 가장 단순한 것이 coordinate descent — 한 좌표씩 차례로 최적화. 다음이 gradient descent (목적 함수가 미분 가능할 때) 와 그 변형 stochastic gradient. 더 일반적으로는 Nelder–Mead simplex (1965, 같은 해!) — 미분 없이 심플렉스 꼭짓점 을 움직여가는 로컬 서치. 안테나 문제는 목적 함수가 불연속 (덮인 가구 수가 정수) 이므로 Nelder–Mead나 pattern search (Hooke–Jeeves, 1961) 가 더 적합. 이산과 연속의 경계에 있는 안테나의 실제 풀이 는 양쪽 도구를 섞는다 — 위치 어디인가 는 이산 (격자 칸), 어느 격자에서 어느 격자로 옮기는가 는 2-opt 같은 swap.
Lin의 1965 BSTJ 논문은 25 페이지짜리, 두 칼럼 조판의 차분한 글. 첫 페이지에 문제 정의 — n 개 도시와 거리 행렬, 모든 도시를 한 번씩 방문하는 최소 비용 순회. 두 번째 페이지부터 2-opt — 논문에서는 "branch exchange" 라 부른다 — 의 정의와 의사코드. swap 이라는 용어는 그 자리에 등장한다.
논문의 §3 은 실험 결과. 당시 IBM 7094 컴퓨터에서, 다양한 크기의 TSP (10~125 도시) 에 대해 2-opt를 돌린 결과 표. 전역 최적 과의 비교는 작은 사례만 — 큰 사례의 전역 최적은 알 수 없었다. Lin은 결과를 비교 가능한 한 가지 다른 알고리즘 — Croes (1958) 의 substitution algorithm — 과 나란히 보고. 2-opt가 거의 모든 사례에서 더 빠르고 좋았다.
논문의 §5 는 통계적 분석. Lin은 같은 TSP를 여러 random 초기 해 에서 출발해 2-opt를 돌린 뒤, 각 국소 최적의 비용 분포 를 본다. 그 분포가 어떤 모양인지 — 한 봉우리 (unimodal) 인지, 여러 봉우리인지 — 가 지형의 모양 에 대한 첫 통계적 단서를 준다. 이 분석은 이후 fitness landscape analysis 라는 부분 분야의 시작이 된다.
1973년 Lin–Kernighan 논문은 Operations Research 21권. 19 페이지. Lin 단독 1965 논문보다 더 정밀한 알고리즘 명세. 핵심은 λ-opt 의 가변 깊이 구현. 가지치기 규칙 — gain criterion, sequentiality, don't look bit — 이 차분히 설명된다. 1973년 발표된 알고리즘은 50년이 지난 지금까지 큰 수정 없이 TSP 풀이에 쓰인다. Concorde 같은 최첨단 solver의 내부 휴리스틱 단계가 LK의 직계 후손이다.
Shen Lin (1933–2008). 중국 베이징 출생. 1949년 중화인민공화국 수립 후 가족이 홍콩, 이어 미국으로 이주. 1957년 UC Berkeley 학사 (수학), 1965년 Princeton 박사 (수학). Bell Labs 입사 1962년, 정년 1995년. 운영연구·정수 계획·휴리스틱의 한 시대를 만들었다. 자녀들에게 "Computer Solutions of the Traveling Salesman Problem" 가 자기 인생의 가장 자랑스러운 논문이라 말했다 (2008년 부고 기사, AT&T Labs Memorial).
Brian W. Kernighan (1942–현재). 캐나다 토론토 출생. 1969년 Princeton 박사. 1969~2000 Bell Labs, 2000~ Princeton 교수. C 언어의 The C Programming Language (Kernighan & Ritchie, 1978) 의 저자. AWK, AMPL 등의 공동 설계자. Software Tools, The Practice of Programming 등 소프트웨어 공학 고전의 저자. 2018년 Princeton University Press 가 그의 자서전 UNIX: A History and a Memoir 출간. Lin–Kernighan 알고리즘에서의 그의 기여는 본인 회상에 따르면 "주로 구현과 실험. 알고리즘의 핵심 아이디어는 Lin이 가져왔다" (2014년 인터뷰).
두 사람의 협업은 Bell Labs의 한 시대 — 1960~80년대의 황금기 — 를 상징한다. 같은 부서의 사람들이 점심을 같이 먹다가 알고리즘을 떠올리고, 오후에 IBM 7094 앞에서 직접 구현 하고, 그 결과로 Operations Research 에 논문을 보내는 환경. Kernighan이 회상하기를 — "당시 Bell Labs는 대학과 산업 연구소의 좋은 점만 모은 곳이었다."
같은 시기 Bell Labs에는 Ken Thompson과 Dennis Ritchie가 UNIX를 만들고 있었고, Claude Shannon은 정보이론 의 후속 작업을, Richard Hamming은 오류 정정 코드를, Stephen Cook은 Toronto에서 NP-완전성을 (1971), 옆 동네 IBM Research에서는 Cobham–Edmonds 가 다항 시간을 효율적 알고리즘의 정의 로 자리매김시키고 있었다. 1960~70년대의 알고리즘 황금기 — 이 단어가 처음 등장한 시대.
시대의 그림자. Lin은 1970년대 Steiner Tree 문제에도 같은 종류의 휴리스틱을 시도했지만 발표하지 않았다 (사후 발견된 미발표 메모, AT&T 아카이브). Kernighan은 1980년대 이후 시스템 소프트웨어 로 무대를 옮기며 알고리즘 분야와 멀어졌다. Lin–Kernighan 이라는 이름은 두 사람의 합작이 예외적으로 깊었던 한 순간의 기념이다. 그 한 순간이 50년의 표준을 만들었다.
다익스트라 (1장의 주인공) 도 1970년대 로컬 서치를 비판하는 짧은 EWD 메모를 남겼다 — EWD 656, On Local Optimization, 1978. 그 메모에서 다익스트라는 "만족할 만한 해를 그저 받아들이는 풍조 (the cult of near enough)" 를 우려했다. 그는 증명 가능한 최적성 의 알고리즘만이 알고리즘이라는 이름을 받을 자격 이 있다고 보았다. Lin–Kernighan은 그의 기준에서는 부족 했다.
그러나 시대는 다익스트라의 편이 아니었다. NP-완전성 (Cook 1971, Karp 1972) 이 알려진 직후, 학계는 최적성 보장 과 다항 시간 을 동시에 갖기 불가능 한 문제가 수많이 존재함을 받아들였다. 그 자리에서 Local Search 의 가치가 새롭게 보이기 시작한다 — 불가능을 인정한 자리에서 가장 영리한 도구. 이 시각의 전환은 Garey–Johnson의 1979 책 Computers and Intractability 에서 정점을 찍는다. 그 책의 마지막 장은 근사 알고리즘과 로컬 서치 에 할애된다. 그것이 현대 조합 최적화의 출발점.
이 장의 알고리즘 — Local Search — 은 Expert 2번 안테나 풀이의 골격이다. 풀이는 두 단계로 나뉜다.
1단계 (Construction). 그리디로 초기 안테나 배치를 잡는다. 가구 밀도가 높은 곳부터 차례로 안테나 위치를 잡거나, k-means 비슷한 씨앗 으로 시작. 이 단계의 결과는 그럴듯한 해 — 전역 최적과는 거리가 있지만 시작점 으로 충분.
2단계 (Improvement). Local Search. 이웃 연산은 (a) 한 안테나의 위치를 작은 거리 δ 만큼 흔들기, (b) 두 안테나의 위치를 swap, (c) 한 안테나를 덜 중요한 자리 에서 빈 자리 로 옮기기. 이 세 이웃을 VNS 처럼 순서대로 시도. 더 이상 향상이 없으면 random perturbation 후 다시 — 즉 Iterated Local Search.
제출 시 트릭. 경시 풀이의 두 가지 영리함. (1) 시간 예산 관리 — 제한 시간이 5초라면 그 안에서 얼마나 많은 random restart 를 할지 결정. 한 번의 Local Search 가 평균 0.5초라면 10번 재시작. (2) 증분 평가의 캐싱 — 안테나 i의 위치 변화는 그 안테나의 커버 영역 만 다시 계산하면 된다. 다른 안테나의 커버는 불변. 이 캐싱이 한 단계의 비용을 O(전체 가구 수) 에서 O(영향 받는 가구 수) 로 줄인다.
여기서 다익스트라와의 비교가 흥미롭다. 1장의 다익스트라는 전역 최적 을 증명 한다. 2장의 Local Search는 국소 최적 만 보장한다. 그러나 — 안테나 문제는 NP-난해의 친척 이고 (Facility Location의 변종), 다익스트라같은 그리디로 옳은 알고리즘이 존재하지 않는다. 우리는 최선을 포기 하고 충분히 좋음 을 받아들인다. 정리 2.7 의 PLS-completeness 가 이 받아들임의 수학적 변명 이다 — 우리가 더 잘 할 수 없는 게 아니라, 더 잘 할 수 있는지가 미해결.
요약하면 — 안테나 문제에서 Local Search는 유일한 정직한 도구 다. 다익스트라 같은 증명 가능한 옳음 의 도구가 존재하지 않는 자리에서, Local Search는 국소 최적성 이라는 정직한 보장 을 제공한다. 그 보장이 전역 최적성 보다 약하다는 것을 명시적으로 인정 하고, 그 약함을 체계적인 탐색 (random restart, ILS) 으로 메운다. 알고리즘 설계의 겸손함 의 한 사례 — 그리고 이 겸손함은 Lin–Kernighan 시대 이후의 모든 휴리스틱 설계의 공통 자세다.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/02-antenna.html
[Lin1965]
[LinKernighan1973]
[Glover1986]
[MladenovicHansen1997]
[PapadimitriouSteiglitz1982]
[AartsLenstra2003]
[JohnsonPapadimitriouYannakakis1988]
[ChandraKarloffTovey1999]
전체 항목은 bibliography.md 참조.
그리디가 옳다는 것의 증명은, 옳지 않은 그리디와 교환해 보는 데서 시작한다.
"We finally have a notion of a structure for which the greedy algorithm always finds the optimum: it is the matroid." — Jack Edmonds, Matroids and the Greedy Algorithm (1971).
| 항목 | 값 |
|---|---|
| Expert № | 03 |
| 주연 | Greedy Exchange Argument (Edmonds, 1971) |
| 조연 | Matroid (Whitney 1935), Activity Selection (EFT), Interval Scheduling, Huffman Coding (1952), MST |
| 원논문 | Edmonds (1971). "Matroids and the Greedy Algorithm." Mathematical Programming 1: 127–136. |
| 대표 교과서 | Kleinberg–Tardos Ch. 4, CLRS Ch. 15, Welsh (1976) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
새벽의 물류 창고. 큰 트럭 몇 대가 줄지어 서 있다. 짐들이 줄을 서 있다. 각 짐은 언제까지 어디로 배송되어야 한다 — 마감 시각이 박혀 있다. 트럭의 수는 한정되어 있고, 각 트럭은 하루 동안 일정 수의 짐만 실어 나를 수 있다. 어느 트럭에 어느 짐을 — 어느 순서로 — 실어야 최대로 많은 짐 이 마감 안에 도착할까? 혹은 — 어떻게 실어야 연체 벌점의 합 이 최소가 될까?
이 종류의 스케줄링 문제는 한 가지 매혹적인 특성이 있다. 대부분의 사례에서 그리디로 풀린다. 짐을 마감이 빠른 순 으로 정렬한 뒤 차례대로 트럭에 싣는다. 혹은 짐의 가치가 큰 순 으로 싣는다. 혹은 처리 시간이 짧은 순 으로. 어느 그리디가 옳은가는 — 놀랍게도 — 문제의 정확한 구조 에 따라 수학적으로 결정된다.
여기서 마법이 일어난다. 그리디는 빠르다 — O(n log n) 의 정렬 한 번 + 선형 스캔. 그러나 일반적으로 옳음을 보장하지 않는다. 2장의 Local Search가 보여주듯, 그리디가 만든 해 는 국소 최적 일 뿐 전역 최적 이 아닐 수 있다. 그런데 — 어떤 문제는 그리디가 항상 전역 최적 이다. 다익스트라가 그랬다 (1장). MST의 Kruskal도 그렇다 (12장에서 자세히). 인터벌 스케줄링의 Earliest Finish Time 그리디도 그렇다.
무엇이 다른가? 어떤 구조가 그리디를 옳게 만드는가. 이 질문에 1971년 Jack Edmonds 가 정확한 답을 내놓는다. 답의 이름은 Matroid. 그리고 그리디가 옳음의 증명 의 표준 기법 — Exchange Argument — 이 그 답의 언어 다. 이 장은 그 언어를 배우는 일이다.
Expert 3번 — 물류 — 의 풀이는 정확히 이 자리에 있다. 그리디로 풀린다. 그런데 왜 그리디가 옳은가 의 답은 — 문제 자체를 들여다보면 matroid 가 아니다. 그러나 작은 변형 — 추가 제약 한 줄을 풀면 — matroid 가 된다. 그래서 풀이는 그 작은 변형 위에서 그리디로 풀고, 변형이 원래 문제와 같음 을 따로 증명한다. 두 단계 — matroid 위의 그리디 + 변형의 등가 증명 — 가 풀이의 두 축. 이 장 끝에서 우리는 두 축이 왜 둘 다 필요한지 안다.
이 장은 다른 장들과 한 가지 면에서 다르다. 알고리즘 하나 가 아니라 알고리즘을 옳다고 증명하는 도구 가 주인공이다. 이 도구의 이름은 exchange argument. 그 응용은 책의 12장 (MST의 Kruskal·Prim 의 옳음 증명), 7장 (Min-Cost Flow 의 negative cycle canceling), 그리고 책 바깥의 Huffman coding, fractional knapsack, job scheduling 까지 — 헤아릴 수 없다. 이 장의 도구 하나가 그 모든 정리의 공통된 증명 골격 이다.
1971년 워털루. 캐나다 University of Waterloo의 Jack Edmonds — 캐나다 정수 계획법의 아버지 — 이 Mathematical Programming 1권에 짧은 논문 하나를 싣는다. Matroids and the Greedy Algorithm. 10 페이지짜리. 이 논문이 그리디 알고리즘의 일반 이론 의 시작이다.
그 시점까지 그리디 알고리즘은 경우별로 옳다고 증명되어 왔다. Kruskal의 MST (1956), Dijkstra의 최단경로 (1959), Huffman의 prefix code (1952). 각 증명이 문제별로 다른 트릭 을 썼다. Edmonds는 이 흩어진 증명들을 하나의 공통 구조 — matroid — 위로 끌어올렸다.
Matroid 라는 단어는 사실 Edmonds가 만든 것이 아니다. 1935년 Hassler Whitney — 미국의 위상수학자 — 가 선형 종속성의 추상화 를 연구하다 도입했다. 벡터 공간의 독립 부분집합들이 만족하는 교환 성질 (exchange property) — 한 독립 집합에 다른 독립 집합의 원소를 더하면 어떤 원소를 빼서라도 다시 독립으로 만들 수 있다 — 을 공리화 한 결과가 matroid. Whitney의 1935 논문 On the Abstract Properties of Linear Dependence 가 그 출발.
1935년부터 1971년까지의 35년 동안 matroid는 조합론의 한 분야 로 천천히 자랐다. 그러나 알고리즘과의 연결 은 Edmonds 이전에는 명시적으로 알려지지 않았다. Edmonds는 자신의 1971년 논문에서 "matroid 위의 그리디 = 전역 최적" 이라는 역설적으로 단순한 정리를 증명한다. 그리고 이 정리의 역 도 성립한다 — 모든 가중치에 대해 그리디가 전역 최적인 독립 시스템 은 반드시 matroid. 즉 matroid는 그리디의 옳음을 보장하는 유일한 구조.
이 정리의 충격 은 — 그리디 알고리즘에 분류학 을 주었다는 데 있다. 한 문제가 주어졌을 때, "이 문제의 독립 시스템이 matroid 인가" 를 확인하면 그리디로 풀 수 있는지 즉시 알 수 있다. matroid이면 그리디로 옳고, matroid가 아니면 그리디는 일반적으로 틀린다 — 정확한 가중치 사례에서 반례를 만들 수 있다. 35년 동안 흩어져 있던 증명들이 한 줄로 정리되었다.
Edmonds는 1934년 미국 출생, 1958년 Maryland 박사, 1969년부터 Waterloo 교수. 정수 계획법·매칭·다면체 이론의 거장. 2009년 John von Neumann Theory Prize 수상. 90세를 넘긴 지금까지 활동 중. 그의 1965년 Paths, Trees, and Flowers (매칭 알고리즘) 와 1971년 Matroids and the Greedy Algorithm 은 알고리즘 이론의 두 기둥. 이 책의 4장 (Union-Find) 과 12장 (MST) 도 그의 작업 위에 서 있다.
Matroid 위의 그리디 는 의사코드로 매우 짧다.
algorithm MatroidGreedy(matroid M = (E, I), weights w: E → ℝ):
# 입력: 유한 집합 E, independence 부분집합 I ⊆ 2^E (matroid 공리 만족),
# 각 원소 e ∈ E 에 가중치 w(e).
# 출력: 최대 가중치 독립 집합 (basis).
sort E in decreasing order of w(e)
S = ∅
for each e in sorted E:
if S ∪ {e} ∈ I: # 독립성 유지되면
S = S ∪ {e} # 추가
return S
이 8줄짜리 알고리즘이 — 적절한 matroid 위에서 — 전역 최적 을 보장한다. 정렬 한 번과 선형 스캔 한 번. O(|E| log |E|) + O(|E| · T_independence) (여기서 T_independence 는 한 독립성 검사 비용).
구체적 예 — 인터벌 스케줄링. n 개의 시간 인터벌 (각각 시작·끝 시각). 서로 겹치지 않는 최대 부분집합 을 골라라. EFT 그리디: 인터벌을 끝 시각이 빠른 순 으로 정렬, 차례로 시도해 현재 선택된 마지막 인터벌과 안 겹치면 추가.
algorithm EFTGreedy(intervals I = {(s_i, f_i)}):
sort I in increasing order of f_i
selected = []
last_finish = -∞
for (s, f) in sorted I:
if s >= last_finish:
selected.append((s, f))
last_finish = f
return selected
이 알고리즘이 최적 임의 증명이 exchange argument 의 가장 깨끗한 예다. §6 에서 자세히.
그림 3.1 ― 인터벌 스케줄링의 EFT 그리디.
인터벌:
━━━━━━ (1)
━━━━━ (2)
━━━━━━━━━━ (3)
━━━ (4)
━━━━━━ (5)
끝 시각 순 정렬: (1), (2), (4), (5), (3)
- (1) 선택 → last_finish = 6
- (2) 시작 7 >= 6 → 선택 → last_finish = 11
- (4) 시작 12 >= 11 → 선택 → last_finish = 14
- (5) 시작 13 < 14 → 거절
- (3) 시작 3 < 14 → 거절
결과: {1, 2, 4} — 3 개. 이것이 전역 최적.
여기서 왜 EFT가 옳은가 — exchange argument 의 첫 시범. 그리디 해 G = (g_1, g_2, …, g_k) (끝 시각 순) 와 최적 해 OPT = (o_1, o_2, …, o_m) (끝 시각 순) 이 다르다고 가정하자. 첫 다른 자리 — i 번째 — 까지는 둘이 같다. 그리디는 g_i = o_i 까지 동일. i 이후 첫 다른 자리에서 g_i 와 o_i 가 다르다. 그리디는 EFT 규칙 으로 g_i 를 골랐으므로, f(g_i) ≤ f(o_i) (그리디가 더 빨리 끝난다). 이제 OPT 에서 o_i 를 g_i 로 교환 해보자. g_i 는 끝이 더 빠르므로 그 다음 인터벌 o_{i+1} 과도 안 겹친다. 따라서 교환된 해도 유효, 크기는 동일. 모든 자리를 교환하면 G = OPT (크기 같음). 즉 G 도 최적. ∎ — 이것이 exchange argument.
독립 시스템. (E, I) 가 independence system 이란, E 는 유한 집합, I ⊆ 2^E 가 부분집합 닫힘 을 만족 — A ∈ I, B ⊆ A ⟹ B ∈ I. I 의 원소를 독립 집합. 극대 (maximal) 독립 집합을 basis. 같은 크기의 basis들이 있을 수도, 다른 크기들이 있을 수도.
Matroid. (E, I) 가 matroid 란, independence system 이면서 다음 exchange property 를 만족 — A, B ∈ I, |A| < |B| ⟹ ∃e ∈ B \ A : A ∪ {e} ∈ I. 즉 작은 독립 집합 에서 더 큰 독립 집합 으로 원소 하나 를 가져올 수 있다, 독립성을 깨지 않으면서.
Weighted matroid. matroid (E, I) + 가중치 w : E → ℝ. 최대 가중치 basis 가 우리가 찾는 것.
예시 1 (Uniform matroid). E = [n], I = {A : |A| ≤ k} (어떤 k 개 이하의 부분집합). basis = k-원소 부분집합. 그리디 = 큰 k 개. 옳음 자명.
예시 2 (Graphic matroid). G = (V, E) 그래프. I = {A ⊆ E : A 가 사이클을 갖지 않음 = forest}. basis = spanning forest. 그리디 + 가중치 = Kruskal's MST (12장).
예시 3 (Partition matroid). E = E_1 ∪ ⋯ ∪ E_k (분할), I = {A : |A ∩ E_i| ≤ d_i for all i}. 각 부분에서 최대 d_i 개. 그리디 = 각 부분에서 가중치 큰 d_i 개.
예시 4 (Linear matroid). E = 벡터 집합, I = 선형 독립 집합들. Whitney 1935의 원형. basis = 벡터 공간의 기저.
왜 이 보조정리들이 필요한가. 우리가 §6에서 증명하려는 것은 matroid → 그리디 옳음 의 정리다. 이 증명의 핵심은 exchange property를 반복 적용해 그리디 해와 최적 해를 일치시키는 데 있다. 그 일치의 각 단계 가 보조정리로 정리되어야 한다.
보조정리 3.1 (Basis Size Invariance).
Matroid
(E, I)의 모든 basis (극대 독립 집합) 는 같은 크기 를 가진다. 이 공통 크기를 rankr(M)이라 한다.
증명. 두 basis A, B 의 크기가 다르다고 — |A| < |B| — 가정. exchange property 에 의해 ∃e ∈ B \ A : A ∪ {e} ∈ I. 그러나 A ∪ {e} 가 독립이면 A 가 극대 가 아니다 — 모순. ∎
이 보조정리가 왜 깊은가. 그리디 알고리즘이 어떤 순서로 원소를 더해도 결국 같은 크기의 결과 에 도달함을 보장한다. 각 가지 결정 이 최종 크기에 영향을 주지 않는다. 이것이 matroid 의 "안전성" — 결정 시 돌이킬 수 없다는 후회 가 없는 구조.
보조정리 3.2 (Augmentation).
Matroid
M = (E, I), 독립 집합A ∈ I, 그리고e ∈ E \ A가 어떤 basis 에 속한다고 하자. 그러면A ∪ {e}가 독립이거나, 또는A의 어떤 원소f를e와 교환해(A ∪ {e}) \ {f}가 독립.
증명. e 가 basis B 에 속한다고 가정. exchange property 를 A 와 B 에 적용 (|A| ≤ |B| 일 때). 자세한 구성은 Welsh (1976) §1.2. ∎
보조정리 3.3 (Greedy Maintains Independence).
MatroidGreedy알고리즘은 알고리즘 진행 중 항상 독립 집합 을 유지한다.
증명. 알고리즘은 매 단계 독립성 검사 후에만 원소를 추가. invariant 가 직접. ∎
보조정리 3.4 (Hereditary Property).
Matroid
(E, I)에서,A ∈ I이고B ⊆ A이면B ∈ I. (Independence system 의 정의 그대로지만, 강조해 둔다.)
증명. Independence system 의 정의가 곧 이 성질. matroid 는 independence system 의 특수 형태. ∎
보조정리 3.5 (Rank Function Monotonicity).
Matroid 의 rank function
r : 2^E → ℤ_{≥0}을r(X) = max{|A| : A ⊆ X, A ∈ I}로 정의하면, (a)r(∅) = 0, (b)r(X) ≤ |X|, (c)X ⊆ Y ⟹ r(X) ≤ r(Y), (d) submodularity:r(X ∪ Y) + r(X ∩ Y) ≤ r(X) + r(Y).
증명 스케치. (a)–(c) 는 정의에서 직접. (d) 가 핵심 — submodularity. A ⊆ X ∩ Y 의 최대 독립 집합 을 잡고, 그것을 augmentation 으로 X 와 Y 각각에서 확장. exchange property 가 보조정리 3.2 와 결합되어 submodularity 따라옴. 자세한 증명은 Welsh (1976) §1.7. ∎
이 보조정리가 왜 중요한가. Matroid rank function 의 submodularity는 모든 matroid 의 정의 — submodular function 의 한 변종 — 으로 등가화된다. 즉 matroid 와 submodular function 이 수학적 쌍둥이. 이 사실이 Edmonds (1970) 의 polymatroid 이론으로 자라난다. 7장 (Min-Cost Flow) 의 도구 상자에 직접 연결.
왜 이 정리가 필요한가. 우리는 matroid + 그리디 = 전역 최적 이라는 핵심 정리를 증명한다. Edmonds (1971) 의 결과. 역 도 함께 — matroid 가 아닌 독립 시스템에서는 그리디가 일반적으로 틀린다.
정리 3.4 (Edmonds, 1971).
(E, I)가 matroid 이고w : E → ℝ_{≥0}가 비음수 가중치이면,MatroidGreedy(E, I, w)는 최대 가중치 basis 를 반환한다.
증명. 그리디 출력을 G = (g_1, g_2, …, g_r) (선택 순서, w(g_1) ≥ w(g_2) ≥ ⋯). 최적 basis를 O = (o_1, o_2, …, o_r) (가중치 내림차순). 보조정리 3.1 에 의해 크기 같음.
주장. 모든 i 에 대해 w(g_i) ≥ w(o_i).
귀류로 — 어떤 i 에서 w(g_i) < w(o_i) 라고 가정. G_{i-1} = {g_1, …, g_{i-1}} 와 O_i = {o_1, …, o_i} 를 본다. |G_{i-1}| = i - 1 < i = |O_i|. exchange property 에 의해 ∃ o_j ∈ O_i \ G_{i-1} 로 G_{i-1} ∪ {o_j} ∈ I. 이 o_j 의 가중치는 w(o_j) ≥ w(o_i) > w(g_i) (O 가 내림차순).
그러나 그리디가 g_i 를 선택한 순간, o_j 도 후보였을 것이다 (왜냐하면 w(o_j) > w(g_i) 이므로 정렬에서 o_j 가 g_i 보다 앞에 있고, 그리디는 내림차순 으로 본다). 그리고 G_{i-1} ∪ {o_j} ∈ I 이므로 그리디가 반드시 o_j 를 선택했어야 한다. 그러나 그리디는 g_i 를 선택했다 — 모순. ∎
총 가중치 비교: w(G) = Σ w(g_i) ≥ Σ w(o_i) = w(O). O 가 최적이므로 w(G) ≥ w(O) ≥ w(G) → w(G) = w(O). G 도 최적. ∎
증명이 깨지는 가정. 비음수 가중치 가정이 깨지면 — 음수 가중치를 선택 하지 않는 것이 더 좋을 수 있다 — 그리디가 원소를 추가만 하기 때문에 음수 원소를 피할 능력이 없다. 우회: 음수 가중치는 제외 하고 그리디 적용 (음수 원소는 반드시 최적 해에 안 들어감, easy 보조정리). matroid 가정 이 깨지면 — exchange property 가 깨지면 — 위 증명의 핵심 단계 ("그리디가 반드시 o_j 를 선택했어야 한다") 가 무너진다. 반례를 만들 수 있다 (다음 그림).
정리 3.5 (Edmonds 1971, 역방향).
(E, I)가 independence system 이고, 모든 가중치w ≥ 0에 대해 그리디가 최적 basis 를 반환한다면,(E, I)는 matroid.
증명 스케치. exchange property 가 깨진다고 가정 — A, B ∈ I, |A| < |B|, ∀e ∈ B \ A : A ∪ {e} ∉ I. 적절한 가중치를 만들어 — A 의 원소는 큰 가중치, B \ A 는 중간, 나머지는 0 — 그리디가 A 를 만들지만 B 가 더 큼. 그리디가 틀림. 자세한 구성은 Edmonds (1971) §3. ∎
그림 3.2 ― matroid 아닌 시스템의 그리디 실패.
E = {a, b, c, d}, weights: w(a)=3, w(b)=2, w(c)=2, w(d)=2.
I = {∅, {a}, {b}, {c}, {d}, {a,b}, {c,d}}. (특정 부분집합만 독립)
이 (E, I) 는 partition matroid 가 아니다.
exchange 검사: A={a,b}, B={c,d}. |A|=|B|=2. exchange? c ∉ A, A∪{c} = {a,b,c} ∉ I. d 같음.
→ exchange property 위반. matroid 아님.
그리디: w(a)=3 ✓ 추가 → {a}. w(b)=2 ✓ → {a,b}. w(c)=2: {a,b,c}∉I → 거절. w(d)=2: 거절.
결과: {a,b}, 가중치 5.
그러나 OPT = {a,b} 도 5 — 이 경우 같음. 다른 가중치 — w(c)=w(d)=3 — 면 OPT={c,d}=6, 그리디는 {a,b}=5. 틀림.
왜 이 복잡도가 정확한가. 그리디는 정렬 (O(n log n)) + 선형 스캔 + 독립성 검사. 검사 비용이 모든 것을 결정한다.
정리 3.6 (Greedy Complexity).
MatroidGreedy(E, I, w)의 시간 복잡도는O(n log n + n · T_I), 여기서n = |E|,T_I는 한 번의 독립성 검사 비용.
증명. 정렬 O(n log n). 루프 n 회, 각 회당 한 번의 검사 T_I. 총 O(n log n + n · T_I). ∎
구체적 사례:
|A| ≤ k): T_I = O(1). 총 O(n log n).T_I = O(α(n)) (Union-Find로 사이클 검사). 총 O(n α(n)) (정렬 제외 시). 4장 참조.T_I = O(1) (각 부분의 카운터). 총 O(n log n).T_I = O(d² · n) (가우스 소거). 총 O(n² log n + n · d² · n) = O(d² · n²) — 실용에서 큰 d일 때 비싸짐.하계. 비교 기반 모델 에서 정렬 의 하계 Ω(n log n) 에 의해 MatroidGreedy 의 하계도 같음. matroid + 그리디는 이 하계를 달성하므로 최적 알고리즘 (비교 기반).
정수 가중치 같은 추가 가정에서는 기수 정렬 로 O(n) 가능. 그러면 총 O(n · T_I) — 독립성 검사가 병목.
왜 독립성 검사가 어려울 수 있는가. matroid 는 추상 정의 — exchange property 만 만족하면 된다. 그러나 구체적 사례 에서 한 부분집합이 독립인지 검사하는 비용은 천차만별. graphic matroid 에서는 사이클 검사 — Union-Find 로 O(α(n)). linear matroid 에서는 선형 독립 검사 — 가우스 소거로 O(d² n) (d = 벡터 차원). transversal matroid 에서는 이분 매칭 가능성 검사 — Hopcroft–Karp 로 O(E √V). 어떤 matroid 는 독립성 검사 자체가 NP-난해 — matroid intersection (두 matroid 의 공통 독립) 의 일반화 가 그렇다. matroid 의 알고리즘적 풍부함 의 한 단면.
정리 3.7 (Greedy Approximation for non-Matroid).
(E, I)가 independence system 이지만 matroid 가 아니면, 그리디의 worst-case 근사 비율 은 rank ratior_*(I) = min_{X ⊆ E} (lower rank of X) / (upper rank of X)로 정확히 결정된다 (Hausmann–Jenkyns–Korte 1980).
증명 스케치. lower rank 는 극소 maximal 독립 집합의 크기, upper rank 는 극대 maximal (= basis). 두 비율이 1이면 (= matroid 의 보조정리 3.1) 그리디 정확. 비율이 더 작으면 그리디가 그 비율까지 보장. 자세한 구성은 Korte–Lovász (1980s) 의 Greedoid 이론. ∎
이 정리가 matroid 가 아닌 사례 에서도 그리디의 부분적 보장 을 준다. 예를 들어 최대 매칭 은 matroid 가 아니지만 그리디 매칭 은 1/2 근사 (r_* = 1/2). 이 보장이 근사 알고리즘 의 한 가족의 출발점.
Exchange argument 의 변주.
(a) Activity Selection (CLRS Ch. 16, §16.1). 인터벌 스케줄링과 같음. EFT 그리디.
(b) Huffman Coding (1952). 이진 prefix code 의 최소 평균 길이. 그리디: 가장 빈도 낮은 두 기호 를 형제 노드 로 묶기를 반복. matroid 가 아니다 — 트리 구조 가 본질. 그러나 exchange argument 의 유사한 형태로 옳음 증명.
(c) Kruskal's MST (12장). Graphic matroid의 그리디. 간선 을 가중치 오름차순 으로 보며, 사이클을 만들지 않는 간선을 추가. 이 책 12장에서 자세히.
(d) Job Scheduling with Deadlines — 각 작업이 deadline + value. 데드라인 안 에 끝낼 수 있는 작업들의 최대 value 합. Partition matroid 의 한 사례. 그리디로 옳음.
(e) Fractional Knapsack — 짐을 쪼개서 가져갈 수 있는 배낭 문제. value/weight 비율 큰 순 그리디. 정수 knapsack은 matroid 가 아니다 (NP-난해).
(f) Spanning Forest of edge-weighted graph — Boruvka (1926), Jarník (1930), Prim (1957), Kruskal (1956) 모두 그리디. 12장에서 자세히.
그림 3.4 ― Matroid 의 4가지 사례 (Uniform / Partition / Graphic / Linear).
(1) Uniform U(n,k): (2) Partition:
E = {e1, ..., en} E = E1 ⊔ E2 ⊔ E3
I = "k 이하 부분집합" I = "각 Ei 에서 di 개 이하"
basis = k-원소 부분집합 basis = 각 Ei 에서 정확히 di 개
(3) Graphic M(G): (4) Linear (vector matroid):
E = G 의 간선 E = ℝ^d 의 벡터 집합
I = forest (사이클 없음) I = 선형 독립 집합
basis = spanning forest basis = 벡터 공간의 기저
Kruskal MST 가 그리디 적용 사례 가우스 소거의 추상화
그림 3.5 ― Exchange property 의 시각화.
matroid (E, I), A ∈ I, B ∈ I, |A| < |B|
A = {a1, a2} B = {b1, b2, b3} |A|=2 < 3=|B|
exchange property:
∃ e ∈ B \ A : A ∪ {e} ∈ I
가능한 후보 (B \ A 의 원소들):
e = b1, b2, or b3 — 최소 한 개는 A 에 더해도 독립
┌─────────────────────────────────────────┐
│ A ➕ e=b1 (예시) │
│ ╱ ╲ │
│ a1 a2 + b1 → {a1, a2, b1} ∈ I │ ← exchange property 보장
│ │
└─────────────────────────────────────────┘
만약 어떤 e ∈ B\A 에 대해서도 A ∪ {e} ∉ I 라면
→ exchange property 위반 → matroid 가 아님.
그림 3.6 ― Matroid 인지 결정하는 흐름.
독립 시스템 (E, I) 가 주어짐
│
▼
부분집합 닫힘 성립?
/ \
X ✓
│ │
"기각" ▼
exchange property
모든 A,B with |A|<|B| 에서 성립?
/ \
X ✓
│ │
"matroid 아님" "matroid"
그리디 일반적 X 그리디 = OPT (정리 3.4)
(정리 3.7 의
근사 비율은 가능)
Matroid 의 일반화.
(g) Polymatroid (Edmonds 1970). 정수 대신 실수 벡터 의 독립. 흐름·매칭 알고리즘의 기반.
(h) Matroid Intersection — 두 matroid M_1, M_2 의 동시 독립 집합 중 최대 크기. 다항 시간 (Edmonds 1979). 이분 매칭의 일반화.
(i) Matroid Union — M_1 ∪ M_2 도 matroid. 그리디 적용 가능.
(j) Greedoid — exchange property 를 약화한 변형. 그리디가 일부 가중치 에 대해 옳음. Korte–Lovász 1980년대.
그림 3.3 ― Exchange argument 의 일반 도식.
그리디 해 G: g1, g2, g3, …, g_i, g_{i+1}, …
╲
╲ (교환)
╲
최적 해 OPT: o1, o2, o3, …, o_i, o_{i+1}, …
첫 다른 자리 i 에서:
- 그리디가 g_i 를 선택. OPT 는 o_i.
- 가정: w(g_i) ≥ w(o_i) (또는 보존 부등식)
- 교환: OPT 에서 o_i → g_i 로 바꿔도 유효, 비용 ≤ OPT 비용
- 반복: 모든 자리를 교환하면 G = (교환된 OPT) → 비용 같음
- 결론: w(G) ≥ w(OPT). G 도 최적. □
핵심: "유효성 보존" 과 "비용 보존" 두 조건. matroid 가 둘 다 보장.
Edmonds의 1971 논문은 짧다 — 10 페이지. Mathematical Programming 1권의 두 번째 호. 그 학술지의 창간호 직후 다. Mathematical Programming 자체가 1971년에 시작된 학술지. Edmonds의 논문은 이 새 학술지의 기조 를 정한 글 중 하나.
논문 §1 은 정의. matroid, independence system, basis, rank, exchange property. Whitney의 1935 정의를 그대로 가져옴.
§2 가 핵심. Greedy algorithm and matroid. 정리 3.4 와 그 역 (정리 3.5) 의 증명. 증명은 Whitney 1935 의 결과 와 직접 결합. Edmonds는 증명을 단순화 했다고만 말한다. 그러나 알고리즘적 의미 — 왜 우리가 이 정리에 관심이 있는가 — 는 이 논문이 처음 명시.
§3 은 예제. 그래픽 matroid (MST), partition matroid, transversal matroid. 각각 어떻게 그리디가 옳은가 의 구체적 사례.
§4 가 놀라운 부분. Edmonds 는 matroid 의 일반화 — polymatroid — 도 짧게 소개한다. 이것이 이후 흐름 알고리즘 의 다면체 이론 (7장의 Min-Cost Flow 의 기반) 으로 자라난다. 1971년 한 논문에 세 개의 큰 분야 의 씨앗이 함께 있었다.
문체는 차분하다. 정리·증명·예제·일반화의 clean structure. 후속 연구자들이 따르기 쉽다. Edmonds 의 모든 논문이 이 톤이다 — 천재의 글이 아니라 교사의 글.
Whitney 1935 의 산책. Edmonds 의 1971 이전, 우리는 36년 전 의 Whitney 의 원논문을 한 번 짚어보아야 한다. Whitney 의 1935 American Journal of Mathematics 논문 On the Abstract Properties of Linear Dependence 는 25 페이지짜리. 시작은 선형 대수 에서. 벡터 공간의 선형 독립 부분집합 들이 만족하는 성질을 추상화 하는 것이 목표. Whitney 는 이를 matrix 의 id로부터 matroid (= matrix-oid) 라 명명. 논문 §3 에 exchange property 가 등장. §5 에 그래프의 forest 가 matroid 의 한 사례임을 보임. §7 에서는 projection 과 contraction — matroid 의 자연스러운 부공간 연산 — 을 정의. 이 모든 것이 1935년에 이미 자리잡혀 있었다. Edmonds 의 36년 뒤 기여는 알고리즘적 의미를 부여 한 데 있다.
Lovász 의 후속. László Lovász (1948–현재, 헝가리 출신 미국 수학자, 1999 Wolf Prize, 2021 Abel Prize) 가 1970년대에 matroid intersection 알고리즘의 다항 시간 보장 (1979년 Annals of Discrete Mathematics). 두 matroid 의 공통 독립 집합 의 최대 크기 — 이 문제가 이분 매칭 과 공통 횡단 등을 일반화. 이 일반화의 수학적 결과 는 조합 최적화의 다면체적 통합 — Schrijver 의 2003 Combinatorial Optimization 3권짜리 책의 중심 주제 — 이다.
Jack Edmonds (1934–현재). 미국 워싱턴 D.C. 출생. 1958년 University of Maryland 박사 (수학). 1961~69년 National Bureau of Standards (지금의 NIST). 1969년부터 University of Waterloo (캐나다). 매칭의 blossom 알고리즘 (1965), matroid의 그리디 정리 (1971), 다면체적 접근 — 모두 그의 작업.
Edmonds 는 알고리즘의 다항 시간이 곧 효율성 이라는 Cobham–Edmonds 명제 의 한 축. Alan Cobham이 1965년에, Edmonds가 1965년 Paths, Trees, and Flowers 에서 독립적으로 같은 정의를 제시. 이 명제 — 다항 시간 = 효율적 — 가 1971년 Cook의 NP-완전성과 결합되어 복잡도 이론 전체의 기초가 된다.
Hassler Whitney (1907–1989). 미국 뉴욕 출생. 1932년 Harvard 박사. Princeton (Institute for Advanced Study, 1952~) 에서 평생 근무. matroid의 창시 (1935) 외에도 singular homology, fiber bundle, manifold theory — 위상수학의 거장. 그가 matroid를 알고리즘적으로 봤다는 흔적은 없다. 1935년 논문 자체가 선형 대수의 추상화 로 출발한 결과. 알고리즘과의 연결은 36년 뒤 Edmonds가.
David Huffman (1925–1999). 미국 오하이오 출생. 1953년 MIT 박사. Huffman coding (1952) — MIT 박사 과정 수업 과제 였다는 일화가 유명. Robert Fano 교수가 기말고사 대신 "최적 prefix code 구성" 을 과제로 냄. 25세의 Huffman 이 일주일 만에 풀었다. 그 풀이가 IRE Proceedings 1952년 호에. 한 페이지짜리 논문. 지금까지 zip, gzip, JPEG 의 내부 에 그대로.
세 인물 — Whitney (1935), Huffman (1952), Edmonds (1971) — 사이의 36년 간격 이 인상적이다. 한 시대의 추상 이 다음 시대의 알고리즘 으로 옮겨오는 속도. 그 사이에 컴퓨터의 발명 (1940년대) 과 알고리즘이라는 분야의 형성 (1960년대) 이 있었다.
Expert 3번 — 물류 — 의 풀이는 그리디 + 교환 인자 의 직접 응용 이다. 풀이의 골격:
1. 문제를 matroid 처럼 보이는 형태로 정리. 짐의 배송을 시간 인터벌 로 보고, 각 트럭이 한 번에 한 짐만 처리 가능 — partition matroid 비슷한 구조. 일부 추가 제약 (트럭의 용량, 짐의 우선순위) 이 matroid 를 깨는 자리. 이 깨는 자리를 분리 한다.
2. Matroid 부분에 그리디. 분리된 matroid 부분 에는 EFT 비슷한 그리디로 지역 최적 을 얻는다. 정리 3.4 에 의해 이 부분의 전역 최적.
3. 나머지 제약은 따로 처리. 트럭 용량 같은 비-matroid 제약은 DP 또는 작은 백트래킹 으로. 전체 풀이의 경계선 이 정확히 matroid 의 경계 와 일치.
4. Exchange argument 로 검증. 풀이가 만든 해가 진짜 최적 인지 — 모든 인접 해에 대해 교환 비교 가 내가 더 좋다 를 보여야. 이 단계가 제출 전 검증 의 핵심.
이 풀이가 다익스트라 (1장) 나 Local Search (2장) 와 다른 점은 — 증명의 도구가 그리디 자체에 내장되어 있다 는 데 있다. 다익스트라는 증명 이 알고리즘 바깥 (보조정리·정리) 에 있다. Local Search는 국소 최적성 만 보장. 그러나 matroid 위의 그리디 는 알고리즘이 곧 증명 — 정리 3.4 가 알고리즘 그 자체.
왜 이 장이 책 전체에서 특별한가. 1장 (Dijkstra) 와 12장 (MST) 은 모두 matroid 위의 그리디 의 사례다. 4장 (Union-Find) 은 graphic matroid 의 독립성 검사 도구. 이 장 — 3장 — 은 그 모든 사례의 공통 이론 을 제공한다. 다른 장들이 나무 라면 이 장은 뿌리. 이 장을 읽고 다른 장을 보면, 왜 그 그리디가 옳은가 의 답이 이미 알고 있는 것 으로 보이기 시작한다. Edmonds (1971) 의 한 정리가 알고리즘 책 한 권의 반쯤 을 정리해 버리는 것이다.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/03-logistics.html
[Edmonds1971]
[Whitney1935]
[Huffman1952]
[KleinbergTardos2005]
[CLRS2022]
[Welsh1976]
[Kruskal1956]
[Oxley2011]
전체 항목은 bibliography.md.
거의 상수 시간, 그러나 정말로 상수는 아닌 — α(n) 의 우아한 진동.
"We give an algorithm requiring O(n · α(m, n)) operations to perform any sequence of m intermixed unions and finds on n elements, where α is a function related to Ackermann's function whose growth is unimaginably slow." — Robert E. Tarjan, Efficiency of a Good But Not Linear Set Union Algorithm, Journal of the ACM 22 (1975), p. 215.
| 항목 | 값 |
|---|---|
| Expert № | 04 |
| 주연 | Union-Find (DSU) with path compression + union by rank (Tarjan, 1975) |
| 조연 | Quick-Find, Quick-Union, weighted union, Tarjan's offline LCA, Link-Cut Trees, Persistent UF |
| 원논문 | Tarjan (1975). "Efficiency of a Good But Not Linear Set Union Algorithm." JACM 22: 215–225. |
| 대표 교과서 | CLRS Ch. 19, Sedgewick–Wayne §1.5 |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
수만 개의 IoT 디바이스가 한 도시의 곳곳에 흩어져 있다. 가로등, 가스 미터, 주차 센서, 농작물 모니터 — 각자 짧은 거리로 무선 통신한다. 도시의 디바이스 연결 지도 가 시간에 따라 변한다. 새 디바이스가 켜지면 — 이웃한 디바이스들과 같은 네트워크 에 합류한다. 어떤 디바이스가 고장 나면 — 그 디바이스가 연결의 다리 였다면 — 네트워크가 둘로 갈라진다. 매 순간 우리는 묻는다: 디바이스 A와 디바이스 B 는 같은 네트워크에 있는가? 지금 도시 전체에는 몇 개의 분리된 네트워크가 있는가?
이 질문에 빠르게 답하는 자료구조가 Union-Find. 디스조인트 셋 자료구조 (Disjoint Set Union, DSU) 라고도 부른다. 두 연산을 지원한다 — union(a, b) 는 a 와 b 가 속한 두 집합을 하나로 합친다, find(a) 는 a 가 속한 집합의 대표 를 반환한다. 같은 네트워크인지 의 질문은 find(a) == find(b) 로 답한다. 단순한 두 연산. 그런데 얼마나 빠른가 의 답이 — 우리가 이 장에서 끝까지 따라갈 — 알고리즘 이론의 한 기적 이다.
가장 단순한 구현 — 각 집합을 리스트 로, union 은 두 리스트의 연결, find 는 선형 스캔 — 은 O(n) 시간. 더 영리한 구현 — 각 집합을 트리 로, union 은 두 트리의 루트 연결, find 는 루트까지의 상향 추적 — 은 O(log n). 여기서 더 영리해질 수 있는가? 예. 두 가지 트릭 — union by rank (작은 트리를 큰 트리에 붙임) + path compression (find 중 거친 모든 노드를 루트에 직접 연결) — 을 결합하면 연산당 O(α(n)) 시간이 된다. 여기서 α(n) 은 Ackermann 함수의 역함수 — 지구상의 어떤 실용적 입력 크기에 대해서도 4 이하의 값 을 가지는 함수. 사실상 상수. 그러나 진짜로 상수 는 아니다 — 충분히 큰 n 에서는 조금씩, 매우 조금씩 자라난다.
이 결과를 처음 증명한 사람이 Robert Tarjan. 1975년의 Journal of the ACM 논문. 28세의 Tarjan 이 Stanford 박사 학위를 막 마치고 Berkeley 에 자리를 잡은 직후. 그 논문에서 그는 Union-Find 의 amortized 복잡도가 정확히 α(n) 임을 보였고 — 이 결과는 1984년 Tarjan–van Leeuwen 이 그 하계도 α(n) 임을 보임으로써 결말 을 보았다. 즉 Union-Find 의 연산당 최선 가능 시간이 정확히 α(n). 더 빠를 수 없다, 더 느릴 필요도 없다. 닫힌 답.
Expert 4번 — IoT — 의 풀이는 정확히 이 자료구조의 직접 사용 이다. 디바이스 ID 를 정수로, 연결 사건 을 union(a, b) 으로, 질의 를 find(a) 와 비교로. 풀이의 시간 복잡도가 연산당 사실상 상수 임을 보장하는 것이 이 장 전체의 정리들. 그리고 — 이것이 알고리즘 이론의 시 (poetry) 인 부분 — 왜 정확히 α(n) 인가, 왜 더 빠를 수 없는가 의 답은 Ackermann 함수의 깊은 구조 와 Fredman–Saks 1989 의 cell probe model 에 닿아 있다. 단순한 두 연산이 최첨단 복잡도 이론 의 한 정점을 만진다.
1964년 미시간 대학교 (University of Michigan). Bernard Galler 와 Michael Fischer — 두 사람 모두 컴퓨터 과학과 — 가 Communications of the ACM 에 두 페이지짜리 짧은 글을 싣는다. An Improved Equivalence Algorithm. 컴파일러 에서 등가 클래스의 합병 을 빠르게 하는 자료구조를 제안. 그것이 우리가 지금 Union-Find 라 부르는 것의 원형. 트리 표현, union 으로 두 루트 연결, find 로 루트까지의 상향 추적. 2 페이지짜리 노트지만 이후 60년간 자라난 한 분야 의 시작.
1973년 John Hopcroft (Cornell) 와 Jeffrey Ullman (Princeton) — 컴파일러와 알고리즘 이론의 두 거인 — 이 SIAM Journal on Computing 에 Set Merging Algorithms 발표. 여기서 처음으로 path compression — find(x) 중 거친 모든 노드 를 루트에 직접 연결 — 트릭이 등장. 효과는 놀랍게 좋다 — 그러나 왜 그렇게 좋은지의 정확한 분석은 2년 뒤 Tarjan 까지 기다려야 했다.
1975년. 28세의 Robert Tarjan 이 그 정확한 분석을 내놓는다. Tarjan 의 1975 JACM 논문은 11 페이지짜리. 제목 Efficiency of a Good But Not Linear Set Union Algorithm. 이 not linear 가 핵심이다 — 분석 전 에는 사람들이 path compression + union by rank = 선형 시간 (각 연산 amortized O(1)) 일 거라 추측. Tarjan 은 그게 틀렸음 을 보인다 — 정확히 α(n) 시간. 그리고 왜 더 빠를 수 없는지 의 부분적인 하계 도 함께. 11 페이지 안에 상한 과 하한 이 모두 들어있다.
그 분석의 수학적 깊이 는 인상적이다. Tarjan 은 Ackermann 함수 의 역함수 α 를 처음으로 알고리즘 분석 에 도입한다. Ackermann 함수 자체는 1928년 Wilhelm Ackermann 이 primitive recursive 가 아닌 계산 가능 함수 의 예로 만든 것. 수학적 호기심 으로 50년을 살아온 함수가, 1975년 알고리즘의 시간 복잡도 의 정확한 답 으로 등장한다. 컴퓨터 과학과 논리학의 깊은 결합.
Tarjan 은 1948년 캘리포니아 출생. 1972년 24세에 Stanford 박사 (지도교수 Donald Knuth 와 Robert Floyd). 1974~1980 UC Berkeley, 1980~1985 Bell Labs, 1985~ Princeton. 1986년 Turing Award 수상 (Hopcroft 와 공동) — 자료구조와 알고리즘 분석 에 대한 공헌. Union-Find 외에도 strongly connected components (1972), planar graph algorithms (1979), Fibonacci heaps (1987, 1장 §8 의 그 Fibonacci heap), splay trees (1985), link-cut trees (1983), Tarjan's offline LCA (1979) 등 — 한 사람이 한 분야를 통째로 만든 사례.
1984년 Tarjan 과 네덜란드의 Jan van Leeuwen 이 또 한 편의 결정적 논문을 JACM 에 발표. Worst-Case Analysis of Set Union Algorithms. 여기서 그들은 path compression + union by rank 의 정확한 worst-case 가 Θ(n · α(m, n)) 임을 상한과 하한 모두 증명한다. 1975 의 상한 결과를 최종 닫음. 이 두 논문 — 1975, 1984 — 가 Union-Find 의 완성된 이론.
Union-Find 의 의사코드는 매우 짧다. 부모 배열 parent[·] 하나, 랭크 배열 rank[·] 하나, 두 연산.
algorithm MakeSet(x):
parent[x] = x # 자신이 루트
rank[x] = 0
algorithm Find(x): # path compression 포함
if parent[x] != x:
parent[x] = Find(parent[x]) # 재귀 호출 결과로 parent 갱신
return parent[x]
algorithm Union(x, y):
rx = Find(x)
ry = Find(y)
if rx == ry: return # 이미 같은 집합
# union by rank
if rank[rx] < rank[ry]:
parent[rx] = ry
elif rank[rx] > rank[ry]:
parent[ry] = rx
else:
parent[ry] = rx
rank[rx] = rank[rx] + 1
세 트릭이 함께 작동한다.
(a) 트리 표현. 각 집합을 트리로. 트리의 루트가 집합의 대표. find 는 루트까지의 상향 추적.
(b) Union by rank. union 시 작은 (낮은 랭크의) 트리를 큰 트리에 붙임. 트리의 깊이 가 O(log n) 으로 유지됨. 이것만으로도 연산당 O(log n).
(c) Path compression. find(x) 중 거친 모든 노드 의 부모를 루트로 직접 연결. 다음 번 find 가 훨씬 빠르다. 이것이 amortized α(n) 를 만드는 결정적 트릭.
작은 예시. 10개 원소, 1, 2, …, 10. 연산 순서: union(1,2), union(3,4), union(5,6), union(7,8), union(1,3), union(5,7), union(1,5).
초기: 1 2 3 4 5 6 7 8 9 10
(rank 모두 0)
union(1,2): 1───2 3 4 5 6 7 8 9 10
rank[1]=1 (둘이 같으므로 한쪽에 +1)
union(3,4): 1───2 3───4 5 6 7 8 9 10
rank[1]=1, rank[3]=1
union(5,6), union(7,8): 마찬가지
union(1,3): rank[1]=rank[3]=1 → 3을 1 밑으로, rank[1]=2
1
╱ ╲
2 3
│
4
union(5,7): 비슷한 모양. rank[5]=2.
union(1,5): rank[1]=rank[5]=2 → 5를 1 밑으로, rank[1]=3
1
┌──────┼──────┐
2 3 5
│ ╱ ╲
4 6 7
│
8
이제 find(8) 을 호출한다고 하자. 8 → 7 → 5 → 1 의 경로를 거쳐 루트 1 에 도달. path compression 트릭에 의해, 그 경로 위 모든 노드 (8, 7, 5) 의 부모가 직접 1 로 갱신된다.
find(8) 후 (path compression):
1
┌─────┬─────┬───┴────┐
2 3 5 7 8 ← 5, 7, 8 모두 1의 직접 자식
│ │
4 6
이 압축 이 다음 번 find(7) 이나 find(8) 을 상수 시간 으로 만든다. 그러나 모든 압축이 평균적으로 얼마나 자주 발생하는가 의 amortized 분석이 — Tarjan 의 1975 결과의 핵심 — 놀랍게 정밀 하다.
그림 4.1 ― Union by rank 의 직관.
rank 비교 시:
작은 트리 (rank=1): 큰 트리 (rank=3):
a R
/ \ / | \
b c x y z
|
w
union 시 작은 트리를 큰 트리 밑으로:
R
/ | \ \
x y z a
| / \
w b c
결과 트리의 깊이 = max(3, 1+1) = 3. ranks 변화 없음 (rank[R] 그대로).
만약 같은 rank 두 트리를 합치면 rank 가 +1. (Lemma 4.1 의 핵심.)
그림 4.2 ― Path compression 의 시각화.
find(x) 호출 전: find(x) 호출 후 (압축):
R R
│ / / / |
a a b c x
│
b
│
c
│
x
모두 R 의 직접 자식.
(경로 길이 4) (경로 길이 1)
여기까지 Light. 다음으로 왜 α(n) 인가. 이것이 Deep 의 일이다.
Disjoint set forest. n 개 원소를 서로 분리된 집합 (disjoint set) 들로 분할한 것을 partition. 각 집합을 루트가 있는 트리 (rooted tree) 로 표현. 모든 트리를 합한 forest. 우리는 n 노드짜리 forest 를 parent 배열 p : [n] → [n] 으로 표현 — p(x) = x 면 x 가 루트.
연산. MakeSet(x): 한 원소짜리 집합 생성. Find(x): x 가 속한 집합의 루트. Union(x, y): x 와 y 가 속한 집합을 합침.
Rank. 각 노드 x 에 rank r(x) ∈ ℤ_{≥0} 를 부여. 초기 r(x) = 0. Union 에서 같은 rank 의 두 루트를 합치면 새 루트의 rank 가 +1. 다른 rank 의 두 루트를 합치면 큰 rank 가 새 루트, rank 변화 없음.
Ackermann function. Wilhelm Ackermann (1928) 의 함수.
A(0, n) = n + 1
A(k+1, 0) = A(k, 1)
A(k+1, n+1) = A(k, A(k+1, n))
A(1, n) = n + 2. A(2, n) = 2n + 3. A(3, n) ≈ 2^{n+3}. A(4, n) ≈ 2^{2^{2^{...}}} (n 회 반복) — tower of 2s. A(4, 2) 는 이미 우주의 입자 수보다 큰 수.
Inverse Ackermann. α(n) = min{k : A(k, k) ≥ n}. 이 함수는 지구상의 어떤 실용적 n 에 대해서도 α(n) ≤ 4. α(n) ≥ 5 가 되려면 n ≥ A(5, 5) 인데, 이 수는 우주의 모든 입자 수 보다 비교할 수 없을 만큼 크다. 그러나 극한 에서 α(n) → ∞. 천천히, 하지만 확실히.
Sequence complexity. m 번의 연산 (Find 또는 Union) 으로 이루어진 임의의 수열의 총 시간이 O(m · α(n)) 이라 보장한다. 한 연산이 worst-case 에서 Θ(log n) 일 수 있지만, 평균 으로 α(n) (amortized).
왜 이 보조정리들이 필요한가. 우리가 §6에서 증명할 정리는 Tarjan 1975: m 연산 수열의 총 시간이 O(m · α(n)). 이 증명의 핵심은 (1) trees 의 높이 가 O(log n) 이하임 (union by rank 만으로), 그리고 (2) path compression 이 amortized 시간을 α(n) 까지 줄임. 두 부분이 보조정리 4.1 과 4.2.
보조정리 4.1 (Union by Rank: 트리 높이 보장).
Union by rank 만 (path compression 없이) 적용된 forest 에서, 어떤 시점이든 rank 가
r인 트리는 최소2^r개의 노드를 가진다.
증명. r 에 대한 귀납. 기저 r = 0: 한 노드짜리 트리, 2^0 = 1 개 노드. 만족.
귀납 단계: rank r+1 인 트리는 언제 생기는가? Union by rank 의 규칙에 따르면 — rank r 인 두 트리를 합칠 때만. 두 트리 각각 ≥ 2^r 개 노드 (귀납 가정). 합치면 ≥ 2^{r+1} 개. ∎
따름정리 4.1ᵇ (Logarithmic Tree Height).
Union by rank 만 적용된 forest 에서, 모든 트리의 높이 는
O(log n). 따라서Find한 번이O(log n).
증명. n 개 노드 forest 에서, 가장 깊은 rank 는 log₂ n. (보조정리 4.1 에 의해 rank r 트리는 ≥ 2^r 노드, 이를 n 으로 제한.) ∎
이까지가 path compression 없이 의 결과. 다음 보조정리가 path compression 의 효과를 정확히 정량화.
보조정리 4.2 (Tarjan's Potential Function).
Φ(forest) = Σ_x (rank(x) - depth(x))를 potential function 으로 정의 (여기서 depth = 루트까지의 거리, rank 는 위 정의). 한Find(x)의 실제 시간 + potential 변화 가O(α(n)).
증명 스케치. 실제 시간 = 경로 길이 = depth(x). Path compression 후 depth 가 줄어든다. Tarjan 은 노드들을 rank 의 α-블록 으로 묶고, 각 블록 안에서의 압축 횟수 가 bounded임을 보인다. 자세한 증명은 Tarjan (1975) §4 — 6 페이지에 걸친 정밀한 case analysis. ∎
이 보조정리의 진짜 내용 은 Ackermann 의 계층 을 알고리즘의 시간 분석 에 연결한 것. 노드 x 의 rank 가 어느 α-블록 에 속하는지에 따라 그 노드가 path compression 되는 횟수 가 다르다. 모든 노드와 모든 연산을 합하면 정확히 O(m · α(n)). 깊은 결과.
보조정리 4.3 (Find의 amortized 시간).
Path compression + union by rank 가 적용된 forest에서,
Find한 번의 amortized 시간은O(α(n)). 이는 worst-caseO(log n)보다 훨씬 작은 amortized 보장.
증명. 보조정리 4.2 의 potential function 에서 직접. ∎
왜 이 정리가 필요한가. 우리는 Union-Find 의 m 연산 수열의 총 시간이 O(m · α(n)) 임을 보인다. 이것이 Tarjan 1975 의 핵심 결과.
정리 4.4 (Tarjan, 1975).
MakeSet,Union,Find가 path compression + union by rank 로 구현된 Union-Find 자료구조에서,n개 원소에 대한m번의 임의 연산 수열의 총 시간 은O(m · α(n))이다.
증명. m 연산 각각의 amortized 시간이 O(α(n)) (보조정리 4.3). 총 O(m · α(n)). ∎
이 정리는 극도로 강력하다. 어떤 적대적인 연산 수열에서도 — 가장 나쁜 순서를 고른다 해도 — 총 시간이 거의 선형. 그리고 — 다음 정리가 보이듯 — 더 빠를 수 없다.
정리 4.5 (Tarjan–van Leeuwen, 1984: Lower Bound).
위 자료구조 (path compression + union by rank) 의 worst-case 총 시간은
Ω(m · α(n)). 즉 정리 4.4의 상한이 tight.
증명 스케치. 정밀하게 구성된 adversarial sequence — m 연산을 특정 순서 로 — 가 Θ(m · α(n)) 시간을 강제. 구성은 Ackermann 함수의 계층 구조를 역으로 이용. 자세한 내용은 Tarjan–van Leeuwen (1984) §3. ∎
정리 4.6 (Fredman–Saks, 1989: Cell Probe Lower Bound).
어떤 Union-Find 구현 (자료구조 무관) 도 cell probe model 에서 평균 연산당
Ω(α(n))시간 필요.
증명 개요. Fredman–Saks 1989 STOC. cell probe model — 자료구조가 메모리 셀의 읽기/쓰기 횟수 만 시간으로 계산하는 추상 모델 — 에서, Union-Find 의 하계가 정확히 α(n) 임을 보인다. 즉 어떤 영리한 자료구조 를 발명해도 α(n) 보다 빠를 수 없다. 이것이 Union-Find 의 수학적 최종 답. ∎
증명이 깨지는 가정. (1) path compression 없음 — find 시 압축 안 하면 O(log n). 빠르긴 하지만 amortized α(n) 은 아님. (2) union by rank 없음 — 트리가 깊어질 수 있어 O(n) worst-case 가능. (3) 연산이 순수히* union + find 가 아니라 split (집합을 다시 쪼개기) 등 추가* — split 을 허용하면 훨씬 어려움. Persistent UF (Conchon–Filliâtre 2007) 가 이 일반화의 한 방향.
§6 의 정리 4.4 와 4.5 가 본질적으로 복잡도 정리도 함께. 그러나 실용적 관점 의 추가 결과들을 정리.
정리 4.7 (Space Complexity).
Union-Find 의 공간 복잡도는
O(n)— parent 배열 + rank 배열.
증명. 두 배열 각각 n 개 정수. ∎
정리 4.8 (Without Path Compression, With Union by Rank).
Union by rank 만 사용하고 path compression 을 안 쓰면,
m연산의 worst-case 총 시간은Θ(m log n).
증명. 보조정리 4.1ᵇ 에 의해 트리 높이 O(log n), find 마다 O(log n). 압축 없으므로 amortization 효과 없음. ∎
정리 4.9 (With Path Compression, Without Union by Rank).
Path compression 만 사용하고 union by rank 를 안 쓰면,
m연산의 worst-case 총 시간은Θ(m log n).
증명. Tarjan (1975) §5. ∎
핵심. 두 트릭이 모두 필요하다. 한 쪽만 빼면 O(log n) 으로 떨어진다 — α(n) 의 우아함은 두 트릭의 결합 의 결과. 이것이 알고리즘 설계의 한 시.
(a) Quick-Find vs Quick-Union. Quick-Find: find 가 O(1), union 이 O(n). 각 원소가 자기 집합 ID 를 직접 저장. m 연산 worst O(mn). Quick-Union: union 빠름 (O(log n)), find 느림 (O(log n)). 본 장의 알고리즘은 Quick-Union with rank + compression.
(b) Weighted Union (= Union by Size). Rank 대신 크기 로 — 작은 트리를 큰 트리에 붙임. 결과는 거의 동일 (asymptotically). 구현이 조금 더 직관적이라 교육적으로 자주 등장.
(c) Path Halving / Path Splitting. Full path compression 대신 경로 위 두 노드씩 건너뛰기 (halving) 또는 각 노드를 조부모로 옮기기 (splitting). 분석 결과 동일하지만 재귀 없이 반복문으로 구현 가능 — 스택 오버플로 방지.
(d) Offline Union-Find / Tarjan's LCA. 모든 연산을 미리 알면 offline 으로 전체 O((m+n) · α(n)) 가능. Tarjan (1979) 이 이를 Lowest Common Ancestor 알고리즘에 응용 — Tarjan's offline LCA. 트리에서 q 개 (u, v) 쌍의 LCA 를 O((n+q) α(n)) 시간에 일괄 계산.
(e) Link-Cut Trees (Sleator–Tarjan, 1983). Union-Find 의 일반화. cut 연산 (간선 제거) 도 지원. O(log n) amortized. dynamic graph 알고리즘의 핵심 도구.
(f) Persistent Union-Find. 시간을 되돌릴 수 있는 UF. 어느 과거 시점의 상태로 질의 가능. Conchon–Filliâtre 2007. Functional programming 에서 인기.
그림 4.3 ― 변형 가계도.
Galler–Fischer (1964)
최초의 트리 표현
│
┌──────────┼──────────┐
▼ ▼ ▼
Quick-Find Quick-Union Hopcroft–Ullman (1973)
path compression
│
┌────────┼────────┐
▼ ▼ ▼
union by rank path halving / splitting
│ │
▼ ▼
Tarjan (1975) — α(n) amortized
│
┌─────────┼─────────┐
▼ ▼ ▼
Tarjan offline Sleator–Tarjan Conchon–Filliâtre
LCA (1979) Link-Cut (1983) Persistent (2007)
그림 4.4 ― 변형별 복잡도 비교.
알고리즘 union find m 연산 총
──────────────────────────────────────────────────────────────────
Quick-Find O(n) O(1) O(mn)
Quick-Union O(log n) O(log n) O(m log n)
Union by rank O(log n) O(log n) O(m log n)
Path compression only O(log n) O(log n)* O(m log n)
Rank + compression (Tarjan) O(α(n))* O(α(n))* O(m α(n)) ← 최적
Link-Cut Trees O(log n)* O(log n)* O(m log n)
──────────────────────────────────────────────────────────────────
* = amortized
그림 4.4ᵇ ― Path compression의 비용 분포.
path compression의 비용은 모든 노드에 *균등하지 않게* 분산된다.
루트 가까운 노드: 거의 0 (이미 짧은 경로)
중간 깊이 노드: O(1) ~ O(log) (가끔씩 압축됨)
깊은 노드: 가장 많이 압축됨
Tarjan의 1975 분석의 핵심: 노드를 rank의 *Ackermann 블록* 으로 나눠
각 블록에 *분담된 비용* 을 계산.
Block 0: rank 0 → 거의 압축 안 됨
Block 1: rank 1~2 → O(1) 평균
Block 2: rank 3~4 → O(1) 평균
Block k: A(k-1, 1)~A(k, 1) → 블록 폭 매우 큼, 블록 안에서 amortized O(1)
α(n) 블록의 개수. 총 비용 ≤ m × (블록 수) × O(1) = O(m α(n)).
그림 4.5 ― α(n) 값의 표.
n α(n)
─────────────────────────────
1 0
2 1
3, 4 2
5 ~ 7 3
8 ~ A(4, 1) 4 ← A(4, 1) = 2^{2^{2^{2^{16}}}} 정도. 이미 우주적 크기.
A(4, 1)+1 이상 5 ← 이 영역에 도달하려면 n 이 우주의 모든 입자보다 많아야.
결론: 실용적으로 α(n) ≤ 4. 사실상 상수. 그러나 진짜 상수는 아님 — 극한에서 ∞.
Tarjan 의 1975 JACM 논문은 11 페이지. Journal of the ACM 22권 2호. 매우 정밀한 글. 28세의 박사 학위 직후 작성. 글 톤은 교과서적. 정의 → 보조정리 → 정리 → 예제 → 일반화.
§1 Introduction 에서 Tarjan 은 Galler–Fischer (1964), Hopcroft–Ullman (1973) 의 결과를 정리하고, 질문 을 명시 — "path compression + union by rank 의 정확한 amortized complexity 는 얼마인가?". 이 질문이 기존 추측 — 선형 시간 — 과 다를 수 있음을 예고.
§2 The Algorithm 에서 두 페이지에 걸쳐 자료구조와 두 연산을 정의. 의사코드는 본 장의 §3 과 거의 동일.
§3 가 분석의 핵심. Tarjan 은 level function 을 도입 — 각 노드의 rank 를 Ackermann 의 계층 에 따라 블록 으로 묶음. level(x) 는 x 의 rank 가 어느 Ackermann 블록 에 속하는지. levels 의 개수가 α(n). 그 다음 각 노드가 path compression 되는 횟수 를 level 별로 계산.
§4 가 증명의 끝. 모든 노드 × 모든 연산의 총 work 가 Σ levels × (압축 횟수) ≤ m · α(n). 그 분량은 6 페이지에 걸친 careful case analysis.
§5 에 하계의 부분 결과 — adversarial sequence 의 구성. fully tight 한 하계는 1984년 Tarjan–van Leeuwen 까지 기다림. 그 1984 논문은 36 페이지짜리. adversary 의 정밀한 구성과 모든 case의 검증. 알고리즘 분석의 한 정점.
이 두 논문 (1975, 1984) 의 결합 이 Union-Find 의 완성된 이론. 그 뒤로 — 1989년 Fredman–Saks 의 cell probe lower bound, 2007년 Patrascu–Demaine 의 더 정밀한 분석 — 이론은 계속 다듬어지지만, 핵심 은 그대로.
Robert Endre Tarjan (1948–현재). 캘리포니아 Pomona 출생. 부친은 의사 (헝가리 이민자), 모친은 미국인 — Tarjan 의 헝가리어 성. Caltech 학사 (수학, 1969), Stanford 박사 (CS, 1972). Stanford 박사 지도교수는 Robert Floyd (Algol 의 Floyd) 와 Donald Knuth (TAOCP 의 Knuth). 24세에 박사. 1974~1980 UC Berkeley, 1980~1985 Bell Labs, 1985~ Princeton University. 1986년 Turing Award — 데이터 구조와 알고리즘 설계의 근본적 공헌 으로. John Hopcroft 와 공동 수상.
Tarjan 의 방법론 은 amortized analysis — 단일 연산이 아닌 연산 수열 의 평균. 이 방법론은 그가 1985년 Splay Trees 논문 (Sleator 와 공동) 에서 명시적으로 체계화. 그 전에도 그가 암묵적으로 1975 Union-Find 분석에서 썼던 것. 이후 Fibonacci heaps (1987), self-adjusting binary search trees, dynamic trees — 모두 amortized 분석의 고급 사례.
John Hopcroft (1939–현재). 미국 Washington 출생. Stanford 박사 (1964). Cornell 교수 (1967~). 1986년 Tarjan 과 공동 Turing Award. 알고리즘 교과서 Automata Theory (1969, Ullman 공저) 의 저자. Hopcroft–Karp 이분 매칭 (1973). 1992~2008년 Cornell CS 학과장.
Jan van Leeuwen (1946–현재). 네덜란드 출생. Utrecht University 박사 (1972). Utrecht 교수 (1977~). Handbook of Theoretical Computer Science (1990) 편집장. 1984년 Tarjan 과 공동 작업으로 Union-Find 의 tight lower bound.
Wilhelm Ackermann (1896–1962). 독일 수학자, 논리학자. Hilbert 의 학생. 1928년 primitive recursive 가 아닌 계산 가능 함수 의 사례로 Ackermann 함수 도입 — primitive recursive 가 모든 계산 가능 함수 라는 잘못된 추측 의 반례. 그가 1928년에 알고리즘 시간 분석 의 한 자리에 자기 이름이 새겨질 줄은 전혀 몰랐을 것. 50년 뒤 Tarjan 이 그 자리를 만든다.
Expert 4번 — IoT — 의 풀이는 Union-Find 의 직접 사용. 풀이의 골격은 매우 단순하다.
1. 디바이스 ID 를 정수로 — [1, N]. 2. MakeSet 으로 초기화 — 각 디바이스가 자기 집합. 3. 연결 사건마다 Union — union(a, b) 가 발생. 4. 질의마다 Find + 비교 — find(a) == find(b) 로 같은 네트워크인지 판정. 5. 연결 컴포넌트 수 추적 — 매 union 이 실제로 두 집합을 합치면 (find(a) ≠ find(b)) 컴포넌트 수가 -1.
이 5단계 풀이의 시간 복잡도 가 — 정리 4.4 에 의해 — 총 O(m · α(n)). m 이 백만, n 이 십만이라도 사실상 선형. 이것이 Expert 4번이 대규모 IoT 데이터셋 에서 작동하는 이유.
영리함의 추가 한 켜. 풀이는 오프라인 변형 을 한 번 더 적용 — 모든 연산을 미리 정렬 한 뒤 Tarjan's offline LCA (Tarjan 1979) 처럼 시간 역행 으로 처리. 이 트릭이 시간복잡도 자체를 줄이지는 않지만 상수 인자 를 크게 줄인다.
다른 장과의 연결. 4장의 Union-Find 는 12장 Kruskal MST 의 사이클 검사 도구로 그대로 사용. 3장 (Greedy Exchange) 의 graphic matroid 그리디 = Kruskal = Union-Find 기반. 한 자료구조가 책의 여러 장 을 가로지른다.
왜 이 장이 책 전체에서 특별한가. 이 장은 자료구조 그 자체 가 주인공인 유일한 장 이다. 다른 장들은 모두 문제를 푸는 알고리즘 이 주인공. 4장은 알고리즘이 사용하는 도구 가 주인공. Union-Find 는 12장 Kruskal MST, 3장 graphic matroid 의 사이클 검사, 6장의 BFS layering 의 offline 처리, 그리고 책 바깥의 동적 연결성, 오프라인 LCA, 동적 트리 등 — 헤아릴 수 없는 자리에 내장 된다. 그 모든 자리에서 α(n) 의 우아함 이 조용히 작동한다.
역사적 평가. 1975년 Tarjan 의 결과 Efficiency of a Good But Not Linear Set Union Algorithm 은 컴퓨터 과학사 의 한 페이지를 차지한다. 그 not linear 라는 단어는 — 그 시점에 놀라움 이었지만 — 지금 보면 알고리즘의 본질에 대한 깊은 진실 을 담고 있다. 어떤 자료구조도 어떤 영리함도 그 한계를 넘을 수 없다 라는 수학적 운명. 그러나 그 운명은 우주적 크기 의 입력에서만 느낄 수 있는 운명 — 실용에서는 완전히 무시 가능. 이론의 정밀함 과 실용의 단순함 이 한 자리에서 만나는 희귀한 결과.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/04-iot.html
[Tarjan1975]
[HopcroftUllman1973]
[GallerFischer1964]
[TarjanVanLeeuwen1984]
[Tarjan1979]
[Fredman_Saks1989]
[CLRS2022]
전체 항목은 bibliography.md.
가장 가까운 곳으로 — 일단 가고, 나중에 다듬는다.
"Although the heuristic algorithms studied are simple, none of them is known to produce a tour of length less than θ log n times the optimum in the worst case." — Rosenkrantz, Stearns, Lewis II, An Analysis of Several Heuristics for the Traveling Salesman Problem (1977), p. 563.
| 항목 | 값 |
|---|---|
| Expert № | 05 |
| 주연 | Nearest Neighbor (Rosenkrantz–Stearns–Lewis 분석, 1977) · Or-opt (Or, 1976) |
| 조연 | Christofides 3/2-approximation, Held–Karp lower bound, Lin–Kernighan (Ch.2), Karp's patching |
| 원논문 | Rosenkrantz–Stearns–Lewis (1977). "An Analysis of Several Heuristics for the TSP." SIAM J. Comp. 6: 563–581. |
| 대표 교과서 | CLRS Ch. 35.2, Applegate–Bixby–Chvátal–Cook (2006) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
도시의 새벽. 콜택시 한 대가 첫 호출을 받는다. 첫 손님을 태우러 가고, 내려 주고, 다음 호출을 받고, 다시 어딘가로 간다. 운전사가 매번 하는 결정은 단순하다 — 어느 손님을 다음으로 받을까. 콜이 동시에 여러 개 들어오는 순간이 있다. 그 중 어느 것을 먼저 잡을지, 그리고 그 다음에 어느 것 을. 매 결정이 전체 운행 비용 을 결정한다. 그리고 — 한 가지 더 어려운 점 — 어떤 콜은 시간 창 (time window) 이 있다. 몇 시까지 도착해야 하는 손님.
이 문제는 외판원 문제 (TSP) 의 친척이다. 모든 호출 지점을 최단 거리로 한 번씩 방문 하는 순회. 그러나 변형 이 들어있다 — 시작 위치 가 정해져 있고, 목적지가 아닌 출발지로 돌아갈 필요는 없을 수도, 시간 창 제약이 추가될 수도. 일반화하면 Vehicle Routing Problem (VRP) 의 한 사례. 14장에서 VRP 의 일반 이론을 본다. 5장은 그 원형 이자 가장 단순한 경우 — TSP의 휴리스틱.
TSP 는 NP-난해다. 1972년 Karp의 Reducibility Among Combinatorial Problems 의 21 NP-완전 문제 의 한 자리. 다항 시간 정확 알고리즘 은 — P = NP 가 아니라면 — 존재하지 않는다. 그러면 무엇을 하는가? 두 길이 있다. (1) 작은 사례 는 Bitmask DP (11장의 Held–Karp 1962) 로 정확히 푼다. n ≤ 20 정도. (2) 큰 사례 는 휴리스틱 으로 근사 한다. 본 장의 주제.
가장 단순한 휴리스틱은 Nearest Neighbor (NN). 현재 위치에서 가장 가까운 미방문 도시로 간다. 한 번에 한 결정, 그리디. 1832년 Voigt 의 독일 외판원 안내서 (Der Handlungsreisende) 에서도 이미 등장하는 직관적 전략. 그러나 — 그리고 이것이 핵심이다 — 얼마나 좋은가 의 답이 1977년에야 정확히 알려졌다. Rosenkrantz–Stearns–Lewis (RSL) 의 1977 SIAM Journal on Computing 논문. NN 의 worst-case 비율은 정확히 O(log n) — 약간의 가공으로 Θ(log n). 직관과 다르게 매우 나쁘다. 그러나 평균적으로 는 놀랍게 좋다.
NN 으로 잡은 초기 순회를 향상 시키는 표준 도구가 Or-opt. 1976년 Ilhan Or 의 노스웨스턴 박사학위 논문에서 처음 등장. 연속한 1~3개 도시 부분 순회를 떼어 다른 자리에 끼워 넣기. 2-opt (2장 참조) 와 다른 점은 — swap이 아니라 이동. 향상 가능성이 더 크고, 한 번의 향상 평가가 O(1). Lin–Kernighan 만큼 강력하지는 않지만 훨씬 단순하고 빠르다.
Expert 5번 — 택시 — 의 풀이는 NN 초기 해 + Or-opt 향상 + 시간 창 처리 의 세 단계. 이 장은 그 세 단계의 이론적 근거 — 왜 NN 이 log n 보장인가, 왜 Or-opt 가 옳은가, 얼마나 빠른가 — 를 끝까지 본다.
이 장과 2장 (Local Search) 의 관계는 흥미롭다. 2장은 일반 이론. 5장은 TSP 라는 구체적 문제에 대한 정밀한 분석. Lin–Kernighan (2장) 은 TSP 의 최강 휴리스틱이지만 구현이 복잡. NN + Or-opt 는 덜 강력하지만 더 단순 — 한 시간 정도면 누구나 구현. Expert 5번이 NN + Or-opt 를 선택한 이유는 시간 창 같은 추가 제약 을 통합하기 쉽기 때문. 휴리스틱의 유연성 이 최강 보다 더 중요한 자리.
또 한 가지 매력적인 점 — TSP 휴리스틱의 worst-case 분석 은 근사 알고리즘 이론 의 출발점 이다. 1977 RSL 논문이 이 분야의 첫 정밀 분석. 그 뒤로 PTAS (Polynomial-Time Approximation Scheme), APX-completeness, hardness of approximation 같은 분야가 모두 이 한 논문의 후손. 작은 알고리즘 — NN — 의 분석 하나가 컴퓨터 과학의 한 부분 분야 를 열었다.
1977년 알바니. 뉴욕 주립대학교 (SUNY at Albany) 의 Daniel Rosenkrantz, Richard E. Stearns, Philip M. Lewis II — 세 컴퓨터 과학자가 SIAM Journal on Computing 6권 3호에 19 페이지짜리 논문 An Analysis of Several Heuristics for the Traveling Salesman Problem 을 발표한다. 이 세 사람은 모두 automata theory 의 거장. Stearns 는 1993년 Hartmanis 와 함께 Turing Award 수상 (computational complexity theory 의 기초 — 1965 Hartmanis–Stearns 정리). 그가 TSP 의 휴리스틱 분석에 합류한 것은 1970년대 후반의 근사 알고리즘 분야의 부상과 맞물려 있다.
이 1977 논문이 근사 알고리즘 이론의 한 시작점 이다. 그전까지 TSP 휴리스틱은 경험적으로 좋다 정도. RSL 1977 이 처음으로 모든 휴리스틱에 대해 worst-case 비율을 정확히 계산. NN: Θ(log n). Greedy insertion (가장 가까운 도시를 순회 어딘가에 삽입): 같은 Θ(log n). Nearest insertion: 2. Cheapest insertion: 2. Strip 방식: Θ(√n). 모든 휴리스틱의 비율 표 가 19 페이지에 정리되어 있다.
증명의 맛 을 본다. NN 이 최대 Θ(log n) 배까지 나쁠 수 있다 는 사실은 — 반례 구성 + 상계 증명 의 두 축. 반례 구성 (§6) 은 교묘한 점 배치 — n 개 점을 log n 개의 양파 껍질 로 쌓아, NN 이 각 껍질을 차례로 도는 모습. OPT 는 단 한 번 모든 껍질을 가로지른다. 두 경로의 비율이 정확히 Θ(log n).
이 반례 구성은 직관적으로 매혹적이다. NN 은 그리디 다 — 한 번에 한 결정. 그러나 그리디의 시야 는 현재 위치의 이웃 뿐. 양파 구성은 그 좁은 시야 를 극단적으로 이용 — 가까운 이웃들을 작은 껍질 안에 빽빽이 배치해, NN 이 그 껍질을 완전히 도는 동안 다른 껍질을 전혀 보지 못하게 만든다. 모든 껍질을 다 돈 뒤에야 마지막 껍질에서 다른 껍질로 점프 — 그 점프가 매우 비싸다. OPT 는 처음부터 모든 껍질을 한 직선으로 가로질러 모든 점프를 하나로 합친다. 비율 정확히 Θ(log n).
같은 해 1976년, 캐나다 워털루의 Nicos Christofides — Imperial College London 의 운영연구학자 — 가 자신의 Carnegie Mellon 방문 중에 쓴 기술 보고서에서 3/2-approximation 을 보인다. metric TSP (삼각 부등식 만족) 한정. 알고리즘은 (1) MST 만들기 (12장 참조), (2) 홀수 차수 정점의 최소 가중치 perfect matching, (3) MST + matching 의 오일러 회로 가 단축된 Hamiltonian 순회. 결과 = OPT 의 최대 3/2 배. 이 결과는 44년간 깨지지 않다가 2021년 Karlin–Klein–Oveis Gharan 이 (3/2 - ε) 로 처음 개선 — Anna Karlin 의 UW Seattle 그룹.
NN + Or-opt 가 왜 휴리스틱의 표준 조합이 되었나. 단순함 + 빠름 + 향상의 명확함. NN 은 O(n²) (각 단계 가장 가까운 미방문 도시 찾기 O(n), n 단계). Or-opt 의 한 향상 단계도 O(n²). 결과는 Lin–Kernighan 만큼은 아니지만 — 작은 부분 문제 (n ≤ 1000) 에서 충분히 좋다. 그리고 — 시간 창 같은 추가 제약 을 상대적으로 쉽게 통합할 수 있다.
NN 의 의사코드는 매우 짧다.
algorithm NearestNeighbor(cities, start):
visited = {start}
tour = [start]
current = start
while |visited| < n:
next = argmin_{c in cities - visited} dist(current, c)
tour.append(next)
visited.add(next)
current = next
tour.append(start) # 돌아오기
return tour
O(n²) 시간 (각 단계 O(n) 의 가장 가까운 미방문 도시 탐색, n 단계).
Or-opt 의 의사코드도 짧다.
algorithm OrOpt(tour T):
improved = True
while improved:
improved = False
for length in [1, 2, 3]: # 떼어낼 연속 부분 길이
for i in range(n): # 떼어낼 시작 위치
segment = T[i : i+length]
T_without = T - segment # 떼어낸 후 tour
for j in range(n - length): # 끼울 위치
new_T = T_without[:j] + segment + T_without[j:]
if cost(new_T) < cost(T):
T = new_T
improved = True
break
if improved: break
if improved: break
return T
전체 시간 O(n² × 향상 횟수). 한 향상 평가 O(1) (네 간선의 비용 차).
작은 예시 — 5 도시 정사각형 + 중심 (A, B, C, D 꼭짓점, E 중심), start = A.
배치: B───────C
│ E │
│ │
A───────D
거리: AB=1, BC=1, CD=1, DA=1, AC=√2, BD=√2, AE=BE=CE=DE=0.5√2.
NN from A:
A → 가장 가까운 미방문 = E (0.5√2)
E → 가장 가까운 = B 또는 D (둘 다 0.5√2, B 선택)
B → C 또는 A. A는 방문됨. C (1).
C → D (1).
D → A (1). 종료.
tour: A-E-B-C-D-A. 비용 = 0.5√2 + 0.5√2 + 1 + 1 + 1 = √2 + 3 ≈ 4.41.
OPT:
A-B-C-D-A 의 둘레 = 4 → E 를 어딘가에 끼움.
A-E-B-C-D-A? 비용 위와 같음 ≈ 4.41.
A-B-E-C-D-A? = 1 + 0.5√2 + 0.5√2 + 1 + 1 = 3 + √2 ≈ 4.41.
여기서는 NN = OPT (이 작은 사례). 일반적으론 OPT 가 더 좋다.
그림 5.1 ― NN 의 worst-case 반례 (RSL 1977 §3).
3 단계 양파 (log n = 3):
x10 — x9 ─────── x8 ← 가장 바깥
│ │
x11 — x4 ── x3 — x7 ← 중간
│ │ │ │
x12—x5 ─ x6 ──── x2
│ │
x13—x1───x0──────x15 ← 가장 안쪽 (start at x0)
NN from x0: x1, x2, ... 같은 껍질 다 본 후 다음 껍질로.
각 껍질 둘레 = (대략) 2 × 껍질 반경.
k 껍질, 반경 비율 2^k.
총 NN 비용 ≈ 2 × (2^0 + 2^1 + ... + 2^k) ≈ 2^{k+1}.
OPT: 단 한 번 모든 껍질 가로지르기 ≈ 2^k.
비율: 2 — 한 양파. log n 양파 쌓으면 log n.
그림 5.2 ― Or-opt 의 한 move.
before:
A — B — C — D — E — F — A (cyclic)
세그먼트 [C, D, E] 를 떼어 [A, B] 와 [F, A] 사이에서 다른 자리로:
after (예: [C,D,E] 를 [A, B] 앞으로):
C — D — E — A — B — F — A ← 비용 평가: 빠지는 간선 (B,C),(E,F),(F,A) → (A,C),(E,F),(F,A) 등.
잠깐, 좀 더 명확한 예:
tour: 1 ─ 2 ─ 3 ─ 4 ─ 5 ─ 6 ─ 1
└ segment [3] ┘
move [3] from between (2,4) to between (5,6):
tour: 1 ─ 2 ─ 4 ─ 5 ─ 3 ─ 6 ─ 1
비용 변화: -d(2,3) -d(3,4) -d(5,6) +d(2,4) +d(5,3) +d(3,6).
네 간선 + 두 간선 — 합 여섯 간선 비교. O(1).
TSP. 정점 V = {v_1, …, v_n}, 가중치 d : V × V → ℝ_{≥0}. Hamiltonian cycle (모든 정점을 정확히 한 번 방문하는 사이클) 의 최소 가중치. Metric TSP — d 가 삼각 부등식 만족 (d(u, w) ≤ d(u, v) + d(v, w)) 인 경우. Euclidean TSP — d 가 평면 유클리드 거리인 metric TSP의 특수 경우.
Tour. Hamiltonian cycle 을 순환 으로 표기. T = (v_{π(1)}, v_{π(2)}, …, v_{π(n)}, v_{π(1)}), π 는 [n] 의 순열. 비용 c(T) = Σ d(v_{π(i)}, v_{π(i+1)}) (index modulo n).
OPT. 모든 tour 중 최소 비용 OPT = min_T c(T).
Approximation Ratio. 휴리스틱 H 의 worst-case 근사 비율 은 ρ_H = sup (c(H(input)) / OPT(input)). 모든 입력 위의 sup.
왜 이 보조정리들이 필요한가. 우리는 §6에서 NN 의 worst-case 비율이 Θ(log n) 을 증명한다. 이 증명은 두 부분 — 상계 (NN 이 그보다 더 나쁠 수 없음) + 하계 (반례 사례에서 정확히 그만큼 나쁨). 두 부분이 보조정리 5.1, 5.2.
보조정리 5.1 (NN 상계 핵심 부등식, RSL 1977 §2).
Metric TSP 의 NN tour
T_NN의 비용은c(T_NN) ≤ (⌈log n⌉ + 1) / 2 · OPT.
증명. RSL 1977 §2 의 부분합 인자 사용. 각 NN 단계의 기여 를 OPT 의 부분합 으로 묶음. 자세한 부등식 사슬은 RSL §2 (5 페이지). 핵심 단계: NN의 각 도시 방문 시 가장 가까운 이웃 거리 를 OPT 의 해당 도시의 이웃 간선 길이 와 짝지움. ∎
보조정리 5.2 (NN 하계 반례 구성, RSL 1977 §3).
모든
n에 대해, NN 의 비용이 OPT 의Ω(log n)배인 metric TSP 사례가 존재.
증명. §3 의 양파 (onion) 구성. k = log₂ n 개 동심원 껍질. 각 껍질 위에 2^i 개 점. 거리 = 평면 유클리드 (metric, 사실 metric 만족하는 임의 거리). 반례의 NN 경로 = 각 껍질을 전부 도는 합 Σ 2 · 2^i × (껍질 반경) ≈ Θ(log n × OPT). OPT = 직선으로 한 번 가로지르기 ≈ Θ(껍질 반경). 비율 정확히 Θ(log n). ∎
이 두 보조정리를 합쳐 §6 의 정리.
보조정리 5.3 (Or-opt Move Locality).
Or-opt 의 한 move 는 tour 의 4 간선만 변경. 비용 차는
O(1)시간에 계산 가능.
증명. segment [a_1, …, a_k] 를 위치 i (사이 (p, q)) 에서 위치 j (사이 (r, s)) 로 옮긴다. 빠지는 간선 = (p, a_1), (a_k, q), (r, s). 더해지는 간선 = (p, q), (r, a_1), (a_k, s). 정확히 세 개 빠지고 세 개 더해진다 — 6 개 간선의 비용 만 비교. ∎
보조정리 5.4 (MST Lower Bound).
어떤 metric TSP 의 OPT 는 해당 그래프의 MST 비용 이상. 즉
c(MST) ≤ OPT.
증명. OPT tour 의 임의의 한 간선을 지우면 spanning path (n 정점, n-1 간선). spanning path 는 spanning tree 의 한 사례. 그 비용은 MST 비용 이상 (MST 가 최소 spanning tree 이므로). 따라서 OPT - 가장 긴 간선 ≥ MST, 그래서 OPT ≥ MST + 가장 짧은 간선 ≥ MST. ∎
이 보조정리가 Christofides 3/2 의 증명의 첫 단계. MST 를 근사 OPT 의 기준선 으로 쓴다. 12장 (MST) 에서 다시 만난다.
보조정리 5.5 (Patching Lemma for ATSP, Karp 1979).
Assignment problem 의 cycle cover 가
k개 cycle 로 이루어져 있다면, 이를 Hamiltonian cycle 로 patch 하는 데 추가 비용O(n / k · log n)평균 (random instance).
증명 개요. Karp (1979). cycle 들을 적절히 짝지어 두 cycle 의 한 간선쌍 을 교환 (2-opt 유사). 추가 비용 분석. Nonsymmetric TSP 의 첫 평균 분석. ∎
왜 이 정리가 필요한가. NN 의 근사 비율의 정확한 답 을 본다. 이것이 RSL 1977 의 가장 유명한 결과.
정리 5.4 (Rosenkrantz–Stearns–Lewis, 1977).
Metric TSP 에서 NN heuristic 의 worst-case 근사 비율은
Θ(log n).
증명. 보조정리 5.1 (상계) 과 보조정리 5.2 (하계 반례) 의 결합. 두 결과가 정확히 일치 하므로 Θ. ∎
증명이 깨지는 가정. Metric 가정 이 깨지면 (삼각 부등식 미성립) — NN 은 임의로 나쁠 수 있다. 일반 TSP 는 어떤 다항 시간 근사 비율 알고리즘도 존재하지 않음 (Sahni–Gonzalez 1976, P ≠ NP 가정). Metric TSP 에서는 정리 5.4 의 Θ(log n) 이 유효.
정리 5.5 (Christofides 1976: 3/2-approximation).
Metric TSP 에서 Christofides 알고리즘 의 worst-case 근사 비율은 최대 3/2. 즉 결과 tour 의 비용 ≤ 3/2 · OPT.
증명 스케치. (1) MST 의 비용 ≤ OPT (OPT 의 어떤 간선 하나 빼도 spanning tree). (2) MST 의 홀수 차수 정점 집합 O 의 minimum weight perfect matching M 의 비용 ≤ OPT/2 (OPT 를 두 개의 perfect matching 으로 쪼갤 수 있고, 둘 중 작은 것 ≤ OPT/2). (3) MST + M = Eulerian graph (모든 정점 차수 짝수). Euler 회로 = 길이 ≤ MST + M ≤ OPT + OPT/2 = 3/2 · OPT. Shortcut 으로 Hamiltonian 만들기 — 삼각 부등식 덕분에 길이가 늘지 않음. ∎
정리 5.6 (Karlin–Klein–Oveis Gharan, 2021).
Metric TSP 의 다항 시간 근사 비율은
3/2 - ε로 개선 가능 (매우 작은ε > 0).
증명 개요. Half-integral LP relaxation 의 근사적 sparsification 을 통한 정밀한 분석. STOC 2021. 44년간 깨지지 않았던 3/2의 첫 개선. ∎
정리 5.7 (NN Time Complexity).
NN 의 시간 복잡도는
O(n²).
증명. n 번의 도시 선택. 각 선택에서 현재 위치에서 가장 가까운 미방문 도시 를 찾기 위해 O(n) 스캔. 총 O(n²). ∎
k-d tree 같은 공간 자료구조 를 쓰면 평균 O(n log n) 가능 (각 nearest 검색 O(log n) 평균). worst-case 는 여전히 O(n²).
정리 5.8 (Or-opt Time Complexity).
Or-opt 의 한 향상 패스 는
O(n²)(segment 길이 1~3 × 시작 위치 n × 끼울 위치 n / 3 =O(n²)). 전체 향상 횟수는 문제 의존 적이지만 실용에서O(n)정도 (Lin 1965 의 관찰).
증명. 각 패스 = 3 길이 × n 시작 × n 끼움 = 3n². 향상 횟수는 empirical. ∎
정리 5.9 (NN + Or-opt 합산).
전체 NN + Or-opt 풀이는
O(n³)worst-case (이론),O(n² log n)평균 (실용).
증명. NN O(n²) + Or-opt O(n²) × O(n) = O(n³). ∎
Held–Karp lower bound. 정확한 OPT 를 모르는 상황에서 NN + Or-opt 의 결과 가 얼마나 OPT 에 가까운가 를 알 수 없다. Held–Karp lower bound (1971) 가 그 답에 가까운 추정 을 제공한다. Lagrangian relaxation 으로 1-tree 의 비용을 계산. 실용적으로 OPT 와 1% 이내. NN+Or-opt 의 결과가 Held–Karp lower bound 의 1.1배 이내 면 충분히 좋다 고 판정. 이 평가가 실제 풀이의 종료 조건.
왜 Held–Karp 의 1-tree 가 OPT 의 좋은 lower bound 인가. 1-tree = 정점 v_1 을 제외한 나머지 n-1 정점의 spanning tree + v_1 의 두 개 간선 (v_1 이 트리의 leaf 두 자리 차지). 어떤 TSP tour 도 1-tree 다 (v_1 양쪽 간선 + 나머지 path). 따라서 minimum 1-tree ≤ OPT. 게다가 Lagrangian dual 로 vertex potential 을 도입해 1-tree 를 더 tight 하게 만들면 — 실용에서 OPT 의 99% 이상에 가깝다. 이것이 현대 TSP solver (Concorde) 의 lower bound 표준.
Or-opt 의 종료 보장. Or-opt 가 반드시 종료 하는가? 보조정리 2.1 (Strict Descent) 의 응용. 엄격 감소 향상 만 받아들이면 — 비용이 유한 으로 이산화되어 있는 한 (정수 또는 작은 단위 실수) — 유한 단계에 종료. 실수 비용 의 경우 향상 임계값 ε > 0 도입.
(a) Greedy Edge Insertion. 매 단계 가장 짧은 사용 가능한 간선 을 추가. Worst-case Θ(log n), NN 과 같은 비율.
(b) Nearest Insertion. 현재 partial tour 에 가장 가까운 도시를 가장 적합한 자리에 삽입. Worst-case 2. NN 보다 나쁘지 않은 보장이지만 평균적으로 비슷.
(c) Cheapest Insertion. 가장 적은 비용 증가 의 도시를 삽입. Worst-case 2.
(d) Christofides. 3/2-approximation (정리 5.5). MST + matching + Euler. Metric TSP 한정.
(e) Lin–Kernighan. 2장의 그것. 실용 최강 휴리스틱. NN+Or-opt 보다 더 좋지만 더 복잡.
(f) Held–Karp DP. 11장의 Bitmask DP. 정확한 OPT, O(n² · 2^n). n ≤ 20 까지.
(g) Karp's patching (1979). Nonsymmetric TSP 한정. Assignment relaxation 으로 cycle cover 를 얻고, cycle 들을 짝지어 연결. 평균 1 + o(1) 근사 (random instance).
그림 5.3 ― 휴리스틱별 근사 비율 비교.
알고리즘 worst-case ratio 실용 (랜덤 사례)
──────────────────────────────────────────────────────────────────
Nearest Neighbor (NN) Θ(log n) ~25% 위 OPT
Greedy Edge Θ(log n) ~20% 위
Nearest Insertion 2 ~20% 위
Cheapest Insertion 2 ~15% 위
Christofides (metric only) 3/2 ~10% 위
2-opt (NN + 2-opt) no fixed ratio ~5% 위
Or-opt (NN + Or-opt) same ~5% 위
Lin–Kernighan (Ch.2) same ~1-2% 위
Held–Karp DP (정확) 1 = OPT (n ≤ 20)
──────────────────────────────────────────────────────────────────
그림 5.4 ― TSP 휴리스틱 가계도.
1832 Voigt's manual
(직관적 NN)
│
┌─────────────┼─────────────┐
▼ ▼ ▼
Construction Improvement Exact
Heuristics Heuristics Algorithms
│ │ │
┌───────────┼─────┐ ┌───┴───┐ ┌────┴────┐
NN NI CI Greedy 2-opt Or-opt Held-Karp Cutting-plane
(RSL 1977) (Lin) (Or 1976) (1962) (Dantzig 1954)
│
▼
Lin-Kernighan
(1973)
│
▼
Christofides
(1976)
│
▼
Karlin-Klein-OG
(2021)
3/2 - ε
RSL 1977 SIAM J. Comp. 6:3 의 19 페이지. Daniel J. Rosenkrantz, Richard E. Stearns, Philip M. Lewis II. 세 저자 모두 SUNY at Albany. 논문의 기여 는 9 개의 TSP 휴리스틱을 동시에 분석 한 것. 각 알고리즘의 worst-case 비율 을 정확히 계산.
§1 Introduction 에서 TSP 의 NP-난해성 (당시는 Karp 1972 직후) 을 인용하고, 근사 알고리즘의 필요성 을 주장. 이 주장이 근사 알고리즘 분야의 출발선 의 한 자리.
§2 NN Upper Bound. 보조정리 5.1 의 증명. 부분합 인자 의 정밀한 사용. 5 페이지에 걸친 부등식 사슬.
§3 NN Lower Bound. 보조정리 5.2 의 양파 구성. 3 페이지. 정확히 Θ(log n) 의 반례.
§4~§7 Other Heuristics. Greedy Edge, Nearest Insertion, Cheapest Insertion, Farthest Insertion 등의 분석. 각각 worst-case 비율의 정확한 계산.
§8 Conclusions. 모든 결과의 비교 표. 어떤 휴리스틱이 어떤 사례에서 좋은가 의 권고. 이 표가 — 40년이 지난 지금도 — 알고리즘 교과서의 표준 참조.
Or 의 1976 박사학위 논문은 Northwestern University Industrial Engineering 학과. 지도교수 Mark Daskin. 논문의 공식 제목 은 Traveling Salesman-Type Combinatorial Problems and Their Relation to the Logistics of Regional Blood Banking — 지역 혈액은행의 물류 라는 실제 응용. 박사학위 논문 안에서 Or-opt 가 등장. 학술지 발표는 안 됨 — 학위논문 으로만. 그러나 후속 연구자들이 Or-opt 라 이름붙여 표준화.
Daniel Rosenkrantz (1942–현재). NYU 박사. SUNY Albany 교수. 이론 컴퓨터 과학의 거장. SIAM J. Comp. 편집장 역임.
Richard E. Stearns (1936–현재). Princeton 박사 (1961). General Electric Research 연구원, 1979년부터 SUNY Albany. 1965년 Hartmanis–Stearns 정리로 computational complexity 의 출발선을 그음. 1993년 Hartmanis 와 공동 Turing Award.
Philip M. Lewis II (1931–2008). Cornell 박사. GE Research 와 SUNY Albany. 형식 언어 이론 의 거장.
세 사람 모두 automata theory 의 70년대 거장. 그들이 TSP 휴리스틱 분석에 합류한 것은 근사 알고리즘 분야 가 형식적 이론 으로 자리잡는 시점과 일치. 1972년 Karp 의 NP-완전성 → 1974년 Sahni–Gonzalez 의 TSP 근사 불가능성 → 1977년 RSL 의 metric TSP 휴리스틱의 정확한 분석. 이 흐름이 1980년대 근사 알고리즘 이론 의 정착으로 이어진다.
Nicos Christofides (1937–2019). 키프로스 출생. Imperial College London 교수. 1976년 CMU 방문 중 3/2-approximation 의 기술 보고서. 학술지 게재는 없음 — 단지 CMU 의 Management Sciences Research Report. 그러나 이 결과는 즉시 고전 으로 인정.
Anna Karlin, Nathan Klein, Shayan Oveis Gharan (2021). University of Washington Seattle 의 probabilistic algorithms 그룹. 2021년 STOC 에서 3/2 - ε 의 첫 개선. Klein 은 박사과정 학생. 44년의 침묵을 깬 결과. 컴퓨터 과학사의 한 이벤트.
Expert 5번 — 택시 — 의 풀이는 다음과 같다.
1. 호출을 시간 순으로 정렬. 시간 창 제약을 우선 처리. 2. NN 으로 초기 배차 순서 결정. 매 콜에서 현재 택시 위치에서 가장 가까운 다음 콜 선택. 3. Or-opt 으로 순서 개선. 시간 창 위반 안 하는 한도에서 segment 이동. 4. 시간 창 검증. 모든 콜이 시간 창 안에 처리되는지 확인. 위반 시 벌점 함수 로 cost 에 반영. 5. 반복. NN 초기 해를 다른 시작 콜 에서 다시 만들어 보고 (random restart, 2장 참조) 최선 선택.
이 풀이의 시간 복잡도 는 — 정리 5.9 에 의해 — O(n²) ~ O(n³). 실용에서 n = 1000 정도까지 충분. n 이 더 크면 — 시간 창에 의한 자연스러운 분할 로 작은 서브 문제 들로 나누어 풀이.
2장 (Local Search) 와의 차이. Or-opt 도 로컬 서치 의 일종 — 이웃 = "한 segment 이동 후 tour". 그러나 문제 구조 (TSP) 가 충분히 연구되어 있어 — 근사 비율의 보장 이 수학적으로 정확. 2장의 일반 Local Search 는 국소 최적성 만 보장. 5장의 NN+Or-opt 는 log n 근사 + 실용에서 5% 이내 — 더 정량적인 보장.
현대 응용 — Uber, Lyft, Kakao T. 5장의 알고리즘이 현대 차량 호출 서비스 에 직접 응용된다. Uber Pool 이나 Lyft Line 같은 합승 기능은 동적 TSP — 매 순간 새 호출이 들어오고, 기존 경로를 재계산 해야 함. Or-opt 의 지역적 향상 이 이 재계산 의 핵심. NN 은 초기 매칭 (현재 어느 차에 어느 호출을 할당할지) 에서. Lin–Kernighan 은 오프라인 일괄 최적화 (매일 새벽 다음 날 경로 사전 계산) 에서. 한 회사 안에 세 종류의 휴리스틱이 협주 한다.
역사의 그림자 — 1832년 Voigt's manual. TSP 라는 이름과 형식적 정식화는 1930년대 (Karl Menger, 1930 Vienna 수학 회의) 부터지만, 문제 자체 는 훨씬 오래되었다. 1832년 Voigt's manual — 정확한 제목 Der Handlungsreisende, wie er sein soll und was er zu tun hat, um Aufträge zu erhalten und eines glücklichen Erfolgs in seinen Geschäften gewiß zu sein (대략 "외판원이 어때야 하는지, 그리고 사업 성공을 위해 무엇을 해야 하는지") — 라는 독일의 외판원 안내서가 NN 형태의 직관 을 명시적으로 제안. 책의 한 절: "가장 가까운 도시로 먼저 가라. 그 다음 또 가장 가까운 도시로." 이것이 NN 의 문헌상 최초 등장 (이 책의 발견은 1985년 Müller-Merbach 의 역사 연구). 200년의 직관이 1977년에야 수학적으로 정밀해진 것.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/05-taxi.html
그림 5.5 ― Christofides 3/2-approximation 의 구성.
1. MST 만들기 (Kruskal, 12장 참조).
● ●
\ /
●─────●
│ │ MST 비용 ≤ OPT (보조정리 5.4).
● ●
│
●
2. 홀수 차수 정점 추출. 위 그림에서 빨강이 그것.
3. 빨강 정점들의 minimum weight perfect matching M.
이분 매칭이 아닌 일반 매칭 — Edmonds blossom (1965).
c(M) ≤ OPT / 2.
4. MST ∪ M = 모든 정점 차수 짝수 → Eulerian.
5. Euler 회로 → shortcut으로 Hamiltonian.
삼각 부등식이 shortcut 비용을 늘리지 않음 보장.
결과: c(Hamiltonian) ≤ c(MST) + c(M) ≤ OPT + OPT/2 = 3/2 OPT. □
그림 5.6 ― 시간창 (time window) 제약 처리.
콜 호출:
c1 [9:00-9:15]
c2 [9:30-9:45]
c3 [9:20-9:35]
c4 [10:00-10:30]
NN 만으로는 c1→c3→c2→c4 (가까운 순) 가 자연스러우나
c3 의 시간창이 9:20-9:35 라 c1 (~9:15) 후 거리 5분 = 9:20 도착 가능.
c2 (9:30-9:45) 는 c3 직후 (9:35) 거리 7분 = 9:42 OK.
풀이: NN 결과를 시간창 검증 → 위반 시 *Or-opt* 으로 segment 재배치
→ 시간창 안에 들도록 swap. 종료까지 반복.
┌─────────────────────────────────────────┐
│ NN 초기 → 시간창 위반 검출 → │
│ → Or-opt 향상 → 시간창 재검증 → 반복 │
│ → 모든 시간창 만족 + 비용 최소 │
└─────────────────────────────────────────┘
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/05-taxi.html
[RosenkrantzStearnsLewis1977]
[Or1976]
[Christofides1976]
[KarlinKleinOveisGharan2021]
[HeldKarp1962]
[HeldKarp1971]
[Karp1979]
[ApplegateBixbyChvatalCook2006]
전체 항목은 bibliography.md.
시간이 곧 거리, 거리가 곧 시간. 같은 한 걸음씩 펴는 가장 단순한 펌프.
"Imagine fluid emanating outward from a single point, expanding at unit speed in every direction. At time t, the fluid has reached precisely those nodes at distance t. This is breadth-first search." — paraphrased from Edward F. Moore, The Shortest Path Through a Maze (1959).
| 항목 | 값 |
|---|---|
| Expert № | 06 |
| 주연 | BFS layering (Moore, 1959) + Multi-source BFS |
| 조연 | 0-1 BFS (deque), Dial's bucket (1969), Lee's algorithm (1961), Multi-layer Dijkstra |
| 원논문 | Moore (1959). "The Shortest Path Through a Maze." Proc. ISTS. |
| 대표 교과서 | CLRS Ch. 20.2, Kleinberg–Tardos Ch. 3 |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
전국 지도 위에 몇 개의 발생지 — 바이러스가 시작된 자리들 — 가 별표로 표시되어 있다. 발생지에서 출발해 매일 인접한 지역으로 한 칸씩 퍼진다. 도시 격자, 또는 도로망 그래프 위에서 — 어느 지역이 며칠째에 감염되는가. 어떤 지역은 여러 발생지에서 동시에 도달할 수 있다. 그 경우 가장 빠른 발생지로부터의 시간 만 의미가 있다. 모든 지역의 감염 시점 을 한꺼번에 계산하라.
이 문제의 첫 인상은 최단경로 — 1장의 다익스트라가 다룬 그 문제 — 다. 그러나 두 가지 차이가 있다. (1) 가중치가 모두 1 — 단순한 격자/도로망. (2) 출발점이 여러 개. 다익스트라를 각 발생지마다 한 번씩 돌려도 되지만, 발생지가 100개고 격자가 1000×1000 이면 — 1억 × 100 = 100억 연산. 너무 느리다.
여기서 Breadth-First Search (BFS) 의 두 가지 강점이 빛난다. 첫째 — 가중치 1 인 그래프에서 BFS 의 층별 진행 이 자동으로 최단거리를 준다. O(V + E) 한 번에. 둘째 — Multi-source BFS. 큐를 여러 시작점으로 동시에 초기화 하는 작은 트릭으로 모든 발생지로부터의 최단거리를 단 한 번의 BFS 로 계산. 시간이 100배 빨라진다.
다익스트라가 우선순위 큐 를 쓰는 이유는 간선 가중치가 다양해서. 가중치가 모두 1이면 — 큐 만으로 충분하다. FIFO 큐. 큐의 순서 가 곧 거리 순서. 큐에서 꺼낸 정점의 거리는 반드시 단조 증가. 이 사실이 BFS 의 모든 마법 의 근원이다.
BFS 의 또 다른 변주가 0-1 BFS. 간선 가중치가 0 또는 1 인 경우. 큐를 deque (양끝 삽입 큐) 로 바꾸고, 가중치 0 간선은 앞으로, 가중치 1 간선은 뒤로 삽입. O(V + E) 유지하면서 정확. 다익스트라보다 log n 배 빠르다. 1980년대 EWD 노트에서 처음 형식화. Expert 6 의 풀이에서 세 종류의 도로 — 무료/유료/봉쇄 — 가 있을 때 시간 비용 = 0 (무료) 또는 1 (유료) 으로 모델링하면 정확히 0-1 BFS.
이 장은 BFS 의 세 변주 — 일반 BFS, Multi-source BFS, 0-1 BFS — 와 그 정확성·복잡도 증명 을 끝까지 본다. 단순한 알고리즘에 놀라울 만큼 정밀한 이론 이 들어있다.
1956년 가을. Bell Telephone Laboratories. Edward F. Moore — 당시 31세, finite automata theory 의 거장 — 가 International Symposium on the Theory of Switching 에서 발표할 논문을 준비한다. 주제는 미로 탐색. 전화 교환망에서 신호 경로 찾기 의 응용 — Bell Labs 의 한 실용 문제. 그가 제안한 알고리즘은 매우 단순하다 — 출발점에서 한 칸씩 동시에 펴 나가기. 모든 칸이 몇 번째 단계에 도달되는가 를 표시. 1959년 Harvard University Press 의 학회 논문집에 7 페이지로 발표.
같은 해 1959년 — 우연히도 같은 해의 다익스트라 (1장) 와 — 최단경로 알고리즘 두 개가 동시에 발표된다. Moore 의 BFS 는 가중치 없는 그래프, Dijkstra 의 알고리즘은 가중치 있는 그래프. 두 알고리즘 모두 그리디 — 한 번 확정한 정점은 다시 보지 않는다. 두 알고리즘 모두 우선순위 로 정점을 처리. 다익스트라는 명시적 우선순위 큐, Moore 는 암묵적 우선순위 = 큐의 FIFO 순서. 가중치가 1이면 두 알고리즘이 같다 — 더 정확히 말하면, Dial's bucket (1969) 가 그 두 알고리즘을 통일 한다.
1961년 C. Y. Lee — IBM Research — 가 Moore 의 알고리즘을 회로 배선 에 응용. Lee's algorithm 이라 불리는 이 변형은 집적 회로 설계 의 표준 도구가 됨. Moore 의 알고리즘이 통신 에서 회로 설계 로 옮겨가는 첫 단계. 오늘날 모든 VLSI 설계 소프트웨어의 routing 모듈 안에 BFS 의 자손이 있다.
Multi-source BFS — 여러 시작점에서 동시에 펴기 — 의 명시적 정식화는 1970년대. 정확한 최초 출처 는 명확치 않다 — 민간 전승 의 알고리즘. CLRS 의 Floyd–Warshall 장의 예제에 등장하지만, 더 일찍의 응용 사례 (전화망 routing) 가 존재. 알고리즘 자체는 trivial — 큐에 모든 시작점을 동시에 삽입하고 평소처럼 BFS. 그러나 왜 이게 옳은가 의 정확한 증명은 §6에서.
0-1 BFS 의 deque 트릭은 1980년대 competitive programming 에서 민간 전승 으로 자리잡았다. 다익스트라의 EWD 노트 EWD 1141 (1992) 에 짧은 언급. 학술적 표준 출처는 없다 — 알고리즘 대회와 online judge 에서 경험적으로 검증되며 표준이 됨. Codeforces 의 Educational Round 같은 자리에서 반복적으로 출제되며 정착.
기본 BFS 의 의사코드.
algorithm BFS(G, s):
for each v in V:
d[v] = infinity
d[s] = 0
Q = Queue() # FIFO
Q.enqueue(s)
while Q not empty:
u = Q.dequeue()
for each v in N(u):
if d[v] == infinity:
d[v] = d[u] + 1
Q.enqueue(v)
return d
Multi-source BFS — 큐를 모든 시작점으로 초기화.
algorithm MultiSourceBFS(G, sources S):
for each v in V:
d[v] = infinity
Q = Queue()
for each s in S:
d[s] = 0
Q.enqueue(s)
while Q not empty:
u = Q.dequeue()
for each v in N(u):
if d[v] == infinity:
d[v] = d[u] + 1
Q.enqueue(v)
return d
d[v] 가 어느 시작점으로부터의 최단거리 인지가 자동으로 잡힌다. 가장 가까운 시작점 의 거리.
0-1 BFS — deque + 가중치별 분기.
algorithm ZeroOneBFS(G, s):
for each v in V:
d[v] = infinity
d[s] = 0
D = Deque()
D.push_front(s)
while D not empty:
u = D.pop_front()
for each (u, v, w) in E: # w in {0, 1}
if d[u] + w < d[v]:
d[v] = d[u] + w
if w == 0:
D.push_front(v)
else:
D.push_back(v)
return d
세 알고리즘 모두 O(V + E). 다익스트라의 O((V+E) log V) 보다 log V 만큼 빠르다 — 가중치가 제한적 일 때만 가능한 최적화.
그림 6.1 ― 단일 출발 BFS 의 층별 진행.
격자 5×5, 시작 (0,0):
layer 0: S . . . . layer 1: S 1 . . .
. . . . . 1 . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
layer 2: S 1 2 . . layer 3: S 1 2 3 .
1 2 . . . 1 2 3 . .
2 . . . . 2 3 . . .
. . . . . 3 . . . .
. . . . . . . . . .
... 양파 껍질처럼 한 층씩 펴짐. 4 이웃 격자에서 layer L 의 폭 ≈ 4L.
그림 6.2 ― Multi-source BFS 의 경계 충돌.
3 발생지: S1=(0,0), S2=(4,4), S3=(0,4)
각 발생지에서 펴진 영역의 *경계선* 이 만나는 자리 = Voronoi 경계.
S1 ──── 1 1 1 1 1 ────── S3
1 ────── 1 1 1 1 ──────── 1
2 ────── 1 1 1 ────────── 1
★ Voronoi 경계 - 동시 도달 ★
1 ────── 1 1 ──────────── 1
────────────────────── S2
여기서 Multi-source BFS 의 d[v] = 가장 가까운 발생지로부터의 거리.
부산물: Voronoi 다이어그램이 *자동으로 계산됨*.
Unweighted graph. G = (V, E). 모든 간선 가중치 1.
Distance. d(s, v) = s 에서 v 까지 간선 수가 가장 적은 경로의 간선 수.
Source set. Multi-source BFS 에서 시작점 집합 S ⊆ V. d(S, v) = min_{s ∈ S} d(s, v).
Layer. L_k(s) = {v ∈ V : d(s, v) = k}. L_0(s) = {s}. 모든 layer 의 합 ⋃_k L_k(s) = V (s 에서 도달 가능한 정점 집합).
0-1 graph. G = (V, E) 에 가중치 w : E → {0, 1}. 거리 δ(s, v) = min_{path} Σ w.
왜 이 보조정리들이 필요한가. 우리가 §6에서 증명하려는 것은 (1) BFS 의 정확성 — 모든 v 에 대해 d[v] = d(s, v). (2) Multi-source 의 정확성 — d[v] = d(S, v). (3) 0-1 BFS 의 정확성 — d[v] = δ(s, v). 세 정리 모두 큐의 순서가 단조 증가 라는 한 가지 사실에 기댄다.
보조정리 6.1 (BFS Queue Monotonicity).
BFS 동안 큐에 들어있는 정점들의 거리 추정값
d[·]는 비감소 순서 — 큐의 앞쪽 원소≤뒤쪽 원소.
증명. 귀납. 초기: 큐 = [s], 한 원소. 성립.
귀납 단계: 큐가 [u_1, u_2, …, u_k] 이고 d[u_1] ≤ d[u_2] ≤ … ≤ d[u_k] 라 가정 (귀납 가정). 다음 단계: u_1 을 꺼냄. 그 이웃들 v_1, v_2, … 중 미방문한 것들을 큐 뒤 에 삽입, 거리 d[u_1] + 1. 새 큐: [u_2, …, u_k, v_1, …]. 새 원소들의 거리는 d[u_1] + 1. 귀납 가정에 의해 d[u_2] ≥ d[u_1]. 따라서 d[u_2] ≥ d[u_1] 이고 d[u_1] + 1 ≥ d[u_2] 일 수도 있다 — 그러나 d[u_2] ≤ d[u_1] + 1 (BFS 의 추가적 부등식, 보조정리 6.2). 따라서 새 큐도 비감소. ∎
보조정리 6.2 (Layer Adjacency).
BFS 동안 큐에 들어있는 정점들의 거리 추정값 최대 차 는 1. 즉
max d - min d ≤ 1. 더 자세히, 큐 =[…, L_k, L_{k+1}, …]의 모양.
증명. s 에서 시작. 첫 단계 큐 = [s] = L_0. s 의 이웃들 추가 → 큐 = [L_1, …]. 다음 L_1 의 원소를 꺼내면서 그 이웃들 (= L_0 ∪ L_1 ∪ L_2) 추가, 그 중 미방문 = L_2. 큐 = [L_1 의 나머지, L_2 의 일부]. 항상 두 인접 layer 의 원소만 큐에 있음. ∎
보조정리 6.3 (0-1 BFS Deque Invariant).
0-1 BFS 동안 deque 에 들어있는 정점들의
d[·]는 비감소 순서. deque 앞쪽 = 가장 작은 거리. 게다가 거리의 최대 차 는 1.
증명. 가중치 0 간선은 현재 거리와 같은 정점을 만든다 — 이를 앞쪽 에 넣어 순서 보존. 가중치 1 간선은 현재 거리 + 1 인 정점 — 뒤쪽 에 넣어 최대 차 1 보존. 따라서 invariant 유지. ∎
보조정리 6.4 (Multi-source BFS Equivalence to Single-source).
Multi-source BFS from
S는 가상 super-sources_0를 도입한 그래프G'의 single-source BFS froms_0와 동등 하다.G'의 정의:V' = V ∪ {s_0},E' = E ∪ {(s_0, s) : s ∈ S}, 가중치는 모두 1 (또는 BFS 의 무가중).
증명. G' 에서 s_0 의 첫 BFS 단계는 모든 s ∈ S 를 layer 1 에 넣는다. 이후 BFS 는 layer 1 부터 정확히 multi-source BFS 와 같음. 거리 차이 = 1 (super-source 추가 간선) — 일관되게 빼면 동등. ∎
보조정리 6.5 (BFS Tree Structure).
BFS 가 만들어내는 부모 트리 (
parent[v] = uifv가u의 이웃으로 처음 발견됨) 는 최단경로 트리 (shortest path tree froms). 즉 트리의s→v경로 길이 =d(s, v).
증명. 정리 6.4 에 의해 d[v] = d(s, v). 부모 트리의 s→v 경로는 정확히 d(s, v) 간선 — BFS 의 거리 증가가 매 단계 1씩이므로. ∎
보조정리 6.6 (Connected Component Identification).
BFS from
s는s의 연결 컴포넌트 안의 모든 정점을 정확히 한 번 방문하고 끝남.
증명. 큐가 빌 때 종료. 큐에 들어가는 정점 = 도달 가능 = s 의 컴포넌트. ∎
이 보조정리가 전체 그래프의 연결 컴포넌트 개수 세기 의 표준 방법 — 모든 정점을 한 번 BFS 시작점으로 시도, 새 컴포넌트마다 카운트 +1. 4장 (Union-Find) 의 대안적 방법 — UF 는 동적 합병 에 강점, BFS 는 정적 분석 에 강점.
이 세 보조정리가 BFS 가족의 모든 정확성 증명의 기둥.
왜 이 정리가 필요한가. 단순한 BFS 의 정확성도 증명 이 필요하다 — 왜 큐에서 꺼낸 정점의 거리가 진짜 최단거리 인가. 다익스트라의 정리 1.4 (Greedy Choice) 의 unweighted 특수 경우.
정리 6.4 (BFS Correctness).
BFS 알고리즘은 모든 정점
v에 대해d[v] = d(s, v)로 종료한다.
증명. 큐에 들어가는 순서대로 귀납. 첫 정점 s: d[s] = 0 = d(s, s). 성립.
귀납 단계: v 를 큐에 처음 넣는 순간, v 는 어떤 u 의 이웃으로 발견됨. 그 u 는 그 시점에 이미 settled — 큐에서 꺼내짐. 귀납 가정으로 d[u] = d(s, u). v 에 부여되는 거리 d[v] = d[u] + 1 = d(s, u) + 1.
주장: d(s, v) = d(s, u) + 1. 즉 v 의 진짜 최단거리는 현재 부여된 값과 같음.
귀류로 — d(s, v) < d(s, u) + 1 이라 가정. s → … → v 의 진짜 최단경로를 P 라 하자. P 의 마지막 간선을 (x, v). d(s, x) = d(s, v) - 1 < d(s, u). 그렇다면 x 는 u 보다 먼저 큐에서 꺼내졌어야 함 (보조정리 6.1 의 단조 큐). x 가 settled 될 때 v 가 그 이웃으로 발견 되어 큐에 들어갔어야 함. 그런데 v 가 그 시점이 아니라 u 시점에 처음 들어갔다 — 모순. ∎
정리 6.5 (Multi-source BFS Correctness).
Multi-source BFS 는 모든
v에 대해d[v] = d(S, v) = min_{s ∈ S} d(s, v)로 종료한다.
증명. "가상의 super-source s_0" 를 도입 — s_0 에서 모든 s ∈ S 로 가중치 0 간선이 있는 가상 그래프 G'. G' 의 single-source BFS from s_0 가 정확히 multi-source BFS 의 결과. gate of equivalence 한 줄. 정리 6.4 에 의해 정확. ∎
이 가상 super-source 트릭은 우아하다. 알고리즘 변화 없이 정확성을 기존 결과로 환원. 알고리즘 이론의 자주 등장하는 축소 (reduction) 기법.
정리 6.6 (0-1 BFS Correctness).
0-1 BFS 는 모든
v에 대해d[v] = δ(s, v)로 종료한다.
증명. 보조정리 6.3 (deque invariant). 큐에서 꺼낸 정점은 현재 deque 의 가장 작은 거리. 가중치 0 간선의 앞쪽 삽입 이 그 정점을 같은 거리 클러스터 의 일부로 처리. 가중치 1 간선의 뒤쪽 삽입 이 다음 거리 클러스터 로. 다익스트라의 settled 인 자나 (정리 1.4) 와 정확히 같은 cut property. 자세한 case analysis 는 RSL 1977 의 다익스트라 증명과 같음. ∎
증명이 깨지는 가정. 가중치가 0/1 외 — 0-1 BFS 는 가중치 2 이상을 다룰 수 없다. 가중치 음수 — 다익스트라처럼 깨진다. 방향성 변경 — BFS 는 방향 무관, 단순.
왜 0-1 BFS 는 가중치 2를 다룰 수 없는가. 보조정리 6.3 의 최대 차 1 이 깨진다. 가중치 2 간선이 현재 거리 + 2 인 정점을 만들면 — deque 의 layer 구조 가 무너진다. push_back 으로 넣어도, 그 정점의 앞 에 이미 layer L+1 인 정점들이 있을 수 있어 순서 깨짐. 가중치 2 이상 부터는 정렬이 필요 = priority queue = 다익스트라.
정리 6.6ᵇ (Stronger Multi-source Result).
Multi-source BFS 결과는 각 정점에서 가장 가까운 source 의 ID 도 부산물로 제공 가능.
nearest[v]변수를 추가해, 정점이 처음 발견될 때 발견자의 nearest 를 상속.
증명. BFS 트리 구조 (보조정리 6.5) 의 부모로부터 nearest source 가 정확히 전파됨. ∎
이 결과의 응용 — Voronoi 다이어그램의 이산적 계산. 그래프 위에서 어느 정점이 어느 source 의 영역인지 한 번의 BFS 로. 도로망 응급실 할당, 우편 분류 등 공간 분할 의 표준 도구.
정리 6.7 (BFS Time Complexity).
BFS, Multi-source BFS, 0-1 BFS 모두
O(V + E)시간.
증명. 각 정점이 정확히 한 번 큐에 들어감 (O(V)). 각 간선이 최대 두 번 평가됨 (O(E)). 0-1 BFS 도 deque 의 push/pop 이 O(1). 따라서 O(V + E). ∎
정리 6.8 (Space Complexity).
공간
O(V)— 거리 배열 + 큐.
증명. 거리 배열 O(V). 큐는 layer 두 개 의 크기, 최대 O(V). ∎
하계. 반드시 모든 정점과 간선을 한 번씩 봐야 d(·) 를 안다 (adversary argument). 따라서 Ω(V + E). BFS 가 이 하계를 달성 — 최적 알고리즘.
(a) Dial's bucket algorithm. 가중치가 [0, W] 의 작은 정수. 큐 대신 W+1 개 버킷. O(V + E + WV). 1969년. 1장 §8 의 친척.
(b) Multi-layer BFS. 시간 변화 그래프 — 각 시점 t 에 다른 간선. O(T × (V + E)). Expert 6 의 동적 확산 모델.
(c) Bidirectional BFS. 양 끝에서 동시에 — 1장 §8 의 Bidirectional Dijkstra 의 unweighted 버전. 평균 √ 배 빠름.
(d) BFS on implicit graphs. 정점을 미리 만들지 않고 큐에서 꺼낼 때 생성. 메모리 효율적. 슬라이딩 퍼즐, 큐브 풀이 등.
(e) Parallel BFS. layer-synchronous 병렬 BFS — 각 layer 를 동시에 처리. GPU 의 BFS 의 표준.
(f) *A (with h ≡ 0) = BFS.** 1장 §8 의 A* 가 휴리스틱이 영 일 때 unweighted BFS 로 정확히 환원.
그림 6.2ᵇ ― 0-1 BFS 의 deque 진행.
Graph (가중치 = 0 or 1):
s ──1── a ──0── b ──1── t
│ │
0 0
│ │
c ──0── d ──1──┘
초기: d[s]=0, deque = [s]
step 1: pop_front s. 이웃: a (w=1, push_back), c (w=0, push_front).
deque = [c, a]. d[c]=0, d[a]=1.
step 2: pop_front c. 이웃: d (w=0, push_front), s (skip).
deque = [d, a]. d[d]=0.
step 3: pop_front d. 이웃: b (w=1, push_back), c (skip).
deque = [a, b]. d[b]=1.
step 4: pop_front a. 이웃: s (skip), b (w=0, d[b] 갱신? 현재 d[b]=1, d[a]+0=1, 같음 skip).
deque = [b].
step 5: pop_front b. 이웃: a (skip), d (skip), t (w=1, push_back).
deque = [t]. d[t]=2.
결과: d[s]=0, d[c]=0, d[d]=0, d[a]=1, d[b]=1, d[t]=2.
확인: s→c→d→b→t = 0+0+1+1 = 2. ✓
그림 6.3 ― BFS 변형 가계도.
Moore (1959)
가중치 없는 BFS
│
┌────────────┬───┴────────────┬─────────────┐
▼ ▼ ▼ ▼
Multi-source 0-1 BFS Dial bucket Bidirectional
(deque) (W 정수 가중치) (양 끝)
│ │
▼ ▼
Dijkstra(1959) Pohl(1971)
│
▼
Δ-stepping (1998 병렬)
그림 6.3ᵇ ― Multi-source BFS 의 시간 동시성.
시점 t=0: S1 ● ● ● S2 ● S3
시점 t=1: S1 ●─1 1─●─1 ●─1 S2 ●─1 S3
│ │ │ │
1 1 1 1
시점 t=2: S1 ●─1─2 1─●─1 ─2 ●─1─2 S2 ●─1 S3
2─│ │ │ │
1 1 1 1
... 동시 진행. 한 정점은 *가장 먼저 도달한* 시간만 기록.
여러 발생지의 *경계* 가 *Voronoi-like* 영역을 자연스럽게 그림.
그림 6.4 ― 그래프 유형별 BFS 변형 선택.
그래프 특성 적합 알고리즘 복잡도
──────────────────────────────────────────────────────────────────
가중치 없음, 한 출발 BFS O(V + E)
가중치 없음, 여러 출발 Multi-source BFS O(V + E)
가중치 ∈ {0, 1} 0-1 BFS (deque) O(V + E)
가중치 ∈ [0, W] (작은 W) Dial bucket O(V + E + WV)
가중치 임의 비음수 Dijkstra (Ch. 1) O((V+E) log V)
가중치 음수 포함 Bellman–Ford O(VE)
──────────────────────────────────────────────────────────────────
Moore 의 1959 Proc. ISTS 논문 The Shortest Path Through a Maze 는 7 페이지. Harvard University Press 의 학회 논문집. 매우 짧고 자명. Moore 의 의도는 Bell Labs의 전화 교환망 에서 신호 경로 찾기. 단순 격자 미로 대신, 그래프의 임의 형태 에 적용 가능함을 강조.
§1 Introduction 에서 미로의 일반화 — 임의 그래프 — 를 명시. §2 The Algorithm 에 BFS 의 의사코드 (당시 표기로는 기호적 흐름도).
§3 가 흥미로운 부분. Moore 는 BFS 가 모든 정점의 최단거리 를 동시에 찾음을 강조. single-pair 가 아니라 single-source. 이는 오늘날의 BFS 정의 의 시작.
§4 Implementation 에서 FIFO 큐 의 사용. 명시적. Stack 대신 Queue — 깊이 우선 (DFS) 이 아니라 너비 우선임을 코드 수준 에서 보임.
§5 Applications. 전화 교환망 외에 미로 풀기, 논리 회로 설계, 우편 분류기 경로 등 다양한 응용. 1959년에 이미.
Lee 의 1961 IRE Transactions 논문 An Algorithm for Path Connections and Its Applications 는 20 페이지. Lee's algorithm 이라 불리는 회로 배선 알고리즘. Moore 의 BFS + 경로 추적 + 장애물 회피. VLSI 설계 의 표준이 되는 알고리즘.
Edward Forrest Moore (1925–2003). 미국 Baltimore 출생. Brown 대학교 박사 (1950). Bell Labs (1950~1956), University of Illinois (1956~1966), University of Wisconsin–Madison (1966~). 1956년 Moore machine — 유한 상태 기계 의 한 모델 (출력이 상태에만 의존) — 으로 자동기계 이론의 표준 개념을 만듦. 1959 BFS 외에도 Moore's law (반도체 의 그것은 동명이인 Gordon Moore, 인텔 — 이 Moore와는 다른 사람).
C. Y. Lee (Cheng Yu Lee, 1928~). 중국계 미국 컴퓨터 과학자. IBM Research 와 Bell Labs. 1961 Lee's algorithm 외에도 Lee distance (정보 이론의 metric).
Edsger W. Dijkstra (1장 §10 참조). EWD 1141 (1992) 에서 0-1 BFS 의 deque 변형을 간략히 언급. 그가 발명 했다기보다 체계적으로 정리. 알고리즘 자체는 1970년대 동유럽 (특히 러시아) competitive programming 에서 민간 전승 으로 자라난 것으로 추정.
Multi-source BFS 의 익명성. 이 알고리즘의 명시적 최초 출처 는 찾기 어렵다. 1970년대 통신 네트워크 분야의 전화망 라우팅 에서 자명한 일반화 로 등장. 1990년대 알고리즘 교과서 (Manber, Introduction to Algorithms: A Creative Approach, 1989) 에 표준 등장. 민간 전승 알고리즘 의 한 사례 — 명시적 정리 없이도 모두가 알고 쓰는 도구.
Expert 6번 — 바이러스 — 의 풀이는 Multi-source BFS 의 직접 응용 + 시간 층 (multi-layer) 의 동적 변화.
1. 격자/그래프 정의. 지역들을 정점, 인접 지역 간 연결 가능 여부 를 간선. 2. 모든 발생지를 시작점으로 초기화. Q.enqueue(s) for all s ∈ 발생지. d[s] = 0. 3. Multi-source BFS 실행. 정리 6.5 에 의해 d[v] = 가장 가까운 발생지로부터의 거리 = 감염 시점. 4. 추가 제약 (도로 봉쇄, 격리 정책) 처리. 봉쇄된 도로 = 간선 가중치 ∞ (= 없는 간선). 격리 = 그 정점을 skip. 시간 변화 봉쇄 = multi-layer BFS. 5. 0-1 BFS 사용 가능 사례. 어떤 도로는 시간 비용 0 (직접 연결), 어떤 도로는 시간 비용 1 (한 시간 지연) 인 경우 — deque 트릭 적용.
시간 복잡도 는 정리 6.7 에 의해 O(V + E). 1000×1000 격자 (= 1백만 정점, 4백만 간선) 에서도 밀리초 단위. 100개 발생지여도 추가 비용 없음 — multi-source 의 강점.
다익스트라 (1장) 와의 비교. 다익스트라는 가중치 다양 에 대응. BFS 는 가중치 1 또는 0/1 만. 그러나 후자의 경우 BFS 가 log V 배 빠르다. 문제의 특성에 맞는 알고리즘 선택 — 알고리즘 설계의 한 교훈. 항상 가장 일반적인 것 이 가장 좋은 것 은 아니다.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/06-virus.html
왜 이 장이 책 전체에서 특별한가. BFS 는 가장 단순한 그래프 알고리즘 이다. 그러나 그 정밀한 분석 은 다익스트라 (1장) 와 동등하게 엄밀. 단순함 ≠ 자명함. BFS 의 정확성 증명 (정리 6.4) 은 다익스트라의 정확성 증명 (정리 1.4) 의 unweighted 특수 경우. 두 정리가 같은 골격 을 공유한다. 책의 1장과 6장이 멀리 떨어져 있지만 깊이 연결되어 있다.
시뮬레이션 모델과의 연결. Expert 6번의 바이러스 확산 은 SIR 모델 (Susceptible-Infected-Recovered, Kermack-McKendrick 1927) 의 이산 격자 시뮬레이션 의 단순화 형태. 실제 역학 (epidemiology) 에서는 연속 시간 미분방정식 으로 모델링하지만, 컴퓨터 시뮬레이션 의 직관적 첫 단계 는 BFS 다. 한 time step = 한 BFS layer. Multi-source BFS 의 결과 = 각 지역의 최초 감염 시점. 더 정교한 모델 (확률적 감염, 회복 시간, 백신) 도 BFS 의 변형 으로 표현 가능 — 19장 (k-means) 과 20장 (Particle Filter) 에서 이 확률적 변형 의 큰 그림을 본다.
Network science 와의 연결. Six degrees of separation — 임의의 두 사람이 평균 6 단계의 친구 관계로 연결된다 — 의 실험적 검증 (Milgram 1967, Travers–Milgram 1969) 은 BFS 의 층별 펴짐 의 직관적 정량화. small-world network (Watts–Strogatz 1998), scale-free network (Barabási–Albert 1999) 같은 복잡계 그래프 의 지름 분석 의 핵심 도구도 BFS. 단순한 알고리즘이 21세기 네트워크 과학 의 한 기둥.
BFS 의 응용 차림표. 이 책의 다른 장과의 직접 연결:
이 다섯 장이 그래프 위 기본 도구상자 를 이룬다. 6장의 BFS는 그 가장 단순한 자리.
경시 코딩의 BFS 트릭 카탈로그. Codeforces 의 BFS 문제에서 자주 등장하는 트릭들. (1) Lazy deletion — 처리 시점에 stale 한 정점은 skip. (2) Implicit graph BFS — 정점을 미리 만들지 않고 큐에서 꺼낼 때 생성. 메모리 효율. (3) State BFS — 정점 = (위치, 상태) 쌍. 격자 + 키 소유 여부 등. (4) Layered grid — 시간 차원 추가. (5) Reverse BFS — 모든 목적지에서 역방향 BFS, 시작점에서의 거리는 원래 그래프의 reverse 그래프 위의 BFS. 이 다섯 트릭이 현대 알고리즘 대회 출제의 70% 를 차지.
*BFS 의 수학적 단순함* — 단 한 줄의 invariant.** BFS 전체의 정확성이 큐가 비감소 순서를 유지한다 (보조정리 6.1) 라는 한 줄 에 기댄다. 이 한 줄에서 정리 6.4 (정확성), 정리 6.5 (Multi-source), 정리 6.6 (0-1 BFS), 보조정리 6.5 (BFS 트리) 가 모두 따라온다. 알고리즘 이론의 한 우아한 사례. 다익스트라 (1장) 의 Greedy Choice 보조정리도 — 같은 한 줄의 우선순위 큐 단조성 위에 서 있다. BFS 와 Dijkstra 의 공통 골격 이 큐의 단조성. 한 줄의 invariant 에 60년의 알고리즘 발전사 가 응축되어 있다.
Implementation 주의점. BFS 의 구현에서 흔한 실수 두 가지. (1) 큐에 넣을 때 visited 표시 vs 큐에서 꺼낼 때 표시. 정답: 큐에 넣을 때. 안 그러면 같은 정점이 여러 번 큐에 들어가 시간 늘어남. (2) visited 배열 vs distance 배열 — distance = ∞ 이 visited = false 와 같은 의미. 한 배열로 통합. 메모리 절반.
BFS 의 한 시 — 우물에 물 붓기. Moore 의 1959 논문의 원래 직관 은 우물에서 물이 퍼지는 모습. 매 시점 물의 가장자리 는 동심원. 그래프에서 그 동심원이 layer. Multi-source 는 여러 우물 동시. 0-1 BFS 는 어떤 통로는 즉시 흐름, 어떤 통로는 시간 지연. 알고리즘의 물리적 직관 이 시간이 거리 라는 기본 사실 을 만든다. 공간 = 시간 의 등식 — 아인슈타인의 일반 상대론처럼 — 이 BFS의 모든 정확성 의 직관적 근거. 그래프의 지름 (longest shortest path) 도 BFS 로 한 번에 — 모든 시작점에서 BFS 의 max distance 의 max.
다음 장으로 가는 다리. 7장 (Min-Cost Flow) 의 augmenting path 알고리즘은 BFS 로 shortest augmenting path 찾기 가 핵심 부분. Edmonds–Karp 알고리즘 (7장)의 시간 복잡도 O(VE²) 가 BFS 한 번이 O(V+E) 라는 사실에 정확히 의존. 6장의 기초 BFS 가 7장의 근사 흐름 알고리즘 의 building block. 단순한 도구가 복잡한 도구의 부품 으로 한 단계씩 쌓이는 것 — 알고리즘 이론의 건축적 아름다움.
Moore 의 유산. Moore 의 1959 논문은 7 페이지짜리 조용한 시작 이었다. 그러나 그 알고리즘 — BFS — 은 컴퓨터 과학의 가장 보편적 도구 중 하나가 되었다. 구글 검색의 PageRank 계산 의 일부, 페이스북의 친구 추천 시스템의 2-degree 친구 탐색, GPS 내비게이션의 경로 후보 생성, AI 의 상태 공간 탐색 의 가장 기본 도구. 한 학회 논문집의 짧은 글이 66년 뒤 까지 이렇게 살아남을 줄을 Moore 자신은 알았을까. 그가 Bell Labs의 한 점심 에 떠올린 우물에서 물 퍼지는 모습 이 — 지금 이 순간 — 전 세계의 컴퓨터 안에서 수십억 번 호출되고 있다.
이 장의 마지막 한 줄 의 약속. 다음 장 7장에서는 BFS 가 흐름 알고리즘 의 부품 으로 다시 등장한다. 같은 도구의 재사용 — 알고리즘 책 한 권을 관통하는 연속성. 한 장에서 끝까지 따라간 도구가 다음 장에서 더 큰 그림 의 한 조각 으로 나타난다. BFS 가 Edmonds–Karp 안에서 다시 떠오르고, 다시 12장의 Borůvka 안에서, 18장의 Pursuit-Evasion 의 cop-win 분석 안에서. 한 알고리즘이 책 한 권을 가로질러 흐른다.
[Moore1959]
[Lee1961]
[Dial1969]
[Zero_One_BFS]
[CLRS2022]
[KleinbergTardos2005]
[BoissonnatYvinec1998]
[NewmanBarabasiWatts2006]
전체 항목은 bibliography.md.
매 단계 가장 짧은 길로 흐름을 한 방울씩 — 흐름이 차오를 때까지.
"The fundamental theorem on flows in a network with capacities states that the maximum value of any flow from the source to the sink equals the minimum cut. We shall give a constructive proof by means of an algorithm." — L. R. Ford, D. R. Fulkerson, Maximal Flow Through a Network, Canadian J. Math. 8 (1956), p. 399.
| 항목 | 값 |
|---|---|
| Expert № | 07 |
| 주연 | Min-Cost Max-Flow via Successive Shortest Paths (Klein 1967, Tomizawa 1971) |
| 조연 | Ford–Fulkerson (1956), Edmonds–Karp (1972), Cycle-Canceling (Klein 1967, Goldberg–Tarjan 1989), Network Simplex (Dantzig 1963) |
| 원논문 | Ford–Fulkerson (1956). "Maximal Flow Through a Network." Canadian J. Math. 8: 399–404. |
| 대표 교과서 | Ahuja–Magnanti–Orlin (1993), CLRS Ch. 24–25 |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
도시의 교통망. 도로 하나하나에 허용 용량 (한 시간에 최대 차량 수) 과 통과 비용 (시간 + 연료) 이 있다. 도시 외곽의 한 출입구 에서 시작해, 시내 목적지 까지 총 N 대의 차 를 보내야 한다. 어느 도로를 어느 만큼 사용하느냐가 전체 비용 을 결정한다. 도로의 용량을 초과 할 수 없고 (교통 체증), 보내야 하는 차량 수 N 은 반드시 도착해야 한다 (수요 만족). 그 제약 안에서 비용 최소화.
이 문제의 수학적 이름 은 Minimum Cost Flow (MCF). 1950년대 운영 연구 (operations research) 의 한 중심 주제로 형성. 그 시점의 대표 응용은 — 의외로 — 소비에트 철도망 의 차단 분석 (Tolstoi 1930) 과 미국 군수 물자 흐름 (Ford–Fulkerson, RAND Corporation 1955). 냉전 시대의 두 거인이 동시에 같은 문제 를 풀고 있었다. 그 결과 — Max-Flow Min-Cut 정리 — 가 1956년 Canadian Journal of Mathematics 에 발표된다. 이 정리가 조합 최적화 의 근본 정리 중 하나.
Min-Cost Flow 는 Max-Flow 의 일반화. 단순히 최대 흐름 을 찾는 것이 아니라, 같은 양의 흐름 중 비용이 가장 작은 것을 찾는다. 알고리즘 도구상자는 두 가지 핵심 접근.
1. Successive Shortest Paths (SSP). 매 단계 현재 잔여 그래프에서 가장 짧은 augmenting path 를 찾아 흐름을 한 방울씩 증가. 다익스트라 (1장) 가 부품으로 내장 된다.
2. Cycle-Canceling. 임의 max-flow 에서 시작해, 음수 비용 사이클 이 있으면 그 사이클을 따라 흐름을 재배치 — 총 비용 감소. 음수 사이클이 없을 때까지. 종료 시 OPT.
두 방법 모두 Edmonds 1971 (3장의 그 Edmonds) 의 polymatroid 이론의 한 사례. 두 방법의 공통 골격 — 알고리즘 변화 시 단조 감소 — 이 정확성 의 증명을 짧고 우아하게 만든다.
Expert 7번 — 교통 — 의 풀이는 SSP 의 직접 응용. 도로망을 그래프, 용량과 비용을 간선 라벨, 차량 수 N 을 흐름 요구량. N 번 또는 덜 많은 번 augmenting path 를 찾으면 풀이 끝. SSP 의 각 단계는 비음수 비용 의 다익스트라 (1장) 호출 — 따라서 1장의 전체 정확성과 복잡도 가 7장에서 부품으로 재활용. 이것이 알고리즘 책 6→7장 의 건축적 연속성.
1950년대 후반의 RAND Corporation. 캘리포니아 산타모니카. Lester Randolph Ford Jr. (1927~2017) 와 Delbert Ray Fulkerson (1924~1976) — 미국의 두 수학자. RAND 의 operations research 그룹. 당시 그들의 임무는 미군 군수 물자 흐름의 분석 — 한 항구에서 다른 항구로 수송선 의 흐름을 어떻게 최대화할 것인가. 군 비밀 수준의 작업이었지만, 알고리즘 자체 는 1956년 학문지 에 발표.
Maximal Flow Through a Network 라는 짧은 제목. Canadian Journal of Mathematics 8권. 6 페이지짜리. 이 논문이 컴퓨터 과학사 의 한 페이지. 정리는 다음과 같다 — 어떤 네트워크의 source 에서 sink 로의 max-flow 의 양 = sink 를 source 로부터 분리하는 min-cut 의 용량. Max-Flow Min-Cut 정리. 두 듀얼 양이 정확히 같다.
알고리즘은 간단 했다. 잔여 그래프에서 augmenting path 가 있으면 (= source 에서 sink 로 가는 capacity > 0 인 경로) 그 경로를 따라 흐름을 최대치 만큼 보냄. augmenting path 가 없을 때 = max-flow 도달. 그 시점의 잔여 그래프의 source 측 분리 = min-cut.
Ford–Fulkerson 알고리즘은 정확 했지만 — 시간 복잡도 가 유리수 가중치 에서 유한하다는 보장이 없었다. 1969년 Zwick 가 무리수 가중치 의 반례를 만듦 — 알고리즘이 수렴하지만 OPT 에 도달하지 못함. 1972년 Jack Edmonds 와 Richard Karp 가 이 약점을 고친다. augmenting path 의 선택 을 BFS 의 shortest path 로 — 즉 가장 적은 간선 의 경로. 결과: 다항 시간 보장. O(VE²). 이 결과는 최초의 다항 시간 알고리즘 (Edmonds 의 Paths, Trees, and Flowers 1965 이후) 의 하나. 1972년 JACM 논문.
1967년 Morton Klein — Columbia University 운영연구학자 — 이 Management Science 에 Cycle-Canceling 알고리즘 발표. Min-Cost Flow 의 처음 정밀한 알고리즘. Klein 의 알고리즘은 임의 max-flow 에서 시작, 음수 비용 사이클 을 Bellman–Ford 로 검출, 그 사이클을 따라 흐름을 재배치. 음수 사이클이 없을 때까지. 종료 시 OPT.
같은 1971년 Nakatsugu Tomizawa (당시 NTT 일본 통신 연구소) 가 Networks 학술지에 Successive Shortest Paths (SSP) 알고리즘을 발표. 더 효율적이지만 복잡도가 비-다항 — 흐름의 양에 비례. 1989년 Goldberg–Tarjan 이 strongly polynomial (수치 무관) cycle-canceling 변형 발표 — 이론적 최적의 한 자리. 그 사이 1980년대에 Dantzig 의 Network Simplex (1963 Linear Programming and Extensions 책의 일부) 가 실용적으로 가장 빠른 MCF 알고리즘으로 자리잡음. Theorem vs Practice 의 균열 — 이론적으로는 Goldberg–Tarjan, 실무에서는 Network Simplex. 두 알고리즘이 같은 문제의 같은 답 을 다른 길로 찾는다.
SSP 의 의사코드.
algorithm SuccessiveShortestPaths(G, source s, sink t, demand D):
# G = (V, E, capacity, cost). 흐름 f 를 초기 0 으로.
f = 0
total_cost = 0
total_flow = 0
while total_flow < D:
# 잔여 그래프 G_f 에서 s → t 의 최단경로 (비용 기준) 를 다익스트라로
P = ShortestPath(G_f, s, t, cost)
if P does not exist: return "infeasible"
# P 위의 최소 잔여 용량
delta = min capacity_f over edges in P
delta = min(delta, D - total_flow)
# P 위의 흐름 +delta
augment f by delta along P
total_cost += delta * cost(P)
total_flow += delta
return f, total_cost
O((augmenting path 수) × (Dijkstra 비용)). 각 augmenting path = O((V+E) log V) (Dijkstra). augmenting path 수 = up to D 또는 O(VE) (worst-case 분석에 따라).
Cycle-Canceling 의 의사코드.
algorithm CycleCanceling(G, source s, sink t, demand D):
# 우선 임의의 max-flow f 를 찾아둠 (Ford–Fulkerson)
f = FordFulkerson(G, s, t)
while exists negative cost cycle C in G_f:
delta = min capacity_f over edges in C
augment f by delta along C
return f
음수 사이클 검출은 Bellman–Ford O(VE). 사이클 1번 처리도 O(VE). 총 사이클 수 = pseudo-polynomial. Goldberg–Tarjan (1989) 의 minimum mean cycle 선택으로 strongly polynomial: O(V²E² log²V) 정도.
작은 예시 — 5 정점 그래프. s=1, t=5. 간선 (용량, 비용): (1→2, 3, 1), (1→3, 2, 3), (2→4, 2, 2), (2→3, 1, 0), (3→5, 2, 1), (4→5, 3, 1). 요구량 D=4.
초기: 1 ─(3,1)─→ 2 ─(2,2)─→ 4
│ │ │
(2,3) (1,0) (3,1)
▼ ▼ ▼
3 ←────── 3 ──(2,1)─→ 5
←─────┘
SSP step 1: 최단경로 1→2→4→5 비용=1+2+1=4. 용량 min=2.
흐름 +2 along 1→2→4→5. 비용 += 2*4 = 8.
남은 D=2.
잔여: 1 ─(1,1)─→ 2 ─(0,2)─→ 4 ─(1,1)─→ 5
←(2,-1) ←(2,-2) ←(2,-1)
step 2: 최단경로 1→2→3→5 비용=1+0+1=2. 용량 min=1.
흐름 +1. 비용 += 1*2 = 2. 누계 10.
남은 D=1.
step 3: 최단경로 1→3→5 비용=3+1=4. 용량 min=1.
흐름 +1. 비용 += 4. 누계 14.
남은 D=0. 종료.
결과 흐름: 2 (1→2→4→5) + 1 (1→2→3→5) + 1 (1→3→5) = 4. 비용 = 14.
그림 7.1 ― Max-Flow Min-Cut 정리의 시각화.
s ─────●─────●─────●─────●───── t
│ │ │ │
● ● ● ●
│ cut │ │ │
───────┼─────┼─────┼─────┼─────
▼ ▼ ▼ ▼
Cut 의 용량 = cut 가로지르는 간선들의 용량 합.
max-flow = sink 도달 흐름 = ?? Cut 보다 클 수 없음.
Ford–Fulkerson: max-flow 도달 시 cut 가 정확히 그 값. 정리 7.4.
그림 7.2 ― 잔여 그래프 (residual graph).
원본: 잔여:
cap=5 cap_f = cap - flow → forward
u ─────────→ v u ─────→ v
flow=3 flow → reverse (used capacity)
←──── v
예: cap=5, flow=3. 잔여:
u →cap_f=2→ v (앞으로 더 보낼 수 있음)
u ←cap_r=3← v (역방향 = 이미 보낸 흐름 취소)
비용:
원본 c(u,v) → 잔여 c_f(u,v) = c(u,v) (forward)
→ 잔여 c_r(v,u) = -c(u,v) (reverse: 비용 *되돌림*)
Network. G = (V, E) 방향 그래프. 두 정점 s (source), t (sink). 각 간선 e = (u, v) 에 capacity c(e) ≥ 0 와 cost a(e) ∈ ℝ.
Flow. f : E → ℝ_{≥0} 가 흐름 이란, (1) capacity constraint 0 ≤ f(e) ≤ c(e), (2) flow conservation Σ_{e in} f(e) = Σ_{e out} f(e) for all v ∉ {s, t}.
Flow value. |f| = Σ_{e out of s} f(e) - Σ_{e in to s} f(e).
Flow cost. cost(f) = Σ_e a(e) · f(e).
Max-flow. f 가 max-flow 란, |f| 최대. Min-cost (max-)flow. required flow value D 를 만족하는 흐름 중 cost 최소.
Cut. S ⊂ V, s ∈ S, t ∉ S. cut(S) 의 용량 = Σ_{(u,v) ∈ E, u ∈ S, v ∉ S} c(u, v).
Residual graph. G_f = (V, E_f). 원본 간선 (u, v) 에 대해, f(u,v) < c(u,v) 이면 forward residual edge (u, v) with capacity c(u,v) - f(u,v), cost a(u,v). f(u,v) > 0 이면 reverse residual edge (v, u) with capacity f(u,v), cost -a(u,v).
왜 이 보조정리들이 필요한가. 우리가 §6에서 증명할 것은 (1) Max-Flow Min-Cut 정리 (Ford–Fulkerson 1956), (2) SSP의 정확성. 두 정리의 핵심 도구가 augmenting path 와 negative cycle — 같은 동전의 두 면.
보조정리 7.1 (Flow Decomposition).
어떤 흐름
f도s→t경로 흐름들 과 사이클 흐름들 의 합으로 분해 가능. 분해의 경로/사이클 수는O(V+E).
증명 스케치. f(e) > 0 인 간선들의 부분 그래프 위에서 재귀적으로 경로/사이클 찾기. 각 추출이 최소 한 간선의 흐름을 0으로 만들어 종료 보장. ∎
보조정리 7.2 (Augmenting Path Lemma).
f가s→t흐름이고, 잔여 그래프G_f에s→t경로가 있으면,f의 값은 더 증가 가능.
증명. 잔여 경로 P 의 최소 잔여 용량 δ > 0. P 위의 forward 간선은 흐름 +δ, reverse 간선은 흐름 -δ. 결과: flow conservation 유지 (각 중간 정점에서 +δ와 -δ 가 같이 들어옴), |f| → |f| + δ. ∎
보조정리 7.3 (Max-Flow Min-Cut Equality, Ford–Fulkerson 1956).
어떤 흐름
f의 값|f|는 어떤s-tcut 의 용량 이하. 등호는f가 max-flow 일 때만.
증명. 임의의 cut (S, V\S). flow conservation 적용하면 |f| = Σ_{e ∈ cut out} f(e) - Σ_{e ∈ cut in} f(e) ≤ Σ_{e ∈ cut out} c(e) = cap(S). 등호는 forward 가 포화, reverse 가 0 일 때만. 이 조건은 잔여 그래프에서 s 와 t 가 분리 와 동치. ∎
보조정리 7.4 (Negative Cycle and Optimality).
흐름
f가 정해진 값|f|의 min-cost flow 임 ⟺ 잔여 그래프G_f에 음수 비용 사이클이 없음.
증명. (⟸) 음수 사이클 C 가 G_f 에 있으면, 그 사이클 따라 δ > 0 만큼 흐름 재배치 — total cost 가 δ × (cost of C) < 0 만큼 감소. 따라서 f 가 OPT 가 아님. 모순. (⟹) 보조정리 7.1 의 분해로 f^* - f 를 사이클들의 합으로 표현. 각 사이클의 비용이 음수가 아니면 (가정), cost(f^*) ≥ cost(f). ∎
이 보조정리가 Cycle-Canceling 알고리즘의 정확성의 기둥. 음수 사이클이 없을 때 OPT.
그림 7.2ᵇ ― Augmenting path 의 단계별 진행.
초기 흐름 f=0:
s ─(5,1)─→ a ─(3,2)─→ t
│ │
(4,3) (6,1)
│ │
└────→ b ─(2,5)──→ ────┘
augmenting path 1: s→a→t. 잔여 용량 min(5,3) = 3. cost = 1+2 = 3.
흐름 +3. 누적 cost = 3 × 3 = 9.
잔여 그래프:
s →(2,1)→ a →(0,2)→ t (s,a 잔여 2, a,t 포화)
←(3,-2)← (역방향 비용 음수)
s ─(4,3)─→ b ─(2,5)─→ t
(b 경로 미사용)
augmenting path 2: s→b→t. cost = 3+5 = 8. min(4,2)=2.
흐름 +2. 누적 = 9 + 2×8 = 25.
augmenting path 3: s→a→? (a→t 포화). reduced cost로 다익스트라 →
s→a→...→b→t 같은 길 (만약 가능).
...
보조정리 7.5 (SSP Reduced Cost Lemma).
SSP 알고리즘은 매 단계 vertex potential
π : V → ℝ을 유지한다. Reduced costc̃(u, v) = c(u, v) + π(u) - π(v). 모든 간선에 대해c̃(u, v) ≥ 0가 invariant.
증명. 초기 π = 0. c̃ = c. 모든 비용이 비음수 가정 (또는 음수 비용 간선이 있으면 Bellman–Ford 한 번 돌려 적절한 π_0 설정). 매 단계 SSP 가 다익스트라로 shortest path d(·) 계산. 새 potential π_new(v) = π(v) + d(v). 그 결과 c̃ 의 invariant 유지. ∎
이 보조정리가 왜 SSP 가 매 단계 다익스트라를 쓸 수 있는가 의 답. 잔여 그래프에는 음수 비용 reverse 간선 이 있지만, reduced cost 는 비음수 유지 — 다익스트라 작동 보장.
왜 이 정리가 필요한가. 위 보조정리들을 결합해 Ford–Fulkerson + SSP 의 정확성 을 본다.
정리 7.6 (Max-Flow Min-Cut Theorem, Ford–Fulkerson 1956).
어떤 네트워크에서도
max |f| = min cap(cut).
증명. 보조정리 7.3 의 부등식 ≤. 등호 도달의 구성적 증명 — Ford–Fulkerson 알고리즘. 잔여 그래프에서 augmenting path 없을 때 종료. 그 시점 S = {v : v 가 s 에서 잔여 그래프에서 도달 가능}. t ∉ S (도달 불가). 이 S 가 cut 정의. |f| = cap(S). ∎
정리 7.7 (SSP Correctness, Klein 1967, Tomizawa 1971).
SSP 알고리즘이 요구량
D의 흐름을 종료하면, 그 흐름은 min-cost.
증명. SSP 매 단계 현재 잔여 그래프의 최단경로 로 흐름 증가. 이 행동을 다음과 같이 본다. 결과 흐름의 flow decomposition (보조정리 7.1) 은 오직 단순 경로들 의 합 (사이클 없음). 각 경로의 비용 이 그 경로가 추가된 시점의 shortest path 비용. 매 단계 shortest 이므로 모든 경로 비용의 합 이 OPT. 더 자세히 — 정리 7.4 (음수 사이클 없음 = OPT) 와 결합. SSP 종료 시 잔여 그래프에 음수 사이클이 없음 (다익스트라의 reduced cost invariant) → OPT. ∎
증명이 깨지는 가정. 비용 음수 간선 — 다익스트라가 작동 안 함. 해결: Bellman–Ford 로 초기 potential π_0 설정. Capacity 음수 — 정의에 위반. Capacity ∞ — 흐름이 unbounded 일 수 있음. Demand D > max-flow — infeasible.
정리 7.8 (Ford–Fulkerson Complexity).
Ford–Fulkerson 알고리즘의 worst-case 시간은
O(E · |f^*|). 정수 capacity 가정.
증명. 각 augmenting path 가 흐름을 최소 1 증가 (정수 capacity). |f^| 회 반복. 각 반복 = BFS/DFS O(V+E). 총 O(E · |f^|). ∎
이 결과의 문제: |f^| 가 입력 크기에 비례하지 않을 수* 있음 — 큰 수 일 수 있음. 따라서 pseudo-polynomial. 무리수 capacity 면 수렴 보장 없음.
정리 7.9 (Edmonds–Karp Polynomial Bound).
Augmenting path 를 BFS 의 shortest path (간선 수 기준) 로 선택하면, 총 augmentation 수는
O(VE). 시간O(VE²).
증명. Edmonds–Karp 의 핵심 보조정리 — shortest path 의 길이는 단조 비감소. 그리고 각 길이에서의 augmentation 수 O(E). 총 length range O(V), 총 augmentation O(VE). 각 augmentation BFS O(V+E). 합 O(VE²). ∎
정리 7.10 (SSP Complexity).
SSP 알고리즘의 시간은
O(D · (V+E) log V)(정수 demandD). 각 augmenting path = Dijkstra.
증명. 매 augmenting path 가 흐름 최소 1 증가. D 회. Dijkstra O((V+E) log V). 총 O(D · (V+E) log V). ∎
이 결과도 D 의존 — pseudo-polynomial. strongly polynomial 변형은 capacity scaling (Edmonds–Karp 1972 의 후속 변형) 으로 O(E² log U log V) (U = max capacity).
정리 7.11 (Goldberg–Tarjan 1989, Cycle-Canceling Strongly Polynomial).
Minimum mean cycle canceling (사이클 중 평균 비용이 가장 작은 것을 매번 선택) 는 strongly polynomial
O(V³E² log²V).
증명 개요. Goldberg–Tarjan 1989 JACM 의 정밀한 분석. mean cycle 이 단조 증가 (= 점점 덜 음수) 를 보임. 자세한 case analysis 4 페이지. ∎
현대의 최선. Orlin (2013, STOC) 이 max-flow 의 O(VE) 알고리즘 — 60년 만의 worst-case 최선 가능 알고리즘 가능성. min-cost flow 도 비슷한 향상. 그러나 상수 인자 가 커서 실용에서는 Network Simplex (Dantzig 1963) 가 여전히 표준.
(a) Ford–Fulkerson + DFS. 가장 단순. Pseudo-polynomial.
(b) Edmonds–Karp. BFS based. O(VE²).
(c) Dinic's algorithm. Layered network + blocking flow. O(V²E). 1970년대.
(d) Push-relabel (Goldberg–Tarjan 1988). Preflow + local push/relabel. O(V²E) 또는 O(V³).
(e) Klein's Cycle-Canceling (1967). Pseudo-polynomial.
(f) Goldberg–Tarjan Minimum Mean Cycle (1989). Strongly polynomial.
(g) Network Simplex (Dantzig 1963). Linear Programming 의 Simplex method 의 network 특수화. 실용 최강.
(h) Cost scaling (Goldberg–Tarjan 1990). Min-cost flow 의 strongly polynomial O(V²E log VC).
(i) Orlin's enhanced capacity scaling (1993). O((E log V)(E + V log V)).
그림 7.3 ― Min-Cost Flow 알고리즘 가계도.
Ford–Fulkerson (1956)
Max-Flow Min-Cut
│
┌──────────┼──────────────┐
▼ ▼ ▼
BFS path DFS path Cost-aware
Edmonds- Dinic Klein 1967
Karp 1972 (1970) cycle-cancel
│ │
▼ ▼
Push-Relabel SSP (Tomizawa 1971)
Goldberg-Tarjan │
(1988) │
▼
Goldberg-Tarjan
min mean cycle
(1989) strongly poly
│
▼
Orlin (2013)
near-linear
그림 7.3ᵇ ― LP Duality 의 그림.
Min-Cost Flow 의 LP:
min Σ cost(e) · f(e)
s.t. Σ_{e in} f(e) - Σ_{e out} f(e) = demand(v) for all v
0 ≤ f(e) ≤ capacity(e)
LP Dual:
max Σ demand(v) · π(v) - Σ capacity(e) · y(e)
s.t. π(v) - π(u) - y(u,v) ≤ cost(u,v) for all e=(u,v)
y(e) ≥ 0
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Strong Duality 정리 (LP):
Primal OPT = Dual OPT.
Complementary Slackness (CS):
f^*(e) > 0 ⟹ π^*(u) - π^*(v) - y^*(e) = cost(e) (tight)
f^*(e) < capacity(e) ⟹ y^*(e) = 0
SSP 의 reduced cost = π^*(v) - π^*(u) - cost(u,v).
CS 가 OPT 의 *알고리즘적 인증서*.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
그림 7.4 ― 알고리즘별 복잡도 표.
알고리즘 max-flow min-cost flow
─────────────────────────────────────────────────────────
Ford-Fulkerson O(Ef*) —
Edmonds-Karp O(VE²) —
Dinic O(V²E) —
Push-Relabel O(V²E) ~ O(V³) —
Klein cycle — pseudo-poly
SSP (Tomizawa) — O(D · Dijkstra)
Goldberg-Tarjan mean — O(V³E² log²V) SP
Network Simplex — excellent in practice
Orlin 2013 O(VE) near-linear
─────────────────────────────────────────────────────────
Ford–Fulkerson 1956 Canadian J. Math. 8 의 6 페이지. 매우 짧고 농축. 두 저자 모두 RAND Corporation. 알고리즘 + 정리 + 증명 이 6 페이지 안에.
§1 Introduction 에서 미군 군수 물자 흐름의 응용을 설명. Tolstoi (1930) — 소비에트 철도 차단 분석 — 도 짧게 언급. 역사적 첫 다른 출처. 두 진영 (미국, 소련) 의 독립적 도달.
§2 Definitions and Theorem. Max-Flow Min-Cut 정리의 statement. 증명은 §3.
§3 Algorithm. 잔여 그래프 + augmenting path. labeling procedure 라는 용어 사용 — 오늘날의 augmenting path 알고리즘. 수렴 보장 은 정수 capacity 가정에서만 명시.
§4 Applications. 운송, 매칭, 최대 컷 (cut 의 대칭 인 최소 컷) — 모두 max-flow 로 환원.
논문의 어조는 실무적. 정리의 깊은 의미 — Linear Programming Duality 의 한 사례 — 는 1960년대에 정립. 1962년 Dantzig–Fulkerson 의 Linear Programming and Extensions 의 한 장에서 명시.
Edmonds–Karp 1972 JACM 19:2 의 17 페이지. 정밀한 분석. BFS path 의 shortest 사용이 핵심 트릭. 각 단계의 진보를 정량화 — 길이 단조 비감소.
Lester Randolph Ford Jr. (1927–2017). 미국 수학자. Vanderbilt 박사. RAND Corporation (1955~1965), University of Illinois (1965~). 부친 Lester R. Ford Sr. 도 유명 수학자 (Ford circles의 그것). Ford–Fulkerson 알고리즘 과 Bellman–Ford 알고리즘 양쪽에 이름. 1956년 Bellman–Ford 의 Network flow theory RAND P-923 도 그의 작업.
Delbert Ray Fulkerson (1924–1976). 미국 수학자. UW Madison 박사 (1951). RAND (1951~1966), Cornell (1966~1976). combinatorial optimization 의 한 시대를 만든 인물. 1956 Max-Flow Min-Cut, 1962 Flows in Networks (Ford 와 공저, 운영연구의 고전), 1972 Fulkerson Prize 가 그의 이름으로 — 이산 수학의 가장 큰 상 중 하나. 52세 자살로 작고.
Jack Edmonds (3장 §10 참조). 1972년 Karp 와의 공저 JACM 논문이 다항 시간 알고리즘 분야 의 형식화 의 한 자리.
Richard M. Karp (1935~현재). 하버드 박사 (1959). UC Berkeley (1968~). 1985 Turing Award. NP-completeness 의 21 문제 (1972) 외에도 probabilistic algorithms, DNA computing. 1990년대 human genome project 의 알고리즘 지원에도 참여.
Morton Klein. Columbia University. 운영연구학자. 1967 Cycle-Canceling 가 그의 가장 유명한 결과. 그 외에 transportation 과 assignment 문제의 다양한 변형 연구.
Andrew V. Goldberg (1960~). Stanford 박사 (1987). Microsoft Research, Amazon. push-relabel (1988) 과 cost scaling (1989) 의 저자. Tarjan 의 학생.
Expert 7번 — 교통 — 의 풀이.
1. 그래프 모델링. 도로 = 간선, 교차로 = 정점. 각 도로에 용량 (시간당 최대 통과) + 비용 (이동 시간 + 연료). source = 출발지, sink = 목적지. 2. 요구량 D = 보낼 차량 수. 3. SSP 실행. 매 단계 다익스트라 (1장) 로 최단 비용 경로 찾기, 흐름 +최소 잔여 용량. D 도달까지. 4. 시간 변화 대응 (옵션). 시간대별 도로 용량이 다르면 — multi-layer network 로 시간 차원 추가. 각 시간 layer = 별도 정점 집합, layer 간 시간 흐름 간선.
다익스트라 (1장) 와의 직접 연결. 7장의 SSP 매 단계가 1장의 다익스트라 한 번. 6장의 BFS 가 Edmonds–Karp 매 단계. 책의 기초 도구 가 고급 도구의 부품 으로 재사용. 알고리즘 책의 연속성.
3장 (Greedy Exchange) 와의 연결. Min-Cost Flow 의 LP 듀얼 = combinatorial 구조의 polyhedral 분석 = Edmonds 1971 의 polymatroid 의 자연스러운 결과. SSP 의 정확성은 exchange argument 의 한 사례 — currently shortest path 를 사용해도 OPT 보장.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/07-traffic.html
왜 이 장이 책 전체에서 특별한가. Min-Cost Flow 는 조합 최적화의 황금 이다. 1장 (Dijkstra), 6장 (BFS), 3장 (Greedy Exchange), 10장 (Hungarian) — 모두 그 안에 내장 된다. 그 모든 도구가 합쳐져 MCF 의 알고리즘 풀이 가 된다. 7장을 읽고 나면 조합 최적화의 큰 그림 의 한 풍경이 보인다. 알고리즘 책의 한 마디 — 흩어진 결과들이 한 자리에 모이는 자리.
LP duality 의 깊은 의미. Max-Flow Min-Cut 정리는 수학적으로 LP Strong Duality 의 한 사례. 1947년 Dantzig 의 Simplex method 와 1951년 LP Duality Theorem 이 추상적 정리 로 자리잡힌 후, 1956년 Ford–Fulkerson 이 그 정리의 조합론적 사례 를 발견. 두 거인 — 추상 LP 이론 과 조합론적 알고리즘 — 이 한 자리 에서 만남. 이후 1960~70년대의 combinatorial optimization 의 모든 결과는 이 한 자리 에서 가지를 친다.
현대 응용. Min-Cost Flow 의 직접 응용 — 항공사 crew scheduling, 통신 band allocation, 이미지 segmentation (graph cut), 컴퓨터 비전의 stereo matching. 한 알고리즘이 반세기 동안 수많은 분야의 기둥 이 됨. 1956 Ford–Fulkerson 이 알았던 응용 은 군수 물자 하나였지만, 21세기에는 수십 분야 의 핵심 도구.
LP 와의 통합 — 1980년대. Edmonds 의 1970 polymatroid 이론 (3장 §10 의 그것) 이 흐름 문제 와 조합 최적화 를 Linear Programming 의 기하 와 통합. 그 결과 — 1980년대의 Lovász, Schrijver, Grötschel 의 Ellipsoid method 의 조합론적 응용 — 이 NP-난해 가능성 의 정밀한 그림을 만든다. 한 분야 (MCF) 가 조합 최적화 전체 의 대표 사례 가 된 셈.
Tolstoi 1930 의 잊혀진 시작. Andrei Tolstoi (1900~1980) — 소비에트 운영연구학자 — 가 1930년 Transportation Planning 학술지에 철도 차단 분석 논문을 발표. 이것이 Max-Flow Min-Cut 의 역사적 첫 등장. 그러나 소련 학술지 였고 영어 번역이 없었다. 1956년 미국의 Ford–Fulkerson 이 Tolstoi 의 존재를 모른 채 같은 정리를 독립 발견. 1990년대 학술사 연구 에서 두 발견의 일치가 드러남. 냉전 시대의 학술적 분리 의 한 흔적. 같은 정리가 두 진영에서 26년 차이로 독립 발견 된 것 — 수학의 시대적 보편성 을 보여주는 한 사례. 같은 진리에 서로 다른 길 로 도달한 것이 지식의 보편성 의 가장 명확한 증거다 — 알고리즘 이론의 시대초월적 성격 의 작은 풍경.
[FordFulkerson1956]
[EdmondsKarp1972]
[Klein1967]
[Tomizawa1971]
[GoldbergTarjan1989]
[AhujaMagnantiOrlin1993]
[Dantzig1963]
[CLRS2022]
[Orlin2013]
전체 항목은 bibliography.md.
뜨거우면 망설이지 않는다. 식어가면서 점점 보수적이 된다. 결국, 더 이상 움직이지 않을 때 — 안식.
"By analogy with this physical process, we developed an algorithm to find the minimum of a function with many variables ... slow cooling allows the system to find a global minimum, just as slow cooling of a metal produces a perfect crystal." — Scott Kirkpatrick, C. D. Gelatt Jr., M. P. Vecchi, Optimization by Simulated Annealing, Science 220 (1983), p. 671.
| 항목 | 값 |
|---|---|
| Expert № | 08 |
| 주연 | Simulated Annealing (Kirkpatrick–Gelatt–Vecchi, 1983) |
| 조연 | Metropolis–Hastings (1953/1970), Threshold Accepting, Parallel Tempering, Quantum Annealing, Geman–Geman 수렴 정리 |
| 원논문 | Kirkpatrick et al. (1983). "Optimization by Simulated Annealing." Science 220: 671–680. |
| 대표 교과서 | Aarts–Korst (1989), CLRS 부록, Glasserman Monte Carlo Methods |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
우주선이 한 행성에서 다른 행성으로 가야 한다. 직선 거리는 멀고, 도중에 여러 중간 행성 의 중력을 이용해 swing-by 로 가속을 받는다. 어느 행성을 어느 순서로 들를지, 각 행성에서 얼마나 머물지, 언제 부스터를 점화할지 — 수많은 변수가 전체 임무 비용 (연료, 시간) 을 결정한다. 변수의 수가 수십, 수백 개. 변수 사이의 비선형 상호작용. 미분 가능 여부도 보장 안 됨. 미분 도구는 통하지 않고, 그리디는 함정에 빠지고, 로컬 서치 (2장) 는 국소 최적 에서 갇힌다.
이런 자리에서 — 국소 최적에서 빠져나오는 도구 — 가 필요하다. 그 도구의 이름이 Simulated Annealing (SA). 담금질 모사. 1983년 Scott Kirkpatrick 과 IBM 의 동료들이 Science 학술지에 발표. 알고리즘의 영감 은 물리학에서 — 금속의 결정 형성. 뜨거운 쇠를 천천히 식히면 원자들이 낮은 에너지 상태 로 재배열되어 완벽한 결정 이 생긴다. 빠르게 식히면 결함 많은 상태 (유리 glass) 에서 멈춘다. 이 물리적 직관 을 최적화 알고리즘 으로 옮긴 것이 SA.
알고리즘의 행동 은 다음과 같다. 현재 해 s 에서 이웃 해 s' 를 랜덤하게 제안. s' 가 더 좋으면 항상 채택. s' 가 더 나쁘면 — 확률적으로 채택. 확률은 exp(-Δ/T) 로 — Δ 는 비용 차, T 는 온도. T 가 높으면 (뜨거우면) 어떤 나쁜 이동도 거의 항상 받아들임 — 무작위 탐색. T 가 낮으면 (식었으면) 작은 향상만 받아들임 — 그리디. 그 사이를 천천히 변화 시키며 — 전역 최적의 분지 에 자리잡도록 유도.
여기서 마법 의 부분. Geman–Geman 1984 정리 — 온도가 충분히 천천히 식으면 SA는 확률 1로 전역 최적에 수렴. 수렴 보장이 있는 무작위 탐색 알고리즘. 그러나 "충분히 천천히" 의 정량적 답이 너무 느림 — T(k) ≥ C / log(k+2) 정도. 이 대수적 식음 속도는 실용에서 너무 느림. 실용에서는 지수적 식음 (T(k) = T_0 · α^k, α ≈ 0.99) 을 쓰며 수렴 보장 없이 경험적 좋은 해 를 얻는다. 이론과 실용의 균열 의 한 사례.
Expert 8번 — 우주선 — 의 풀이는 SA 의 직접 응용. 우주선의 모든 결정 변수를 상태 s 로, 임무 비용 을 energy c(s). 이웃 = "한 변수만 작게 바꾼 상태". 온도 식음을 지수적 으로. 이 단순한 알고리즘 이 — 수십 변수의 비선형 최적화 에서 — 그리디나 로컬 서치보다 훨씬 좋은 해 를 짧은 시간에 만든다.
1953년 Los Alamos. 핵 연구 시설. 다섯 명의 물리학자 — Nicholas Metropolis (그리스계 미국인), Arianna Rosenbluth (수학자, 여성), Marshall Rosenbluth (물리학자, 남편), Augusta Teller (수학자, 여성), Edward Teller (수소폭탄의 아버지) — 가 Journal of Chemical Physics 21권에 6 페이지짜리 논문 Equation of State Calculations by Fast Computing Machines 를 발표한다. 이 논문이 Metropolis algorithm 의 출생 — Markov chain Monte Carlo (MCMC) 의 시작. 그 알고리즘이 30년 뒤 Simulated Annealing 의 핵심 부품이 된다.
Metropolis 알고리즘의 원래 문제 는 통계역학. 입자 시스템의 평형 분포 를 컴퓨터로 시뮬레이션. Boltzmann distribution — P(state) ∝ exp(-E(state)/kT) — 에서 샘플을 뽑는 방법. 알고리즘은 다음과 같다. 현재 상태 s 에서 무작위 이웃 s' 제안. Δ = E(s') - E(s) 계산. Δ ≤ 0 이면 받아들이고, Δ > 0 이면 확률 exp(-Δ/kT) 로 받아들임. 무한 단계 반복하면 분포가 Boltzmann 에 수렴.
이 알고리즘은 1953년 MANIAC 컴퓨터 — Los Alamos 의 첫 컴퓨터 중 하나 — 에서 Arianna Rosenbluth 가 프로그래밍. 그녀는 그 시점에 5명 저자 중 유일한 여성 프로그래머. 알고리즘이 오늘날의 모든 MCMC 의 기초가 됨. 그녀의 이름이 Metropolis algorithm 에 잘 등장하지 않는 것은 역사의 한 부정의. 1986년 W. K. Hastings 가 Metropolis 알고리즘을 비대칭 proposal 로 일반화 — Metropolis–Hastings 의 두 번째 이름이 Hastings 가 됨. Biometrika 1970년.
1983년 IBM T. J. Watson Research Center. Scott Kirkpatrick, C. Daniel Gelatt Jr., Mario P. Vecchi — 세 IBM 연구원이 VLSI 회로 설계의 placement 문제에 Metropolis 를 응용하는 아이디어를 발표. Science 220권 (1983년 5월 13일자). 10 페이지짜리. Simulated Annealing 이라는 이름은 그들이 처음 붙임. 물리적 담금질 (annealing) 을 모사 (simulate) 하는 것. 그 시점까지 Metropolis algorithm 은 물리학 도구. KGV (Kirkpatrick–Gelatt–Vecchi) 가 그것을 최적화 알고리즘 으로 전이.
Science 논문은 대히트 가 된다. 발표 후 5년간 수천 편의 후속 논문. VLSI 설계, 외판원 문제, 유전자 알고리즘과의 비교, 학습이론. 1985년 Vladimír Černý — 슬로바키아 물리학자 — 가 독립적으로 같은 알고리즘을 TSP 에 적용. KGV 와 Černý의 각자 독립 발견 으로 SA 가 서로 다른 진영 에서 자리잡음.
같은 1984년 Stuart Geman 과 Donald Geman (형제, 둘 다 Brown University) 이 IEEE Trans. PAMI 에 Stochastic Relaxation, Gibbs Distributions, and the Bayesian Restoration of Images 라는 28 페이지짜리 논문 발표. 여기서 SA 의 수렴 정리 — log-rate cooling 이면 확률 1로 전역 최적 — 가 처음으로 엄밀히 증명. 이미지 복원의 응용도. 베이지안 통계 의 부상의 한 출발점.
SA 의 의사코드.
algorithm SimulatedAnnealing(initial s_0, cost c, neighborhood N, schedule T):
s = s_0
T = T_initial
best = s_0
k = 0
while T > T_min:
s' = random element from N(s)
delta = c(s') - c(s)
if delta <= 0:
s = s' # 항상 받아들임 (향상)
else:
if random_uniform(0, 1) < exp(-delta / T):
s = s' # 확률적 받아들임 (악화)
if c(s) < c(best):
best = s
T = T * alpha # 또는 다른 schedule
k = k + 1
return best
핵심 세 매개변수:
T_initial: 초기 온도. 보통 임의 이동의 평균 Δ 의 10~100배.T_min: 종료 온도. exp(-Δ_typical / T_min) ≈ 0.001 정도.alpha: 식음 속도. 보통 0.95~0.999.SA 의 세 동작 모드:
(a) 고온 (T → ∞): exp(-Δ/T) → 1. 어떤 이동도 받아들임. 무작위 탐색.
(b) 저온 (T → 0): exp(-Δ/T) → 0. 향상만 받아들임. 순수 로컬 서치 (2장).
(c) 중간 온도: 어떤 비향상은 받아들이고 어떤 것은 거부. 분지 사이 이동 가능. 국소 최적 탈출.
그림 8.1 ― SA 의 상태 공간 위 점프 시각화.
비용 (energy)
┃ ↑ 분지 1의 능선
┃ ╱╲ (높이 H)
┃ ╱ ╲ ╱╲
┃ ╱ ╲ ╱ ╲
┃ ╱ ╲ ╱ ╲ ╱╲
┃────╱────────╲────────╱──────╲──╱──╲──── ◄ 현재 위치 (분지 1)
┃ ╲ ╱ ╲╱ ╲
┃ ╲ ╱
┃ ╲ ╱ ▼ 전역 최적
┃ ╲╱ (가장 깊은 분지)
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 해 공간
고온: 능선을 *쉽게 넘음* — 분지 1 ↔ 분지 2 ↔ 분지 3 모두 가능.
저온: 능선을 *못 넘음* — 현재 분지에 *갇힘* (= 로컬 서치).
온도 천천히 식음: *얕은 분지에서 깊은 분지로 천천히 이동*, 마지막에 *깊은 분지 안에 안정*.
그림 8.2 ― 받아들임 확률의 곡선.
P(accept) = exp(-Δ / T)
1.0 ┃●─●─● T 큼:
┃ \ \ 거의 모든 이동 받아들임
0.8 ┃ \ \ \
┃ \ \ \
0.5 ┃ ● \ \
┃ \ \
0.2 ┃ \ \
┃ ● \
0.0 ┃ ●─────●─●──● T 작음:
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 향상만 받아들임 (그리디)
0 Δ_small Δ_typical Δ_large Δ
작은 예시 — 4-도시 TSP. 도시 A(0,0), B(1,0), C(1,1), D(0,1). 거리 = 격자 거리.
tour 1: A-B-C-D-A. 비용 = 1+1+1+1 = 4. (정사각형)
tour 2: A-B-D-C-A. 비용 = 1+√2+1+√2 ≈ 4.83. (X 자)
tour 3: A-C-B-D-A. 비용 = √2+1+√2+1 ≈ 4.83. (또 다른 X)
SA 시작 tour 2 (X 자, c=4.83). 온도 T=10.
neighborhood = 2-opt swap. 가능한 이웃 3개 (각 swap).
step 1: random swap → tour 1 (둘레, c=4). Δ = -0.83. 자동 받아들임. s=tour1.
step 2: random swap → tour 2 (X, c=4.83). Δ = +0.83. exp(-0.83/10) = 0.92. random 0.5 < 0.92 → 받아들임. s=tour2.
... (고온에서 이리저리)
온도 식음 T = T × 0.9, ..., T < T_min = 0.01.
저온 단계: 향상만 받아들임. tour 1 (둘레) 에 자리잡고 종료.
global OPT = tour 1. SA 가 찾음. □
State space. 유한 (또는 셀 수 있는) 상태 집합 S.
Energy / Cost. c : S → ℝ. 최소화 목표.
Neighborhood. N : S → 2^S. 보통 대칭 (s' ∈ N(s) ⟺ s ∈ N(s')).
Proposal distribution. q(s' | s) > 0 for s' ∈ N(s). 균등 분포가 보통.
Acceptance probability. A(s, s') = min(1, exp(-(c(s') - c(s))/T)). Metropolis criterion.
Cooling schedule. T(k) = k번째 단계의 온도. 일반적으로 비증가 함수.
Markov chain. SA 의 상태 변화는 Markov chain — 다음 상태가 현재 상태와 온도 에만 의존.
왜 이 보조정리들이 필요한가. 우리가 §6에서 증명할 것은 (1) Metropolis criterion 이 Boltzmann distribution 을 stationary distribution 으로 가짐 (= detailed balance). (2) 충분히 느린 식음 에서 SA 가 확률 1로 전역 최적에 수렴 (Geman–Geman). 두 정리의 핵심이 detailed balance 와 ergodicity.
보조정리 8.1 (Detailed Balance).
Metropolis criterion 하에서, 분포
π(s) ∝ exp(-c(s)/T)는 detailed balance 를 만족한다 —π(s) · P(s → s') = π(s') · P(s' → s).
증명. 대칭 proposal (q(s'|s) = q(s|s')) 가정. 전이 확률 P(s → s') = q(s'|s) · A(s, s').
WLOG c(s) ≤ c(s') (둘 중 하나가 더 작다고). A(s, s') = exp(-(c(s')-c(s))/T), A(s', s) = 1.
π(s) · P(s → s') = e^{-c(s)/T} · q · e^{-(c(s')-c(s))/T} = e^{-c(s')/T} · q. π(s') · P(s' → s) = e^{-c(s')/T} · q · 1 = e^{-c(s')/T} · q.
두 식 같음. ∎
이 보조정리가 Metropolis criterion 의 수학적 정당화. 왜 exp(-Δ/T) 인가 의 답.
보조정리 8.2 (Stationary Distribution).
Detailed balance 가 성립하고 chain 이 ergodic (irreducible + aperiodic) 이면, 그 chain 의 stationary distribution =
π(s) ∝ exp(-c(s)/T)(Boltzmann distribution).
증명. 표준 Markov chain 결과. detailed balance → stationarity: Σ_{s} π(s) P(s → s') = Σ_{s} π(s') P(s' → s) = π(s'). ∎
보조정리 8.3 (Low Temperature Concentration).
T → 0으로 갈 때, Boltzmann distributionπ_T는 전역 최적 집합 위에 집중 된다 —lim_{T → 0} π_T(s) = 1/|argmin c|ifs ∈ argmin c, else0.
증명. π_T(s) ∝ exp(-c(s)/T). c(s) > c_min 이면 exp(-c(s)/T) / exp(-c_min/T) = exp(-(c(s) - c_min)/T) → 0 as T → 0. 정규화 후 비-OPT 의 확률 → 0. ∎
그림 8.2ᵇ ― Detailed Balance 의 시각적 직관.
두 상태 s, s' 사이의 전이:
P(s → s')
s ───────────→ s'
⇆ ⇆
P(s' → s)
Detailed balance:
π(s) · P(s → s') = π(s') · P(s' → s)
π(s) = "stationary 분포에서 s 의 확률"
직관: "한 방향 흐름" = "반대 방향 흐름" → 평형
Markov chain 의 *시간 역행 가능* (reversibility).
π(s) ∝ exp(-c(s)/T):
낮은 비용 → 높은 확률 (지수적)
T 큼 → 모든 상태 비슷한 확률 (균등)
T 작음 → 최저 비용 상태에 집중 (Dirac)
보조정리 8.4 (Cooling Schedule Critical Bound).
SA 의 수렴을 위한 충분 조건 은
T(k) ≥ Γ / log(k + 2), 여기서Γ는 최대 분지 깊이 (= 어떤 두 국소 최적 사이의 최소 능선 높이).
증명 스케치. Geman–Geman 1984 의 핵심 결과. 분지 사이 이동 시간 의 lower bound 가 exp(Γ/T). log-cooling 이 이 시간을 unbounded 로 만들면서도 총 시간이 유한 하게 만드는 임계점. 자세한 증명은 Geman–Geman §5 (8 페이지). ∎
이 보조정리가 왜 log cooling 인가 의 답. 그러나 실용에서 log 식음은 너무 느림 — 지수 식음의 현실적 trade-off.
정리 8.5 (SA Convergence, Geman–Geman 1984).
충분히 느린 cooling schedule
T(k) ≥ Γ / log(k+2)아래, SA 는 확률 1 로 전역 최적에 수렴한다 —Prob(s_k ∈ argmin c) → 1ask → ∞.
증명. 보조정리 8.1~8.4 의 결합. 각 고정 온도 T_k 에서 chain 이 Boltzmann distribution π_{T_k} 에 근사적으로 도달. 보조정리 8.3 에 의해 T_k → 0 이면 π_{T_k} 가 OPT 집합 위에 집중. cooling 이 충분히 느려 chain 이 매 온도에서 stationary 에 가까이 도달함을 보조정리 8.4 가 보장. ∎
증명이 깨지는 가정. (1) 유한 상태 공간 — 무한이면 ergodicity 보장 안 됨. (2) 대칭 proposal — 비대칭이면 Hastings correction 필요. (3) log cooling — 더 빠른 cooling 은 수렴 보장 깨짐. (4) Γ 값을 모름 — 실용에서 Γ 미리 모르므로 경험적 cooling 사용, 수렴 없음.
보조정리 8.4ᵇ (Mixing Time Estimate).
고정 온도
T에서 SA chain 이 stationary distributionπ_T에 도달하는 시간 (mixing time) 은O(exp(Δ_max / T) · |S|), 여기서Δ_max는 최대 분지 깊이.
증명 스케치. 분지 사이 이동의 기대 시간 은 능선 높이 의 지수. 모든 상태를 방문 하려면 모든 분지를 한 번씩 — |S| 배. ∎
이 보조정리가 왜 SA 가 느린가 의 정량적 답. 분지 사이 이동이 지수적 으로 비쌈. 그래서 log cooling 이 필요.
정리 8.5ᵇ (Glauber Dynamics Equivalence).
Glauber dynamics —
P(accept) = 1 / (1 + exp(Δ/T))(Fermi-Dirac 형식) — 은 Metropolis criterion 과 질적으로 동일하다 (같은 stationary distribution, 다른 transient).
증명. 두 chain 모두 detailed balance 를 같은 π_T 에 대해 만족. transient (수렴 속도) 가 다를 뿐 — Glauber 가 작은 Δ 에서 더 보수적, 큰 Δ 에서 더 유사. ∎
이 결과의 의미는 Metropolis criterion 의 유일성 없음. 다양한 acceptance rule 이 같은 수학적 행동 을 보임. Glauber 는 Ising model 의 표준, Metropolis 는 최적화의 표준 으로 자리잡음.
정리 8.6 (Threshold Accepting, Dueck–Scheuer 1990).
Threshold Accepting — exp(-Δ/T) 대신 Δ ≤ τ_k 인 이동만 받아들임 — 도 느린 threshold 감소 아래 확률 1 수렴.
증명 개요. Dueck–Scheuer 1990. SA 와 비슷한 분석. 결정적 (확률적이지 않은) 알고리즘이라 실용에서 SA 보다 단순. ∎
정리 8.7 (Per-step Complexity).
SA 의 한 단계는
O(T_neighborhood + T_evaluation)시간. TSP 2-opt 같은 경우O(1)(delta evaluation).
증명. 한 단계 = (1) 이웃 한 개 random 추출, (2) Δ 평가, (3) 받아들임 결정. 각각 일정한 시간. ∎
정리 8.8 (Total Steps).
보장된 수렴을 위한 총 단계 수는 지수 — 정확히
exp(O(Γ × |S|)). 실용 cooling 에서는 경험적.
증명. 보조정리 8.4 의 log cooling 으로 Γ / T_min 단계 필요. T_min ≈ 0 이면 지수 시간. 실용 cooling 은 유한 단계 에 종료 — 보장 없음. ∎
이 결과는 SA 의 본질 을 보여준다. 완벽한 수렴 을 원하면 exponential time. 합리적 시간 을 원하면 수렴 없는 경험적 알고리즘. 두 극단 사이의 조정 이 실용 SA 의 일.
정리 8.9 (Cooling Schedule and Quality Trade-off).
Exponential cooling
T_k = T_0 · α^k의 총 단계 수는log(T_min/T_0) / log(α) = O(log T-range / log α). α = 0.95 면 약 100 단계, α = 0.99 면 약 500 단계.
증명. 단순한 등비수열 계산. ∎
하계. SA 가 임의의 NP-난해 문제 에 다항 시간으로 전역 최적 보장 불가능 (P ≠ NP). 근사 보장 — 어떤 비율로 OPT 에 가까운가 — 도 일반적으로 없음. SA 는 경험적 알고리즘. 그러나 경험적으로 우수.
(a) Metropolis–Hastings (Hastings, 1970). 비대칭 proposal 일반화. A(s,s') = min(1, π(s')q(s|s') / π(s)q(s'|s)). Markov chain Monte Carlo 의 표준.
(b) Gibbs Sampling (Geman–Geman, 1984). 각 변수를 차례로 그 조건부 분포에서 샘플링. 베이지안 통계의 표준.
(c) Threshold Accepting (Dueck–Scheuer, 1990). 확률적 대신 결정적 임계값. 구현 더 단순.
(d) Tabu Search (Glover 1986, 2장 참조). 과거 방문 해 금지. 결정적, 메모리 사용.
(e) Parallel Tempering / Replica Exchange. 여러 온도의 chain 을 동시에 운영, 가끔 교환. 다중 분지 탐색에 우수.
(f) Adaptive Cooling. 온도를 해의 분포에 따라 동적으로 조정. Lam–Delosme 1988.
(g) Quantum Annealing. 양자 효과 (tunneling) 를 모사 한 변형. D-Wave 의 양자 컴퓨터에서 실제 양자 annealing 구현. 어떤 문제에서 지수적 가속 가능성.
(h) Variable Neighborhood SA. 여러 이웃 함수를 순서대로 또는 동시에. VNS + SA 의 결합.
그림 8.3 ― SA 가계도.
Boltzmann (1877)
통계역학
│
Metropolis et al. (1953)
MANIAC, 핵 시뮬레이션
│
Hastings (1970)
MCMC 일반화
│
┌─────────────┼──────────────┐
▼ ▼ ▼
Kirkpatrick Geman-Geman Glauber (1963)
Gelatt-Vecchi (1984) Ising 동역학
(1983) SA 수렴 정리
│
┌────┼────┬────────┬──────────┐
▼ ▼ ▼ ▼ ▼
Černý TA PT Adaptive Quantum
(1985)(1990)(1991) Lam-Delosme Annealing
(1988) (1998+)
그림 8.3ᵇ ― Parallel Tempering 의 그림.
여러 chain 을 다른 온도로 동시에:
chain T_high ─→ ● ● ● ● ● ● (고온, 넓게 탐색)
⇅ swap
chain T_mid ─→ ● ● ● ● ● ● (중온)
⇅ swap
chain T_low ─→ ● ● ● ● ● ● (저온, 좁게 정밀)
가끔 (몇 스텝마다) 인접 온도 chain 사이 *swap* 시도:
두 상태의 *energy 차* 가 favorable 하면 swap.
swap 후 chain 의 *온도가 변경* 된 효과.
장점: 다중 분지 동시 탐색.
cold chain 의 결과 = global OPT 의 좋은 근사.
응용: Geyer 1991 (statistical physics), MCMC.
그림 8.4 ― 매개변수 선택 가이드.
문제 특성 T_initial α (cooling) T_min
──────────────────────────────────────────────────────────────
부드러운 landscape 낮음 큰 (0.99) 낮음
거친 landscape (다중분지) 높음 (Δ_max 의 10x) 작음 (0.95) 낮음
시간 예산 적음 평균 Δ × 5 0.9 중간
품질 최고 우선 평균 Δ × 50 0.999 매우 낮음
──────────────────────────────────────────────────────────────
KGV 1983 Science 220:4598 의 10 페이지. 두 칼럼 조판. Science 학술지 — 생명 과학 과 물리 의 대중적 학술지. 알고리즘 논문 이 Science 에 나가는 것은 드문 일. 그래서 영향력이 컸다 — 알고리즘 외 분야 (화학, 생물, 의학) 의 사람들도 읽음.
§1 Optimization and Statistical Mechanics — 이 둘의 연결 을 설명. energy minimization 과 cost minimization 의 수학적 동등성. Boltzmann distribution 이 둘 사이의 다리.
§2 Algorithm and Examples. SA 알고리즘의 의사코드. 두 응용 — VLSI placement (반도체 칩의 회로 요소 배치) 와 Traveling Salesman Problem. 각각의 실험 결과 — SA 가 그리디 + 로컬 서치 보다 수십 % 좋은 해 를 만듦.
§3 Convergence. 이 자리에서 KGV 는 log cooling 의 필요성을 직관적으로 설명. 엄밀한 증명 은 1984년 Geman–Geman 까지 기다림.
§4 Implementation Details. 실용적 매개변수 선택 의 권고. 이 표가 30년이 지나도 실용 SA 의 표준 참고.
§5 Conclusion. 물리학과 최적화의 결합 의 의미. 다른 응용 의 전망 — 유전자 알고리즘, neural networks, combinatorial design. 1983 시점에 AI 의 새 시대 를 예고.
Metropolis et al. 1953 J. Chemical Physics 21:6 는 6 페이지. 통계역학 의 핵심 논문. 알고리즘 자체 는 §2 의 반 페이지 에 정리. 나머지 5 페이지 가 수치 결과 — 2D Lennard–Jones 입자 시스템 의 시뮬레이션. Boltzmann distribution 의 수치적 검증.
Scott Kirkpatrick (1941~). 미국 물리학자. Harvard 박사 (1969, 통계물리). IBM Watson Research Center (1973~2000). 2000년 이후 Hebrew University Jerusalem. 디스크 시뮬레이션, spin glass, complex systems. SA 외에도 Quantum Monte Carlo 의 한 표준 기법.
C. Daniel Gelatt Jr. (1948~2022). IBM Watson Research. VLSI 회로 설계 자동화 의 거장. SA 의 실용 적용 의 한 거인.
Mario P. Vecchi (1944~). 베네수엘라 출생. Caltech 박사. IBM (1976~1990). 이후 Microsoft Research. 반도체 설계 도구 의 권위자.
세 사람 모두 IBM Watson Research Center — 1970~80년대 컴퓨터 과학의 한 황금기 의 한 무대. Bell Labs (2장의 Lin–Kernighan) 와 함께 기업 연구소가 학술적 혁신을 이끈 마지막 시대.
Nicholas Metropolis (1915–1999). 그리스계 미국인. Chicago 대학 박사. Los Alamos (1943~). MANIAC 컴퓨터 (1952) 의 설계자. Monte Carlo method 라는 이름을 처음 만든 사람 (1947).
Arianna W. Rosenbluth (1927–2020). UC Berkeley 박사. Los Alamos (1948~1953). MANIAC 의 첫 프로그래머 중 한 명. Metropolis algorithm 의 실제 구현. 그녀의 기여는 50년 이상 학술적으로 묻혀 있다가 2000년대에 재평가. 컴퓨터 과학 여성사 의 한 잊혀진 자리.
Stuart Geman, Donald Geman. 형제. 둘 다 Brown University. 1984년 IEEE Trans. PAMI 의 공저자. 베이지안 영상 복원과 SA 의 수렴 이론의 수학적 통합. 1980년대 Markov Random Field 의 표준 도구.
Vladimír Černý (1939~). 슬로바키아 출생. Comenius University Bratislava (1969~). 1985년 J. Optimization Theory & Applications 에 thermodynamic TSP 발표 — KGV 1983 과 독립적. 동유럽 (체코슬로바키아) 의 원자력 물리학 그룹에서. KGV–Černý 의 독립 발견 이 SA 가 물리학과 알고리즘의 자연스러운 만남 임을 시대적으로 보증.
Expert 8번 — 우주선 — 의 풀이.
1. 상태 인코딩. 우주선의 모든 결정 변수 (방문 행성 순서, 머무는 시간, 부스터 점화 시점) 를 한 문자열 또는 벡터 s 로. 2. 비용 함수. c(s) = 총 임무 비용 (연료 + 시간). 물리 시뮬레이션 으로 계산 — Lambert 문제 풀이, swing-by 효과 계산 등. 3. 이웃 함수. "한 변수만 작게 변화" — 머무는 시간 ±1초, 점화 시점 ±10초, 방문 순서 두 행성 swap. 4. SA 실행. T_initial = 평균 Δ × 30, alpha = 0.995, T_min = 0.01. 약 1500 단계. 5. 결과. 최선 해 반환. 보장은 없지만 경험적으로 그리디나 로컬 서치보다 훨씬 좋음.
다른 장과의 연결. 2장 (Local Search) 의 국소 최적 함정 을 온도 메커니즘 으로 해결. 19장 (k-means) 의 Lloyd 알고리즘 도 로컬 서치의 일종 — SA 변형 가능. 20장 (Particle Filter) 도 Monte Carlo 기법으로 Metropolis 와 깊은 연결.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/08-spacecraft.html
왜 이 장이 책 전체에서 특별한가. SA 는 물리학과 알고리즘의 만남 의 한 정점. 통계역학의 70년 결과 가 최적화의 도구 로 직접 전이. 알고리즘 이론이 순수 이산수학 의 한계를 넘어 연속 물리학 의 도구를 흡수 한 첫 사례. 이 학제간 융합 의 패턴 — 물리학의 방법 → 알고리즘의 도구 — 이 20장 (Particle Filter) 과 19장 (k-means) 의 EM 알고리즘 에서 반복된다. 한 학제의 도구가 다른 학제의 새 기둥 이 되는 지적 흐름 의 한 그림.
역사의 한 모서리. Metropolis algorithm 이 1953년 MANIAC 컴퓨터 에서 처음 구현 됐을 때, Edward Teller 는 동시에 수소폭탄 설계 작업 중이었다. 컴퓨터 과학 사상 가장 영향력 있는 알고리즘 중 하나 가 핵 폭탄 개발의 부산물 로 탄생했다. 그 알고리즘이 30년 뒤 우주선 궤도 최적화, 50년 뒤 양자 컴퓨터의 핵심 도구가 됨. 기술의 양면성 — 같은 도구가 파괴와 탐험 양쪽에 쓰임 — 의 한 상징.
Quantum Annealing 의 부상. 1998년 Kadowaki–Nishimori 가 Quantum Annealing (QA) 를 제안. 양자 터널링 (tunneling) 이 분지의 능선을 지나가는 대신 통과 한다는 양자역학적 직관. D-Wave Systems 의 2007년 상용 양자 컴퓨터 가 QA 를 물리적으로 구현. 어떤 문제 (특히 Ising-like 형태) 에서 고전 SA 보다 지수적으로 빠름. 그러나 일반 최적화 에서는 아직 명확한 양자 우위 가 보이지 않음. 2020년대 양자 컴퓨팅의 한 활발한 연구 영역.
SA 가 가르치는 한 가지 — 무작위의 미덕. 1장 (Dijkstra) 와 3장 (Greedy Exchange) 의 결정적 알고리즘은 각 단계마다 옳은 선택. SA 는 각 단계마다 잘못된 선택을 받아들이는 것이 전체의 옳음 으로 이어짐. 이 역설 — 작은 무작위가 전체를 최적으로 — 가 모더널 알고리즘 이론의 한 큰 줄기. 19장 (Lloyd k-means) 의 random initialization, 20장 (Particle Filter) 의 importance sampling, Las Vegas 알고리즘, Randomized rounding — 모두 이 작은 무작위의 미덕 의 변주.
SA 와 신경망 학습. 1980년대 후반 neural networks 의 첫 부상기에 SA 와의 유사성 이 강조되었다. Hopfield network (1982) 와 Boltzmann machine (Hinton–Sejnowski 1985) 모두 SA 의 직접적 응용. energy minimization 으로 학습 을 정의. 1990년대 gradient descent 와 backpropagation 이 부상하며 SA 기반 신경망 은 밀려나지만, 2010년대 Restricted Boltzmann Machine 과 deep belief network 의 부활로 다시 등장. Hinton 의 2006 deep learning 부활 의 한 사실 — Boltzmann distribution 의 깊은 학습 적용.
Lam–Delosme 의 adaptive cooling. 1988년 Joe Lam 과 Jean-Marc Delosme (Yale University) 가 온도를 동적으로 조정 하는 SA 변형. 현재 받아들임 비율 을 측정해 너무 낮으면 온도 올림, 너무 높으면 내림. target 받아들임 비율 ≈ 30~50%. 이 adaptive cooling 은 경험적으로 exponential cooling 보다 훨씬 좋음. 그러나 수렴 보장 분석은 더 어려움. Aarts–Korst 1989 의 책이 이 변형을 표준화.
다음 장으로 가는 다리. 9장 (Sweep Line) 은 다시 결정적 알고리즘 의 세계로 돌아간다. SA 의 확률적 무작위 와 대조되는 기하학적 엄밀함. 그러나 두 알고리즘 모두 — 문제 구조 가 알고리즘의 모양 을 결정한다는 공통 원칙. SA 는 비선형 비미분 가능 의 자리, Sweep Line 은 평면 기하 의 자리. 같은 책 안에서 서로 다른 도구 가 각자의 자리 를 점령한다. 알고리즘 책의 다양성 의 한 사례 — 한 문제에 한 도구가 정확히 맞는. SA 의 무작위와 Sweep 의 결정성, 두 극단이 같은 책 안에서 상보적으로 공존하는 것이 21세기 알고리즘 이론의 모습. 도구의 다원성 — 한 분야의 성숙.
[KirkpatrickGelattVecchi1983]
[MetropolisRosenbluthTeller1953]
[Hastings1970]
[GemanGeman1984]
[AartsKorst1989]
[DueckScheuer1990]
[CernyV1985]
[Glauber1963]
전체 항목은 bibliography.md.
평면을 한 칼로 자르며 — 사건을 순서대로 만난다.
"We can solve a geometric problem in the plane by simulating a vertical line that sweeps across the plane from left to right, processing events as they occur." — Michael I. Shamos, Dan Hoey, Geometric Intersection Problems, FOCS (1976).
| 항목 | 값 |
|---|---|
| Expert № | 09 |
| 주연 | Sweep Line (Shamos–Hoey 1976, Bentley–Ottmann 1979) |
| 조연 | Rotating Calipers (Toussaint 1983), Fortune's Voronoi sweep (1987), Convex Hull (Graham 1972, Andrew 1979) |
| 원논문 | Shamos–Hoey (1976). "Geometric Intersection Problems." FOCS. |
| 대표 교과서 | de Berg et al. Computational Geometry (2008), Preparata–Shamos (1985) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
도시 상공의 드론. 수십 대의 드론이 동시에 비행하며, 각각 자기 경로 와 시간 일정 을 가진다. 어느 두 드론 의 경로가 물리적으로 교차 하는지 — 그리고 언제 그 교차가 발생하는지 — 미리 알아야 충돌 회피 가 가능하다. 수십 개 직선 (선분) 의 모든 교차점 을 빠르게 찾는 문제. 단순한 접근 — 모든 쌍 을 검사 — 은 O(n²). n=1000 이면 100만 비교. 매 시점마다 다시 계산해야 한다면 너무 느리다.
이 문제의 우아한 풀이가 Sweep Line. 평면을 수직선 으로 왼쪽에서 오른쪽으로 천천히 쓸어간다. 매 순간 현재 sweep line 이 가로지르는 선분들 의 집합을 상하 순서 로 유지. 이 집합의 변화 가 이벤트 — (1) 새 선분의 왼쪽 끝 (선분 시작), (2) 선분의 오른쪽 끝 (선분 종료), (3) 두 선분의 교차. 이 세 종류의 이벤트만 처리하면 모든 교차점이 보장 발견.
이 아이디어가 Shamos–Hoey 1976 의 Geometric Intersection Problems. n 개 선분의 모든 k 개 교차점을 O((n+k) log n) 시간에 찾는다. 단순 비교의 O(n²) 보다 훨씬 빠름. 1979년 Bentley–Ottmann 이 이 알고리즘을 완성하고 표준화. 이 알고리즘이 계산 기하 분야의 시작점 중 하나. Computational Geometry 라는 분야 자체가 1970년대 후반에 형식화 됨.
Sweep line 의 핵심 자료구조 는 균형 이진 탐색 트리 (BST) — sweep line 이 가로지르는 선분들을 상하 순서로 저장. 이벤트 큐 — 우선순위 큐 (1장 §3 의 그것) — 가 다음 이벤트 시각 을 관리. 두 기본 자료구조 가 이미 잘 알려진 것들 인데도, 그들의 영리한 결합 이 놀라운 결과 를 만든다.
Rotating Calipers 는 다른 종류의 sweep — 회전하는 자 가 볼록 다각형 의 둘레를 시계 방향 으로 돌아간다. Toussaint 1983 이 정리. 볼록 다각형 위의 다양한 문제 — 가장 먼 두 점, 가장 가까운 두 점, 너비, 외접 사각형 — 을 한 번의 회전 으로 모두 풀이. 직선 sweep 와 회전 sweep 의 두 변주가 계산 기하의 두 도구.
Expert 9번 — 드론 — 의 풀이는 Sweep Line + Rotating Calipers 의 결합. 드론 경로의 모든 교차점 을 Sweep 으로 찾고, 드론 군 의 외접 영역 — 비행 안전 구역 — 을 Rotating Calipers 로. 두 알고리즘 모두 시간 또는 각도 라는 한 차원 을 순차적으로 따라가는 공통 골격. 이 순차적 시간 의 도입이 기하 문제의 차원을 한 단계 낮추는 마법.
1970년대 중반 카네기 멜런 대학교 (CMU). Michael Shamos — 25세의 박사 과정 학생, 후일 컴퓨터 보안과 디지털 포렌식 의 거장 — 가 Yale Patt 교수의 지도 아래 계산 기하 라는 새 분야 를 개척. 1975년 그의 박사 학위 논문 Computational Geometry 가 그 분야의 이름을 만든다. 같은 해 Dan Hoey — 같은 CMU 박사과정 — 와 Closest Pair Problem 의 분할정복 알고리즘을 발표 (21장에서 자세히).
1976년 FOCS (Foundations of Computer Science 학술대회). Shamos–Hoey 가 Geometric Intersection Problems 를 발표. 8 페이지짜리. Sweep Line 의 첫 형식적 정의. 선분 교차점 검출 O((n+k) log n), 다각형 사이의 교차 검사, Voronoi 다이어그램의 계산 — 세 응용을 한 자리에서. 계산 기하 의 방법론적 출발점.
1979년 Jon Bentley (CMU) 와 Thomas Ottmann (Karlsruhe 대학교, 독일) 이 IEEE Trans. Computers 에 Algorithms for Reporting and Counting Geometric Intersections 를 발표. 5 페이지짜리. Shamos–Hoey 의 알고리즘을 정교화 하고 분석을 단순화. 오늘날 Bentley–Ottmann 알고리즘 이라 불리는 표준 형태. Bentley 는 k-d tree (1975, Bentley) 와 Programming Pearls 책 (1986) 의 저자. 알고리즘과 자료구조의 우아한 결합 의 대표자.
1983년 Godfried Toussaint (McGill University, 캐나다) 가 IEEE MELECON 학술대회에서 Solving Geometric Problems with the Rotating Calipers 를 발표. 볼록 다각형의 회전 으로 여러 기하 문제를 한꺼번에 풀이. 외부 평행선 한 쌍을 회전시키면서 다각형을 한 바퀴 돈다 — 이 단순한 아이디어로 다이아미터 (diameter), 너비 (width), bounding box, closest pair on hull, Minkowski sum 등 수많은 문제를 모두 O(n) 에 풀이. 기하 알고리즘의 한 시.
1987년 Steven Fortune (AT&T Bell Labs) 이 Voronoi diagram 의 Sweep Line 알고리즘을 발표. Fortune's algorithm. parabolic 곡선의 sweep 으로 Voronoi 의 모든 변을 O(n log n) 에 계산. 이전의 분할정복 O(n log n) 과 같은 복잡도지만 더 단순. 1990년대 이후 Voronoi 계산 의 표준 도구.
Bentley–Ottmann 의 의사코드.
algorithm BentleyOttmann(segments):
EventQueue = PriorityQueue() # (x, type, segment)
SweepStructure = BalancedBST() # sweep line 가로지르는 선분, y 순서
for each segment s:
EventQueue.insert((s.left.x, 'START', s))
EventQueue.insert((s.right.x, 'END', s))
intersections = []
while not EventQueue.empty():
event = EventQueue.extract_min()
if event.type == 'START':
s = event.segment
SweepStructure.insert(s)
above = SweepStructure.successor(s)
below = SweepStructure.predecessor(s)
if above and intersect(s, above):
EventQueue.insert(intersection_event(s, above))
if below and intersect(s, below):
EventQueue.insert(intersection_event(s, below))
elif event.type == 'END':
s = event.segment
above = SweepStructure.successor(s)
below = SweepStructure.predecessor(s)
SweepStructure.remove(s)
if above and below and intersect(above, below):
EventQueue.insert(intersection_event(above, below))
elif event.type == 'INTERSECTION':
(s1, s2) = event.segments
intersections.append(event.point)
SweepStructure.swap(s1, s2)
# 새 이웃과의 교차 검사
above_new = SweepStructure.successor(s2)
below_new = SweepStructure.predecessor(s1)
if above_new and intersect(s2, above_new):
EventQueue.insert(intersection_event(s2, above_new))
if below_new and intersect(s1, below_new):
EventQueue.insert(intersection_event(s1, below_new))
return intersections
복잡도: O((n+k) log n), n = 선분 수, k = 교차점 수.
Rotating Calipers — 다이아미터 계산:
algorithm DiameterRotatingCalipers(convex_polygon P):
# P 는 시계 또는 반시계 방향으로 정렬된 꼭짓점.
i = 0
j = argmax_{k} cross_product_distance(P[k], P[0]-P[n-1]) # 첫 antipodal pair
diameter = distance(P[0], P[j])
for i in 0 to n-1:
while area(P[i], P[i+1], P[j+1]) > area(P[i], P[i+1], P[j]):
j = (j+1) mod n # antipodal pair 이동
diameter = max(diameter, distance(P[i], P[j]))
return diameter
복잡도 O(n) — amortized. 각 꼭짓점이 최대 한 번 씩 antipodal pair 의 일부.
그림 9.1 ― Sweep Line 의 시각화.
시간 t →
╲ ╱
╲ ╱ ┃ sweep line
╲ ╱
╲ ╱
────╲──╱─────── 선분 4개와 sweep line 의 교차점들이
╲╱ sweep structure (BST) 안에서
╱╲ y 순서로 저장.
╱ ╲
╱ ╲ event:
╱ ╲ ● START (선분 시작)
╱ ╲ ● END (선분 종료)
● INTERSECT (두 선분의 교차점)
이벤트 시점에 sweep structure 가 업데이트.
교차 검사는 *인접한 두 선분* 사이에서만.
그림 9.1ᵇ ― Sweep Structure (BST) 의 단계별 변화.
초기: sweep_x = -∞, active_set = {}
event 1: START segment A
sweep_x = A.left.x
active_set = {A} (A의 y 위치만)
event 2: START segment B (B는 A 아래쪽)
sweep_x = B.left.x
active_set = {A, B} (B는 A의 아래 = predecessor)
check: A 와 B 가 교차?
만약 교차하면 INTERSECT 이벤트 queue 에 삽입.
event 3: INTERSECT (A, B)
sweep_x = 교차점.x
active_set 안에서 A 와 B swap (위 아래 순서 바뀜)
검사: B 의 새 위 이웃, A 의 새 아래 이웃 — 새 교차 가능성
event 4: END segment A
active_set 에서 A 제거.
A 의 직전 위 이웃과 직전 아래 이웃이 *새로 인접* — 교차 검사
그림 9.2 ― Rotating Calipers 의 회전.
볼록 다각형: 회전 자 (calipers):
●─────● ╱ ─────── │
╱ ╲ ╱ │ ← 평행한 두 선
● ● ╱ │
╲ ╱ ╱ │
●─────● /─────────────────│
회전:
step 0: 두 평행선이 다각형의 "동서" 두 꼭짓점에 접함.
step 1: 시계 방향 일정 각도 회전. 두 선이 다음 꼭짓점에 접함.
step 2: 또 회전. ...
total: 다각형 한 바퀴 회전 (각도 합 = 2π).
매 단계 두 평행선의 *접점 쌍* 이 antipodal pair.
diameter = 모든 antipodal pair 거리의 max.
Segment. s = [p, q], p, q ∈ ℝ². Endpoint p (왼쪽), q (오른쪽), p.x ≤ q.x.
Intersection. 두 segment s_1, s_2 의 공통 점. 두 선분이 겹치면 무한히 많은 점, 교차하면 한 점, 분리되면 없음.
Sweep line. 수직선 x = t, t 는 시간 매개변수. t 가 작은 값에서 큰 값으로.
Active set / sweep structure. t 시점에 sweep line 이 가로지르는 segment 들의 집합. y 좌표 순서로 정렬된 BST.
Event point. sweep structure 의 변화가 일어나는 시점. 세 종류 — START, END, INTERSECT.
Convex polygon. n 개 꼭짓점의 볼록 다각형. 시계 또는 반시계 정렬.
Antipodal pair. 볼록 다각형의 두 꼭짓점 (P[i], P[j]) 가 antipodal 이란, 어떤 평행선 한 쌍 이 P[i] 와 P[j] 에서 각각 다각형에 접함.
왜 이 보조정리들이 필요한가. §6에서 증명할 두 정리 — (1) Bentley–Ottmann 의 정확성 (모든 교차점 검출), (2) Rotating Calipers 의 정확성 (모든 antipodal pair 방문). 두 정리의 핵심은 invariant 의 정밀한 정의.
보조정리 9.1 (Sweep Line Adjacency).
Sweep Line 알고리즘 동안, 두 segment
s_1, s_2가 교차한다면, 교차 직전 시점 에 두 segment 는 sweep structure 에서 인접 (adjacent in BST order) 하다.
증명. 두 segment 가 교차하기 직전 까지, 그 사이에 다른 segment 가 있을 수 있다. 그러나 교차 사건에 가까워질수록 두 segment 의 y 좌표가 접근. 다른 segment 가 그 사이 에 머무르려면 그 segment 도 교차 사건 을 일으킨다. 그 교차 사건은 우리의 교차 사건보다 먼저 (왼쪽). 그 사건이 처리되면 다른 segment 가 swap 또는 제거. 결과: 우리 교차 사건 직전 두 segment 는 인접. ∎
이 보조정리가 Bentley–Ottmann 의 핵심. 모든 교차가 인접 segment 사이에서 발견됨. 따라서 인접 segment 쌍만 교차 검사 하면 됨 — 모든 쌍이 아니라.
보조정리 9.2 (Event Queue Soundness).
Sweep Line 알고리즘 동안, 모든 교차점 사건 이 발견되기 전에 event queue 에 들어간다.
증명. 보조정리 9.1 에 의해 교차 직전 두 segment 는 인접. 인접 상태가 시작되는 이벤트 (START 또는 INTERSECT 또는 END) 에서 인접 검사 가 트리거 — 두 segment 의 교차가 미래에 있으면 그 교차 이벤트를 queue 에 삽입. 따라서 모든 교차 사건이 제때 queue 에 들어감. ∎
보조정리 9.3 (Rotating Calipers Antipodal Monotonicity).
회전 자
(line_1, line_2)가 시계 방향으로 회전할 때, 두 접점(P[i], P[j])가 둘 다 단조 증가 (반시계 인덱스).
증명. 회전 자가 각도 θ 만큼 회전. 두 평행선의 접점 은 다각형의 볼록성 에 의해 단조 증가. 자세한 기하적 논증은 Toussaint (1983) §3. ∎
이 보조정리가 Rotating Calipers 의 효율성 의 근거. 두 인덱스가 각각 한 바퀴 돌므로 총 작업 O(n).
보조정리 9.4 (Antipodal Pair Property).
볼록 다각형의 두 꼭짓점
(P[i], P[j])가 antipodal ⟺P[i]의 외부 법선 방향 과P[j]의 외부 법선 방향 이 반대 (anti-parallel).
증명. 평행선 두 개가 다각형에 각자 접함 ⟺ 두 접점에서 외부 법선이 평행, 단 반대 방향. 표준 결과. ∎
정리 9.5 (Bentley–Ottmann Correctness, 1979).
Bentley–Ottmann 알고리즘은
n개 segment 의 모든 교차점 을 정확히 출력한다.
증명. 보조정리 9.2 가 모든 교차가 queue 에 들어감 을 보장. 알고리즘이 queue 를 왼쪽에서 오른쪽으로 순서대로 처리하므로 모든 교차가 발견. 중복 검출은 BST 의 swap 단계에서 재확인 으로 방지. 자세한 case analysis 는 Preparata–Shamos (1985) §7.2. ∎
증명이 깨지는 가정. (1) general position — 세 segment 가 한 점에서 만나거나 두 endpoint 가 같은 x 좌표면 특수 처리 필요. (2) 겹치는 segment — 무한 교차점 발생, 별도 처리. (3) 수직 선분 — sweep 평행으로 event 처리 순서 어려움, 별도 처리. 표준 구현 (예 CGAL 라이브러리) 은 이 비-general position 도 처리.
정리 9.6 (Rotating Calipers Correctness, Toussaint 1983).
Rotating Calipers 알고리즘은 볼록 다각형의 모든 antipodal pair 를 방문한다.
증명. 보조정리 9.3 (단조성) 에 의해 두 인덱스가 각각 한 바퀴 돈다. 모든 antipodal pair 가 어떤 회전 각도 에서 발생 — 그 각도가 알고리즘의 어떤 단계 에 대응. 따라서 모든 pair 방문. ∎
정리 9.7 (Diameter via Rotating Calipers).
Diameter(P) = max_{(i,j) antipodal pair} ||P[i] - P[j]||. 즉 diameter 가 어떤 antipodal pair 에서 달성.
증명. 만약 diameter 가 antipodal pair 가 아닌 (P[i], P[j]) 에서 달성된다고 가정. 그러면 평행선 한 쌍이 P[i], P[j] 에 접하지 않음. 그래서 다각형의 다른 꼭짓점이 그 선 너머. 그 꼭짓점이 P[i] 또는 P[j] 보다 먼 거리에 있음 (외부 법선 방향). 모순. ∎
정리 9.8 (Bentley–Ottmann Complexity).
Bentley–Ottmann 의 시간 복잡도는
O((n+k) log n), 공간O(n+k).
증명. Event queue 의 크기 = O(n+k). 각 event 처리 = BST insert/remove/swap = O(log n) + intersection 계산 O(1). 총 O((n+k) log n). ∎
정리 9.9 (Rotating Calipers Complexity).
Rotating Calipers 의 시간
O(n)(다각형이 이미 볼록 + 정렬 이라는 가정).
증명. 두 인덱스 i, j 가 각각 최대 n 번 증가. 매 단계 O(1) 작업. 총 O(n). ∎
볼록 껍질 (Convex Hull) 자체 계산 은 O(n log n) (Graham 1972, Andrew 1979). 따라서 임의 점 집합의 diameter = O(n log n) (CH) + O(n) (Rotating Calipers) = O(n log n).
하계. Diameter 의 하계 Ω(n log n) (element distinctness 환원). 따라서 위 알고리즘이 비교 기반 모델에서 최적.
(a) Fortune's Voronoi sweep (1987). Voronoi diagram 의 sweep 변형. parabolic beach line 이라는 변형된 sweep structure. O(n log n).
(b) Sweep Line for Closest Pair. Closest pair 의 sweep 변형. 21장에서 자세히. O(n log n).
(c) Sweep for Polygon Triangulation. 다각형의 삼각분할 (Triangulation). O(n log n). Seidel 1991 의 randomized O(n log* n).
(d) Andrew's Monotone Chain (1979). Convex Hull 의 sweep 변형. 점들을 x 좌표 정렬 후 상하 chain 을 구성. Graham scan 보다 구현 단순.
(e) Toussaint's variants. Rotating Calipers 의 응용 — width, bounding box, Minkowski sum. 모두 O(n).
(f) 3D sweep. 3차원 plane sweep — 수직 평면이 공간을 쓸어감. 더 어렵지만 가능. O(n² log n) 일반적.
그림 9.3 ― 계산 기하 알고리즘 가계도.
Computational Geometry (1975 Shamos)
│
┌────────────────┼────────────────────┐
▼ ▼ ▼
Sweep Line Divide & Conquer Incremental
(1976 SH) (1975 SH) (1983+)
│ │ │
▼ ▼ ▼
Bentley- Closest Pair Fortune (1987)
Ottmann (1979) (Ch. 21) Voronoi sweep
│
┌────┼────┐
▼ ▼ ▼
Rotating 3D Polygon
Calipers sweep Triangulation
(1983)
그림 9.3ᵇ ― 5개 평면 기하 문제의 공통 도구상자.
문제 기본 도구
──────────────────────────────────────────
선분 교차 sweep line
가장 가까운 점 쌍 (21장) sweep line + 분할정복
볼록 껍질 Graham scan / Andrew
Voronoi 다이어그램 Fortune sweep
다이아미터, 너비, BBOX Rotating Calipers
──────────────────────────────────────────
공통 패턴: "한 차원을 시간으로 매핑, 사건을 순차 처리."
sweep line = 평면을 시간 축으로 통과.
rotating calipers = 평면을 각도 축으로 회전.
그림 9.4 ― 알고리즘별 응용.
알고리즘 응용
──────────────────────────────────────────────────────
Bentley-Ottmann sweep 선분 교차 검출
Fortune sweep Voronoi diagram
Rotating Calipers diameter, width, BBOX
Andrew monotone chain Convex hull
Closest Pair sweep 가장 가까운 두 점
──────────────────────────────────────────────────────
Shamos–Hoey 1976 FOCS 논문은 8 페이지. Foundations of Computer Science 학술대회의 한 정점. Computational Geometry 분야가 형식적으로 시작 된 시점.
§1 Introduction 에서 계산 기하 라는 새 분야 의 문제 카탈로그 — Intersection, Closest Pair, Convex Hull, Voronoi.
§2 Sweep Line Paradigm. 수직선 sweep 의 일반 원칙. event queue + sweep structure 라는 두 자료구조의 결합.
§3~§5 가 구체적 응용. Segment intersection, Voronoi, Polygon intersection. 각각 sweep 의 구체 알고리즘.
Bentley–Ottmann 1979 IEEE Trans. Computers 는 5 페이지. 짧지만 정밀. Shamos–Hoey 의 event 처리 순서 의 모호함 을 명시적으로 해결. 오늘날의 표준 구현 의 원형.
Toussaint 1983 MELECON 은 지중해 학술대회 의 짧은 발표 (4 페이지). 그러나 Rotating Calipers 라는 우아한 도구 의 출발. Toussaint 의 블로그 사이트 에 1980년대의 손글씨 노트가 디지털화 되어 공개.
Michael Ian Shamos (1949~). 미국 컴퓨터 과학자. Vassar College 학사, Princeton 석사, Yale 박사 (1978), CMU 박사 (1985 Computational Geometry). 계산 기하 분야의 창시자 중 한 명. 이후 CMU 교수 (1985~), 컴퓨터 과학 + 법 + 디지털 포렌식 의 거장. Shamos-Hoey 알고리즘 외에도 전자투표 보안 의 권위자. 2000년대 미국 전자투표 시스템 검증 의 표준 위원.
Dan Hoey. Shamos 와 CMU 박사 동기. 1980년대 통신 보안 분야로 옮김. Shamos–Hoey closest pair (1975) 와 FOCS 1976 sweep line 의 공저자.
Jon Louis Bentley (1953~). Stanford 박사 (1976). CMU, Bell Labs (1982~2001), Avaya Labs. k-d tree (1975) 와 Programming Pearls 책 (1986) 의 저자. 간결한 알고리즘 글쓰기 의 한 표준. 1979 Bentley–Ottmann 외에도 Quicksort 분석, bin packing 의 분석.
Thomas Ottmann (1943~2014). 독일 컴퓨터 과학자. Karlsruhe 대학교, Freiburg 대학교 교수. 알고리즘과 자료구조 의 독일 교과서의 권위자. Algorithmen und Datenstrukturen (1990) 의 저자.
Godfried Toussaint (1944–2019). 캐나다 컴퓨터 과학자. UBC 학사, U. British Columbia 박사. McGill (1972~2012), NYU Abu Dhabi (2012~2019). 계산 기하 외에 컴퓨터 음악 의 연구 — 리듬 패턴의 기하학적 분석 (2013 The Geometry of Musical Rhythm 책). 알고리즘과 음악의 융합 의 한 사례.
Steven Fortune (1958~). AT&T Bell Labs (1981~), Bell Labs Research (1996~2007). Fortune's algorithm 외에 robust geometric computation (1990s) — 부동소수점 오차 의 기하 알고리즘에서의 처리.
Expert 9번 — 드론 — 의 풀이.
1. 드론 경로를 선분으로 — 시간에 따라 직선 비행 가정. 2. Bentley–Ottmann sweep 실행. 모든 교차 (= 충돌 가능 지점) 검출 O((n+k) log n). 3. 안전 회랑 계산. 드론들의 현재 위치 집합 의 볼록 껍질 (Convex Hull) 계산 — Graham scan O(n log n). 4. Rotating Calipers 로 hull 의 diameter 와 width 계산. 비행 안전 구역의 크기 추정. 5. 알람 — 교차 직전 일정 시간 안에 두 드론에 경로 변경 명령.
이 풀이의 시간 복잡도 는 O((n+k) log n) + O(n log n) = O((n+k) log n). n=100, k=수십 정도라면 밀리초 단위. 실시간 드론 관제 가능.
다른 장과의 연결. 1장 (Dijkstra) 의 우선순위 큐 가 Bentley–Ottmann 의 event queue 로. 21장 (Closest Pair) 의 분할정복 이 sweep 의 친척 알고리즘. 계산 기하의 기본 도구상자 가 책의 여러 장 에 분산되어 있다.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/09-drone.html
왜 이 장이 책 전체에서 특별한가. 계산 기하 는 알고리즘의 기하학적 측면 을 다룬다. 1~8장의 그래프 + 조합 최적화 와 다른 영역. 그러나 알고리즘 설계 원칙 은 같다 — 문제 구조의 활용, 적절한 자료구조, 정확성 증명, 복잡도 분석. 9장이 계산 기하 입문 의 한 자리.
Sweep Line 의 한 시 — 시간을 통과한 평면. Sweep Line 의 본질은 2차원 정적 문제를 1차원 동적 문제로 변환. 공간의 한 축 을 시간으로 해석 해, 순차적 처리 로 만든다. 이 차원 축소 의 아이디어는 Dynamic Programming (11장의 Bitmask DP) 와 깊이 연결 — 둘 다 문제의 차원을 잘라 쌓는 패러다임. 다른 모양으로 보이지만 같은 마음.
계산 기하의 정밀 산수 문제. 기하 알고리즘에는 부동소수점 오차 의 고질적 문제 가 있다. 두 선분의 교차점 계산에서 0.000001 의 오차 가 교차 판단을 뒤집을 수 있다. 이 문제 — robust geometric computation — 가 1980년대 후반의 큰 연구 영역. Steven Fortune (Voronoi sweep 의 그) 가 1990년대에 exact arithmetic 의 표준화. 오늘날 CGAL (Computational Geometry Algorithms Library) 가 이 exact arithmetic 을 완벽히 구현. 알고리즘이 수학적으로 옳아도 컴퓨터에서 옳게 동작하려면 따로 해야 할 일 이 있다 — 이것이 실용 기하 알고리즘 의 한 교훈.
기하 알고리즘의 응용 — VLSI 부터 로보틱스까지. Bentley–Ottmann sweep 의 응용 — VLSI 마스크의 layer 정렬, 컴퓨터 그래픽의 polygon clipping, GIS 의 지도 overlay, 로봇의 동작 계획, 드론의 경로 충돌 검출. 한 알고리즘이 반세기 동안 수많은 분야의 기둥. Rotating Calipers 도 3D printer 의 노즐 경로 계획, 위성 영상 의 영역 분석 에 사용. 학술적 정리 가 수십 분야의 실용 도구 가 되는 대표 사례.
*왜 sweep* 이라는 단어인가.** 영어 sweep = "쓸어내다, 휩쓸다". 알고리즘의 영감 은 비질하는 빗자루 — 평면을 한 방향으로 쓸어가며 지나가는 것을 모음. 직관적이고 시각적. 같은 패러다임을 처리 (processing), 진행 (advancing) 같은 건조한 용어 로 부를 수도 있었지만, sweep 이라는 생활어 가 알고리즘의 마음 을 더 잘 전달. Shamos 의 1976년 언어 선택 이 오늘날까지 살아있다. 같은 언어의 영향력 은 Dial's bucket (1장 §8), Boltzmann distribution (8장), Greedy exchange (3장) 등 직관적 이름 들에서 반복적으로 보인다 — 좋은 이름이 좋은 알고리즘만큼 중요.
다음 장으로 가는 다리. 10장 (Hungarian) 도 교환 인자 (3장 §6) 를 사용하는 최적 매칭 의 자리. 9장의 기하 와 10장의 조합 매칭 은 각자 다른 영역 같지만 — 같은 최적성 증명의 패턴 을 공유한다. 알고리즘 책의 내부 연결 의 또 한 사례.
[ShamosHoey1976]
[BentleyOttmann1979]
[Toussaint1983]
[Fortune1987]
[Graham1972]
[Andrew1979]
[deBerg2008]
[PreparataShamos1985]
전체 항목은 bibliography.md.
노동자와 일을 짝지어 — 두 헝가리 수학자의 30년의 노트가 영원한 정리가 된 자리.
"The method is essentially based on the dual point of view: rather than search for a maximum weight matching directly, we search for a system of weights (the covers) and modify it until a matching of the same weight is found." — Harold W. Kuhn, The Hungarian Method for the Assignment Problem, Naval Research Logistics Quarterly 2 (1955), p. 84.
| 항목 | 값 |
|---|---|
| Expert № | 10 |
| 주연 | Hungarian / Kuhn–Munkres (Kuhn 1955, Munkres 1957) |
| 조연 | König (1931), Egerváry (1931), Edmonds blossom (1965, 일반 매칭), Hopcroft–Karp (1973) |
| 원논문 | Kuhn (1955). "The Hungarian Method for the Assignment Problem." NRLQ 2: 83–97. |
| 대표 교과서 | Burkard–Dell'Amico–Martello (2012), CLRS Ch. 25.5 |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
n 명의 노동자, n 개의 일. 각 노동자 i 가 일 j 를 얼마나 잘 할 수 있는지의 능력 행렬 c[i][j] 가 주어진다. 모든 노동자에게 정확히 한 일 을 할당하고, 모든 일이 정확히 한 노동자 에게 할당되어야 한다. 그 한도에서 총 능력의 최대 (또는 총 비용의 최소) 를 찾는다.
이 문제의 이름은 Assignment Problem. 또는 Bipartite Perfect Matching (이분 완전 매칭) 의 가중 버전. 단순 그리디는 전혀 작동하지 않음 — 가장 좋아 보이는 노동자–일 쌍 을 차례로 채택하면 나중에 다른 노동자가 어떤 일도 못 받는 함정. 그리디가 무너지는 대표적 자리. Local Search (2장) 도 국소 최적의 함정. 이 자리에서 Hungarian algorithm — 그리디나 로컬 서치와는 근본적으로 다른 도구 — 이 등장한다.
Hungarian 의 핵심 아이디어 는 LP duality (7장 §11 의 그것) 의 조합론적 응용. 노동자–일 짝짓기의 최적 매칭 을 직접 찾는 대신, 각 노동자/일에 정해진 잠재 가격 (dual variable, potential) 을 순차적으로 조정 해 complementary slackness (CS) 가 충족되는 자리를 찾는다. 그 자리에서 발견되는 매칭이 자동으로 최적. 이 듀얼 접근 이 놀랍게 우아.
알고리즘은 1955년 Harold Kuhn (Princeton) 이 발표. Naval Research Logistics Quarterly 2권에. 그러나 — 그리고 이것이 매혹적인 부분 — Kuhn 의 원리 는 이미 24년 전인 1931년 헝가리의 두 수학자 Dénes König 과 Jenő Egerváry 가 이론적으로 정리해 둔 것. 그러나 헝가리어 학술지 였고, 영어 번역이 없었다. Kuhn 이 1953년 Princeton 의 한 도서관 에서 영어로 번역된 König 의 1931년 짧은 논문 을 우연히 발견하고 그 위에 알고리즘을 만든다. 두 헝가리 수학자에 경의 를 표하며 알고리즘에 Hungarian Method 이라는 이름을 붙임. 그 이름이 오늘날까지 살아 있다.
1957년 James Munkres (MIT) 가 J. SIAM 에 Kuhn 의 알고리즘을 다항 시간으로 단축 한 변형 발표. 오늘날 Kuhn–Munkres 알고리즘이라 불리는 형태. O(n³) 시간. 1960~70년대의 응용 — 항공사 승무원 일정, 결혼 매칭 (양쪽 선호도 기반), 디지털 영상 처리의 stereo matching — 으로 대중화. 1965년 Jack Edmonds (3장 §10, 7장 §10 의 Edmonds) 가 일반 그래프 매칭 (이분 아닌) 의 blossom 알고리즘 으로 Edmonds–Karp Matching Theorem 의 한 정점을 만든다.
Expert 10번 — 원변환 — 의 풀이는 Hungarian 의 기하학적 변형. 두 원 위의 점 집합을 최소 거리 매칭. 직접 Hungarian 적용 가능 — 거리 행렬 c[i][j] = d(p_i, q_j). n³ 시간. n=100 정도면 충분.
이 이야기는 1920~30년대 헝가리 수학계의 황금기 에서 시작한다. Dénes König (1884–1944) — 부다페스트 공대 교수, König's lemma (이분 그래프 매칭의 maxflow-mincut 정리) 의 그 König — 가 1931년 Matematikai és Fizikai Lapok (수학·물리학 잡지) 에 4 페이지짜리 짧은 논문 Graphs and Matrices 를 헝가리어로 발표한다. 그 논문에서 König 는 이분 그래프의 최대 매칭 크기 = 최소 vertex cover 크기 라는 유명한 König's theorem 을 증명. 이 정리가 LP duality 의 조합론적 첫 사례 중 하나.
같은 해 1931년, 또 다른 헝가리 수학자 Jenő Egerváry (1891–1958) — 부다페스트 공대 동료 — 가 같은 학술지에 12 페이지짜리 논문 On Combinatorial Properties of Matrices 를 헝가리어로 발표. König 의 정리를 가중 그래프 로 확장. 가중 이분 매칭의 최대값 = "가능한 잠재 가격의 최소 합" 이라는 듀얼 등식. 이것이 1955년 Kuhn 의 Hungarian Method 의 수학적 기둥.
문제는 — 두 논문 모두 헝가리어 로 쓰였고, 영어 번역이 없었다. 1944년 König 는 부다페스트의 유대인 박해 를 피하다 자살. 그의 수학적 유산 이 서구에 전해지지 못한 채 한참을 묻혔다. 1945~1953년 Egerváry 가 부다페스트에서 연구 를 계속했지만 냉전 시대의 학술 분리 로 영문 출판이 거의 없었다.
1953년 Princeton University. 30세의 Harold W. Kuhn — 후일 게임 이론 의 거장, Nash equilibrium 의 후속 연구자 — 이 RAND Corporation 의 assignment problem 을 풀기 위해 문헌 조사. 도서관에서 König 1931 의 영어 번역 (1948년 L. Mirsky 의 Transversal Theory 책에 포함) 을 발견. 그 위에 알고리즘적 구현 을 추가해 1955년 Naval Research Logistics Quarterly 에 발표. Hungarian Method 라는 이름은 König 와 Egerváry 의 헝가리 출생 에 대한 경의.
Kuhn 의 1955 알고리즘은 원래는 다항 시간이 아닌 약 O(n^4). 1957년 James Munkres — MIT 토폴로지스트, 후일 Munkres 의 토폴로지 교과서 (1975) 의 저자 — 가 J. SIAM 에 6 페이지짜리 단축본 발표. Hungarian + Munkres 정리화 로 O(n^3). Kuhn–Munkres 라는 이름이 표준화.
1960년대 Tomizawa (1971) 와 Edmonds–Karp (1972) 가 Hungarian 의 LP 듀얼 을 Min-Cost Flow 의 SSP (7장 §3) 의 특수 경우 로 통합. 1965년 Edmonds 의 Paths, Trees, and Flowers 가 비-이분 그래프 매칭의 blossom 알고리즘 발표 — Hungarian 의 일반화.
Hungarian / Kuhn–Munkres 의 의사코드 (O(n³) 형태):
algorithm Hungarian(cost_matrix c[n][n]):
# u[i] = 노동자 i 의 potential, v[j] = 일 j 의 potential
# Invariant: c[i][j] - u[i] - v[j] >= 0 for all i, j (dual feasibility)
u[1..n] = 0
v[1..n] = 0
match[1..n] = nil
for i in 1 to n:
# 노동자 i 를 어떤 일에 매칭. shortest augmenting path 로.
inf = infinity
minv[1..n] = inf
used[1..n] = false # 일 j 가 augmenting path 에 포함됐는지
p[1..n] = 0 # parent 추적
j0 = 0
while True:
used[j0] = true
i0 = match[j0] if j0 != 0 else i
delta = inf
j1 = nil
for j in 1 to n:
if not used[j]:
cur = c[i0][j] - u[i0] - v[j]
if cur < minv[j]:
minv[j] = cur
p[j] = j0
if minv[j] < delta:
delta = minv[j]
j1 = j
# potentials 조정
for j in 1 to n:
if used[j]:
u[match[j] or i] += delta
v[j] -= delta
else:
minv[j] -= delta
j0 = j1
if match[j0] == nil: break
# augmenting path 따라 matching 갱신
while j0 != 0:
j_prev = p[j0]
match[j0] = match[j_prev] if j_prev != 0 else i
j0 = j_prev
return match
복잡도 O(n³). 한 노동자 추가 = O(n²). n 번 반복.
작은 예시 — 3×3 비용 행렬:
일1 일2 일3
노1 4 1 3
노2 2 0 5
노3 3 2 2
목표: 매 노동자에게 한 일 배정, 총 비용 최소.
Hungarian:
초기 u=v=0. 매칭 = {}.
step 1: 노1 추가. shortest path 로 노1 → 일2 (비용 1). u[노1]=1, v[일2]=0.
step 2: 노2 추가. 노2 → 일1 (비용 2) 또는 일3 (비용 5) 또는 일2 거쳐서.
가장 짧은 augment: 노2 → 일1. u[노2]=2.
step 3: 노3 추가. 노3 → 일3 (비용 2) 가능. u[노3]=2.
결과: 노1=일2 (1), 노2=일1 (2), 노3=일3 (2). 총 비용 5.
비교 그리디: 최소 0 (노2-일2) → 노1 일1 또는 일3 (4 또는 3) → 노3 일1 또는 일3.
결과 0 + 3 + ? = 적어도 0+3+3=6. 그리디 6, Hungarian 5.
그림 10.1 ― Hungarian 의 듀얼 그림.
이분 그래프:
노동자 ──── 일
n1 ───c11── j1
\ /
\ /
n2 ───c12── j2
\ ←── ↑↓ 매칭으로 추가/제거
\
n3 ───c23── j3
각 노드에 potential:
노동자 i: u[i]
일 j: v[j]
reduced cost: c̃[i][j] = c[i][j] - u[i] - v[j].
알고리즘 invariant: 모든 (i,j) 에 c̃[i][j] >= 0.
매칭의 *tight edges* = c̃[i][j] = 0 인 간선들.
목표: tight edges 만으로 perfect matching 구성.
그림 10.2 ― Augmenting Path 의 그림.
현재 매칭 (굵은 선):
n1 ━━━━ j1
n2 ━━━━ j2
n3 ──── j3 (미매칭)
noff 추가 시 augmenting path:
new ──── j2 ━━━━ n2 ──── j3 (현재 미매칭)
실선 = 미매칭 간선, ━ = 매칭 간선
path 의 alternating 패턴: 미매칭 - 매칭 - 미매칭 - ... - 미매칭
path 위 모든 간선의 *상태 반전* = 매칭 크기 +1.
"duke (König) 의 정리: 최대 매칭 ⟺ augmenting path 가 없음".
Bipartite graph. G = (X ∪ Y, E), X (= 노동자), Y (= 일), E ⊆ X × Y. Cost c : E → ℝ.
Matching. M ⊆ E. Perfect matching 이란 모든 정점이 정확히 한 간선의 끝점.
Assignment problem. 최소 비용 perfect matching 찾기. min Σ_{(i,j) ∈ M} c(i,j).
Vertex potential. u : X → ℝ, v : Y → ℝ. Reduced cost c̃(i, j) = c(i, j) - u(i) - v(j).
Dual feasibility. 모든 (i, j) ∈ E 에 대해 c̃(i, j) ≥ 0.
Tight edge. c̃(i, j) = 0 인 간선.
Equality subgraph. G_u_v = (X ∪ Y, {(i,j) ∈ E : c̃(i,j) = 0}) — tight edge들의 부분 그래프.
왜 이 보조정리들이 필요한가. §6에서 증명할 정리는 (1) König's theorem — 이분 그래프 매칭의 max-flow min-cut 사례. (2) Hungarian 의 정확성 — perfect matching with minimum cost. 두 정리의 공통 도구가 augmenting path 와 dual feasibility.
보조정리 10.1 (König's Theorem, 1931).
이분 그래프
G = (X ∪ Y, E)에서, 최대 매칭의 크기 = 최소 vertex cover 의 크기.
증명. (≤) 모든 매칭의 간선 각각이 vertex cover 의 한 정점 으로 덮어야 함, 매칭은 disjoint, 따라서 cover 크기 ≥ 매칭 크기. (≥) max-flow min-cut 정리 (7장 정리 7.6) 의 이분 그래프 특수화 — bipartite source-to-sink network 만들기. 자세한 환원은 표준 결과. ∎
이 보조정리가 Hungarian 의 출발점. König 의 1931 결과가 Kuhn 의 1955 알고리즘의 수학적 정당화.
보조정리 10.2 (Egerváry, 1931).
가중 이분 그래프에서, 최대 가중 매칭의 합 = 최소 dual-feasible potentials 의 합
Σ u(i) + Σ v(j).
증명. LP duality 의 조합론적 사례. König 의 정리의 가중 일반화. 자세한 증명은 Burkard–Dell'Amico–Martello §3. ∎
보조정리 10.3 (Complementary Slackness for Assignment).
Matching
M와 potentials(u, v)가 함께 OPT ⟺ (a)M이 perfect matching, (b)(u, v)가 dual feasible, (c) 모든(i, j) ∈ M에 대해c̃(i, j) = 0(tight).
증명. LP CS condition 의 직접 적용. (⟸) 세 조건이면 Σ_M c(i,j) = Σ_M (u(i) + v(j)) = Σ_X u(i) + Σ_Y v(j). 따라서 primal cost = dual cost. (⟹) Strong duality. ∎
보조정리 10.4 (Augmenting Path Property).
이분 그래프에서 매칭
M가 최대 ⟺ augmenting path 가 없음. (Berge's theorem 1957의 이분 사례.)
증명. Berge 1957 의 정리의 이분 사례. ∎
이 보조정리가 Hopcroft–Karp 의 핵심 도 됨.
정리 10.5 (Hungarian Algorithm Correctness).
Kuhn–Munkres algorithm 은 perfect matching with minimum total cost 를 정확히 출력한다.
증명. Invariants: (i) 매 단계 (u, v) 는 dual feasible (c̃ ≥ 0). (ii) 현재 매칭 M 은 모두 tight (c̃(i,j) = 0 for (i,j) ∈ M). (iii) 매칭이 증가 (augmenting path 발견 시).
초기: 모든 potential = 0 (대각선 cost ≥ 0 가정 또는 추가 offset). 매칭 비어있음. invariants 성립.
한 단계: shortest augmenting path 찾기 위해 Dijkstra-like 알고리즘 (또는 BFS). path 위 간선 모두 tight 인지 검사. 그렇지 않으면 potentials 조정 (delta 만큼). 조정 후 모두 tight 가 되어 augment 가능.
n 번 반복 후 perfect matching 완성. 보조정리 10.3 (CS) 에 의해 매칭은 OPT. ∎
증명이 깨지는 가정. (1) 대각선 행렬 = 0 가정 없으면 potentials 가 음수일 수 있어 dual feasibility 깨짐. (2) 비-이분 그래프 — Edmonds blossom 으로 일반화 필요. (3) 비대칭 비용 — Hungarian 작동 (c[i][j] ≠ c[j][i] 가능).
정리 10.6 (Hungarian Time Complexity).
Kuhn–Munkres (
O(n³)형태) 의 시간 복잡도는O(n³). 공간O(n²).
증명. 한 노동자 추가 = shortest augmenting path 찾기 = O(n²) (Dijkstra with O(n²) 구현, n=노드 수). n 번 반복 = O(n³). ∎
정리 10.7 (Hopcroft–Karp 1973).
Unweighted bipartite max matching 은
O(E √V)가능. 가중 버전은 Gabow–Tarjan 1989 의O(n^{2.5} log(nC))(C = max cost) 가 알려짐.
증명 개요. HK 의 phase analysis — 한 phase 에 여러 vertex-disjoint augmenting paths 동시 처리. O(√V) phases. 자세한 증명은 HK 1973. ∎
하계. Assignment 의 비교 모델 하계는 알려져 있지 않음 (관찰 — 비교만으로는 자명하지 않음). 실용 O(n³) 의 상수가 작아 n ≤ 5000 까지 실용적.
(a) Munkres (1957) 의 O(n³). Kuhn 의 원래 알고리즘 O(n⁴) 의 단축. 행렬 연산의 영리한 재사용.
(b) Tomizawa (1971). Hungarian 을 SSP 의 special case 로 정리 (7장 §10).
(c) Edmonds blossom (1965). 비-이분 일반 그래프 매칭. O(VE) 또는 그 변형.
(d) Hopcroft–Karp (1973). Unweighted bipartite max matching O(E √V).
(e) Gabow–Tarjan (1989). Weighted bipartite O(n^{2.5} log nC).
(f) Linear programming approach. Network simplex (Dantzig 1963) 의 assignment 특수화.
(g) Auction algorithm (Bertsekas 1979). 경매 비유 — 노동자가 일에 입찰. 병렬화 친화.
그림 10.2ᵇ ― König's Theorem 의 시각화.
bipartite graph:
n1 ───── j1
n2 ───── j2 maximum matching M:
n3 ───── j3 {(n1,j1), (n2,j3)}
size 2
n4 ───── j4
minimum vertex cover C:
{n1, j3} 또는 {j1, n2}
size 2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
König: |M| = |C| (이분 그래프에서 항상)
가중 버전 (Egerváry): max weight matching = min potential sum.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
그림 10.2ᶜ ― Potentials 의 조정 과정.
초기: u=(0,0,0), v=(0,0,0). c̃ = c.
4 1 3 5 1 4 (after 노1)
2 0 5 → 3 0 6
3 2 2 4 2 3
step 1: 노1 → 일2 (가장 작은 c̃ = 1).
u[노1] += 1, v[일2] -= 0.
augment.
step 2: 노2 → 일1 (c̃ = 2, 가장 작음).
potentials 조정.
step 3: 노3 → 일3 (남은 자리).
결과 매칭: {노1=일2, 노2=일1, 노3=일3}.
각 매칭 간선이 모두 *tight* (c̃ = 0).
그림 10.3 ― 매칭 알고리즘 가계도.
König (1931) Egerváry (1931)
max matching = weighted version
min cover
│ │
└───────────┬───────────┘
▼
Kuhn (1955)
Hungarian Method
O(n^4) (?)
│
▼
Munkres (1957)
O(n^3)
│
┌────────────────┼────────────────┐
▼ ▼ ▼
Hopcroft-Karp Edmonds blossom Tomizawa
(1973) (1965) (1971)
O(E √V) unwght general graph MCF special
│
▼
Gabow-Tarjan
(1989)
weighted bipartite
Kuhn 1955 NRLQ 의 15 페이지. Naval Research Logistics Quarterly — 미군 군수 운영연구 학술지. Assignment Problem 의 알고리즘적 첫 다항 해법 (당시 기준 — 수렴 보장 + 유한 시간).
§1 Introduction 에서 Assignment Problem 의 경제적 응용 — 운송, 인력 배치, 자원 할당. 그리디의 실패 사례를 명시.
§2 König's Theorem. Kuhn 이 König 1931 의 영어 번역 (Mirsky 1948) 을 명시적으로 인용. 서구 학자가 헝가리 수학자에게 경의를 표한 한 사례.
§3 Algorithm. Hungarian Method 의 의사코드. augmenting path + potentials adjustment 의 두 단계.
§4 Examples and Proofs. 작은 예제 + 정확성 증명. 수학적 엄밀성 이 알고리즘 분야의 표준 이 되어가는 시점.
Munkres 1957 J. SIAM 의 6 페이지. 짧고 효율적. Kuhn 의 행렬 연산을 재사용 으로 O(n^4) → O(n^3).
Dénes König (1884–1944). 헝가리 부다페스트 출생. 조합론 그래프 이론의 창시자 중 한 명. 부다페스트 공대 교수 (1907~1944). 그의 1936년 책 Theorie der endlichen und unendlichen Graphen — 그래프 이론 분야의 첫 단행본. 1944년 유대인 박해 를 피해 부다페스트에서 자살. 나치 점령기의 비극적 끝. 그의 수학적 유산 은 반세기 뒤 까지 그 영향이 자라남.
Jenő Egerváry (1891–1958). 부다페스트 출생. 부다페스트 공대 (1919~1958). König 의 후계자. 가중 매칭의 듀얼 이론 의 개척자.
Harold William Kuhn (1925–2014). 미국 출생. Princeton 박사 (1950). Bryn Mawr College, Princeton (1959~1995). 게임 이론 (1950년대), Nash 와의 협업, 조합론적 최적화 (1955 Hungarian).
James Munkres (1930~). MIT 토폴로지스트. Topology: A First Course (1975) 교과서로 위상수학의 표준. 1957 Hungarian 단축본 외에는 알고리즘 분야 활동 적음 — 그는 위상수학자. 한 분야의 거장이 다른 분야에 잠시 기여한 사례.
Expert 10번 — 원변환 — 의 풀이.
1. 두 점 집합 — 원 1 위의 n 개 점 {p_i}, 원 2 위의 n 개 점 {q_j}. 2. 거리 행렬 계산 — c[i][j] = ||p_i - q_j||. 3. Hungarian 실행 O(n³). 최소 비용 매칭. 4. 결과 = 점 변환 매핑 — p_i → q_{match[i]}.
3장 (Greedy Exchange) 와의 연결. Hungarian 도 교환 인자 의 한 사례 — 현재 매칭에서 augmenting path 로 향상. 7장 (MCF) 와의 연결. Hungarian = MCF 의 bipartite + unit capacity 특수화. 두 알고리즘이 같은 풀이의 다른 모습.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/10-trans-circle.html
왜 이 장이 책 전체에서 특별한가. Hungarian 은 LP duality 의 조합론적 첫 명료한 사례. 1931년 헝가리에서 이론적으로 정립, 1955년 미국에서 알고리즘으로 실현. 수학과 알고리즘의 24년 시차 — 그리고 서구와 동구의 분리 — 의 흔적. 알고리즘이 순수 발명 이 아니라 기존 수학의 알고리즘적 전이 일 수 있음을 보여주는 대표 사례.
역사의 부드러운 모서리. 1955년 Kuhn 이 Hungarian Method 라는 이름을 정할 때, König 와 Egerváry 모두 사망 (König 은 1944년) 했거나 철의 장막 뒤 (Egerváry 1958년 사망). 두 사람은 자신의 이론이 미국에서 알고리즘이 된 것을 모른 채 떠났다. 1971년 Egerváry 의 생전 마지막 단계에 그가 Kuhn 의 알고리즘에 대해 들었다 는 짧은 기록이 있지만 세부는 알려지지 않음. 학술적 인정 이 국경과 시대 를 넘어 천천히 닿아오는 한 사례.
현대 응용 — 자율 주행과 컴퓨터 비전. Hungarian 의 21세기 응용 — 자율 주행 차량의 multi-object tracking (영상 프레임 간 객체 매칭), 컴퓨터 비전의 stereo matching, 얼굴 인식의 feature matching. 한 알고리즘이 70년 뒤 까지 최신 AI 의 핵심 부품. König–Egerváry 의 1931 노트가 2025년 Tesla 의 자율 주행 시스템 안에서 그대로 작동.
그림 10.4 ― Hungarian 과 다른 매칭의 비교.
문제 알고리즘 복잡도
──────────────────────────────────────────────────────────
max matching (이분, unweight) Hopcroft-Karp O(E√V)
max weight matching (이분) Hungarian O(n³)
Gabow-Tarjan O(n^{2.5} log nC)
max matching (일반) Edmonds blossom O(VE)
max weight matching (일반) Edmonds blossom O(V³)
──────────────────────────────────────────────────────────
"이분 = 일반보다 쉽다." "weighted = unweighted보다 어렵다."
이 두 축이 매칭 알고리즘의 *복잡도 풍경* 을 만든다.
그림 10.5 ― Hungarian 의 응용 차림표.
응용 분야 설명 Hungarian의 역할
───────────────────────────────────────────────────────────────────────
인력 배치 노동자에게 일 할당 원래의 응용 (1955)
결혼 매칭 양쪽 선호도 기반 짝짓기 Stable matching의 변형
영상 stereo matching 두 카메라 영상의 픽셀 짝짓기 3D 복원
multi-object tracking 프레임 간 객체 매칭 자율 주행
feature matching 얼굴/지문 인식 AI 보안
원자 충돌 데이터 입자 검출기에서의 트랙 매칭 물리 실험
───────────────────────────────────────────────────────────────────────
LP 라운딩의 한 사례. Hungarian 의 듀얼 접근 은 LP relaxation 의 조합론적 사례. assignment 의 LP 는 완전한 정수해 — relaxation 의 모든 vertex 가 정수 (matching). 따라서 LP 를 풀면 자동으로 정수해. 이것이 Birkhoff–von Neumann 정리 (1946 가까이) — doubly stochastic matrix 는 permutation matrix 의 convex combination. 이 정리가 assignment problem 의 LP 해결 가능성 을 보장.
Bertsekas 의 Auction Algorithm. 1979년 Dimitri Bertsekas (MIT) 가 auction algorithm 발표. 각 노동자가 일에 입찰. 가격 (potentials) 이 경매처럼 상승. Hungarian 의 분산 변형. 병렬화 친화. 대규모 assignment 의 표준 도구.
다음 장으로 가는 다리. 11장 (Bitmask DP) 은 완전히 다른 도구 — 동적 계획법으로 모든 부분집합 탐색. 그러나 Held–Karp 1962 의 TSP DP 는 assignment-like 구조 — 한 노동자에게 한 일 의 일반화. 두 장이 각자 다른 영역 같지만 조합 최적화의 다른 두 얼굴.
[Kuhn1955]
[Munkres1957]
[Konig1931]
[Egervary1931]
[Edmonds1965]
[HopcroftKarp1973]
[Tomizawa1971]
[BurkardDellAmicoMartello2012]
전체 항목은 bibliography.md.
2^n 개의 부분집합을 한 번씩만 본다 — n=20일 때 백만, n=30일 때 십억. 그러나 n^2 · 2^n 이 n! 보다 훨씬 작다.
"We give a dynamic programming approach to the traveling salesman problem... The computational requirements grow exponentially as 2^n rather than as n!, so the method is useful for moderately sized problems." — Michael Held, Richard M. Karp, A Dynamic Programming Approach to Sequencing Problems, J. SIAM (1962).
| 항목 | 값 |
|---|---|
| Expert № | 11 |
| 주연 | Bitmask DP (Held–Karp 1962) |
| 조연 | Bellman 1962 (독립), Meet-in-the-middle, Profile DP, Inclusion-Exclusion, Trotter–Johnson permutation |
| 원논문 | Held–Karp (1962). "A Dynamic Programming Approach to Sequencing Problems." J. SIAM 10: 196–210. |
| 대표 교과서 | CLRS Ch. 14, Bellman (1957) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
작은 도시 18개 사이의 외판원 경로. n=18 이면 모든 순회 = 17!/2 ≈ 1.8 × 10^14. 모든 순회를 일일이 확인하는 brute force 는 수십만년. 휴리스틱 (2장 Local Search, 5장 NN+Or-opt) 은 근사 만 줌. 정확한 OPT 를 합리적 시간 에 원하면 어떻게 할까?
답이 Bitmask DP. 상태를 (방문한 도시들의 부분집합, 현재 도시) 로 정의. 부분집합은 비트마스크 — n 비트의 정수. n=18 이면 2^18 = 262,144 부분집합. 각 부분집합 × n 현재 도시 = n × 2^n = 18 × 262144 ≈ 4.7M 상태. 각 상태 처리 = O(n) 전이. 총 n² × 2^n ≈ 8500만 연산. 1초 안에 끝난다. 18! 대신 2^18 — 한 factorial 의 우주 가 bitmask 의 작은 행성 으로 줄어들었다.
이 trick 의 이름은 Held–Karp algorithm, 또는 Bellman–Held–Karp. 1962년 Michael Held 와 Richard Karp (당시 IBM Watson) 가 J. SIAM 에 발표. 같은 해 Richard Bellman — 동적 계획법의 아버지, 1953년 Dynamic Programming 개념 정립 — 이 JACM 에 독립적으로 같은 알고리즘 발표. 두 그룹의 동시 발견 은 Bellman 1957 의 DP 개념 책 의 자연스러운 결과. 어떤 의미에서 알고리즘은 이미 1957년 부터 가능 했다 — 명시적 정식화 가 1962년에야.
Held–Karp 의 수학적 의미 는 NP-난해 문제의 정확한 알고리즘의 첫 정성한 사례. 1962년 시점에 NP-완전성 (Cook 1971) 은 아직 발명되지 않았지만 — 사람들은 TSP 가 어렵다는 것 을 경험적으로 알고 있었다. Held–Karp 가 정확한 알고리즘 의 한 기준선 을 그었다. 어떤 알고리즘도 더 좋을 수 없다 는 명시적 하한이 아니라, 현재 우리가 할 수 있는 최선 의 기준선.
Expert 11번 — 단백질 — 의 풀이는 Held–Karp 의 일반화. 단백질의 작은 building block (≤20개) 의 최적 배열 을 DP 로. 각 부분 배열의 최소 에너지 를 bitmask 상태 로 추적. n=20 정도라면 2^20 = 1M, 충분히 가능한 분야. NP-난해의 한 얼굴.
1957년 Richard Bellman (RAND Corporation). Dynamic Programming 이라는 책 을 발표. 이 책이 동적 계획법 이라는 알고리즘 분야 전체 의 출발점. Bellman 의 Principle of Optimality — "전체 정책의 어떤 부분도 그 부분만의 최적 정책이어야 한다" — 가 모든 DP 의 수학적 정당성. 1장 (Dijkstra) 의 보조정리 1.1 (Optimal Substructure) 의 일반화.
Bellman 의 DP 정의 는 Markov decision process 의 backward induction. 상태 → 전이 → 누적 비용. 각 상태에서의 최적값 을 작은 부분 문제로 환원. 재귀 + memoization 의 수학적 형식화.
1957~62년 사이에 Dynamic Programming 이 알고리즘 도구상자 의 한 자리. Matrix chain multiplication, Knapsack, Longest Common Subsequence — 모두 1960년대 초의 결과. 그 중 가장 흥미로운 사례가 TSP. TSP 는 작은 부분 문제로 환원이 자명하지 않은 문제 — 그러나 영리한 상태 인코딩 으로 환원 가능.
1962년 Michael Held (IBM Research) 와 Richard Karp (IBM Research, 후일 Berkeley) 가 J. SIAM 에 A Dynamic Programming Approach to Sequencing Problems 발표. 15 페이지. 그들의 영리함 은 상태를 (부분집합, 현재 위치) 로 정의 한 것. 부분집합을 비트마스크 로 표현해 효율적 저장. 이 상태 인코딩 이 Bitmask DP 의 출발점.
같은 1962년 Richard Bellman 이 JACM 에 Dynamic Programming Treatment of the Travelling Salesman Problem 발표. 3 페이지짜리. Held–Karp 와 독립. 같은 알고리즘. 과학사의 동시 발견 의 한 사례.
1971년 Cook 의 NP-완전성, 1972년 Karp (그 Karp) 의 21 NP-완전 문제 가 TSP 가 정말로 어렵다 는 수학적 증명. 그 이후로 Held–Karp 의 O(n² · 2^n) 가 TSP 의 정확한 알고리즘의 표준. 60년이 지난 2024년 현재까지도 — O((2-ε)^n) 의 알고리즘은 알려지지 않음 — strong exponential time hypothesis (SETH) 의 open question 의 한 자리.
Held–Karp 의 의사코드:
algorithm HeldKarp(n, dist):
# dist[i][j] = i 에서 j 까지의 거리.
# dp[S][i] = "출발지 0 에서 시작, S 의 모든 도시 방문, 현재 i 에 있음" 의 최소 거리.
# S = 비트마스크. S 에 i 가 포함되어 있어야.
dp[ {0} ][0] = 0 # 출발지 0 에서 시작
for all S ⊆ {0, 1, ..., n-1} containing 0:
for i in S, i != 0:
dp[S][i] = min over j in S, j != i:
dp[S \ {i}][j] + dist[j][i]
# TSP tour: 0 → ... → 마지막 → 0 으로 돌아옴
best = min over i in {1, ..., n-1}:
dp[{0, ..., n-1}][i] + dist[i][0]
return best
복잡도: 상태 수 = 2^{n-1} × (n-1) ≈ n · 2^n. 각 상태 전이 O(n). 총 O(n² · 2^n).
공간: O(n · 2^n). n=20 이면 약 20M 상태 — O(n) 각 상태로 400MB. 한계.
작은 예시 — n=4 도시. dist:
A B C D
A 0 5 4 3
B 5 0 2 6
C 4 2 0 1
D 3 6 1 0
dp[ {A} ][A] = 0
dp[{A,B}][B] = dp[{A}][A] + dist[A][B] = 0 + 5 = 5
dp[{A,C}][C] = 0 + 4 = 4
dp[{A,D}][D] = 0 + 3 = 3
dp[{A,B,C}][B] = min(dp[{A,C}][C] + dist[C][B]) = 4 + 2 = 6
cf. via [A,B], C, B 는 무의미.
dp[{A,B,C}][C] = min(dp[{A,B}][B] + dist[B][C]) = 5 + 2 = 7
dp[{A,B,D}][B] = dp[{A,D}][D] + dist[D][B] = 3+6 = 9
dp[{A,B,D}][D] = dp[{A,B}][B] + dist[B][D] = 5+6 = 11
dp[{A,C,D}][C] = dp[{A,D}][D] + dist[D][C] = 3+1 = 4
dp[{A,C,D}][D] = dp[{A,C}][C] + dist[C][D] = 4+1 = 5
dp[{A,B,C,D}][B] = min(dp[{A,C,D}][C] + dist[C][B], dp[{A,C,D}][D] + dist[D][B])
= min(4+2, 5+6) = 6
dp[{A,B,C,D}][C] = min(dp[{A,B,D}][B] + dist[B][C], dp[{A,B,D}][D] + dist[D][C])
= min(9+2, 11+1) = 11
dp[{A,B,C,D}][D] = min(dp[{A,B,C}][B] + dist[B][D], dp[{A,B,C}][C] + dist[C][D])
= min(6+6, 7+1) = 8
best = min(dp[{A,B,C,D}][B] + dist[B][A], dp[{A,B,C,D}][C] + dist[C][A], dp[{A,B,C,D}][D] + dist[D][A])
= min(6+5, 11+4, 8+3)
= min(11, 15, 11) = 11
OPT TSP tour: A-C-D-B-A or A-B-C-D-A 모두 비용 11.
그림 11.1 ― Bitmask 상태 공간의 시각화.
n=4 의 비트마스크 (방문한 도시):
0001 = {A}
0011 = {A,B} 0101 = {A,C} 1001 = {A,D}
0111 = {A,B,C} 1011 = {A,B,D} 1101 = {A,C,D}
1111 = {A,B,C,D}
상태: (mask, current)
- mask 의 비트가 *방문한 도시*
- current = 현재 위치 (mask 안)
전이: dp[mask][i] = min over j in mask, j != i:
dp[mask \ {i}][j] + dist[j][i]
순서: mask 의 비트 수 오름차순. (smaller mask 먼저 채워짐.)
그림 11.1ᵇ ― DP 상태의 종속 관계 (n=4).
|S|=1: |S|=2: |S|=3: |S|=4:
{A} {A,B} {A,C} {A,D} {A,B,C} {A,B,D} {A,B,C,D}
{A,C,D}
↓
dp[{A}][A]=0 → dp[{A,B}][B]=5 → dp[{A,B,C}][B]=6 → dp[{A,B,C,D}][B]=6
dp[{A,C}][C]=4 dp[{A,B,C}][C]=7 dp[{A,B,C,D}][C]=11
dp[{A,D}][D]=3 dp[{A,B,D}][B]=9 dp[{A,B,C,D}][D]=8
dp[{A,B,D}][D]=11
dp[{A,C,D}][C]=4
dp[{A,C,D}][D]=5
순서: |S| 증가 방향. 각 상태는 *작은 mask 에 의존*.
토포로지컬 진행: 비트 수 적은 mask 먼저 → 더 큰 mask.
같은 비트 수 안에서는 어떤 순서든 OK.
그림 11.2 ― 시간 복잡도 vs n.
n n! n² · 2^n 실용 시간 (1Ghz CPU)
──────────────────────────────────────────────────────────
5 120 800 < 1ms
10 3.6M 102k < 1ms
15 1.3T 7.4M 7 ms
20 2.4 × 10^18 419M 0.4 s
25 1.5 × 10^25 21G 21 s
30 2.6 × 10^32 966G 16 min
35 1.0 × 10^40 43T 12 hrs
40 8.2 × 10^47 1.8P 2 weeks
──────────────────────────────────────────────────────────
결론: n ≤ 20 정도가 *실용 한계*. n=25 는 *재미있는 한계*.
n=30 은 *큰 컴퓨터 + 메모리 트릭* 으로.
TSP. n 도시 + 거리 d : [n] × [n] → ℝ_{≥0}. Hamiltonian cycle (0, π(1), π(2), …, π(n-1), 0) 의 최소 비용.
Subset. S ⊆ [n]. Bitmask 로 표현 — n 비트의 정수 m, i ∈ S ⟺ m 의 i 번째 비트가 1.
State. (S, i) — 0 ∈ S, i ∈ S. 방문한 부분집합 + 현재 위치.
DP value. dp[S][i] = 0 에서 출발, S 의 모든 도시 정확히 한 번 방문, 현재 i 에 있음 의 최소 비용.
보조정리 11.1 (Held–Karp Recurrence).
dp[S][i] = min_{j ∈ S, j ≠ i} (dp[S \ {i}][j] + d(j, i)). 기저:dp[{0}][0] = 0.
증명. 0 → … → j → i 의 최적 경로의 마지막에서 두 번째 도시 j. 정의에 의해 0 → … → j 의 비용 = dp[S \ {i}][j]. Principle of Optimality (Bellman 1957) 의 적용. ∎
보조정리 11.2 (Subset Enumeration Order).
dp[S][i]의 계산은dp[S \ {i}][j]에 의존. 따라서|S|가 작은 mask 부터 큰 mask 순서로 계산.
증명. |S \ {i}| = |S| - 1 이므로 의존성은 비트 수 감소 방향. ∎
보조정리 11.3 (TSP Final Answer).
OPT = min_{i ≠ 0} (dp[[n]][i] + d(i, 0)).
증명. 어떤 TSP tour 도 0 에서 시작 → 어딘가 i 에서 끝남 → 0 으로 돌아옴. ∎
정리 11.4 (Held–Karp Correctness).
Held–Karp 알고리즘은 TSP 의 OPT 를 정확히 계산한다.
증명. 보조정리 11.1 (recurrence) + 11.2 (order) + 11.3 (final answer). DP 의 표준 정확성 증명. ∎
증명이 깨지는 가정. (1) 비대칭 비용 — d(i,j) ≠ d(j,i) 도 가능, 알고리즘 동일 작동. (2) 시작점 다양 — 0 외 시작점은 대칭성 으로 동등. (3) Hamiltonian cycle 존재 — 일부 그래프에서 없음, 그 경우 dp[[n]][i] = ∞.
정리 11.5 (Held–Karp Time and Space).
시간:
O(n² · 2^n). 공간:O(n · 2^n).
증명. 상태 수 = n · 2^{n-1} (n 위치 × 2^{n-1} 부분집합 포함 0). 각 상태 전이 O(n). 시간 O(n² · 2^n). 공간 = 상태 수 × O(1) = O(n · 2^n). ∎
하계. 어떤 알고리즘도 O((2 - ε)^n) 서브-지수 보다 빠르게 TSP를 풀 수 있는가? 현재까지 미해결. Strong Exponential Time Hypothesis (SETH) 가 맞으면 — 즉 SAT 의 O((2-ε)^n) 알고리즘이 없으면 — TSP 도 마찬가지. 그러나 SETH 자체가 추측.
(a) Meet-in-the-Middle. 상태를 둘로 나눠 각각 2^{n/2} 으로. 결합 단계 에서 해시 또는 정렬. TSP 에 직접 적용은 어렵지만 Knapsack 같은 문제에 효과적. O(n · 2^{n/2}).
(b) Profile DP. 비트마스크가 한 "프로파일" 의 형태로 나타나는 DP. grid 위의 tiling 같은 문제에서.
(c) Inclusion-Exclusion DP (Karp 1982). Hamiltonian path 의 수 세기 — O(2^n · n) 시간으로. Held–Karp 와 유사.
(d) Plotkin–Tarjan permanent. Permanent 계산 — n × n matrix 의 permanent — O(n · 2^n) (Ryser 1963). Held–Karp 와 같은 패턴.
(e) Faster Bipartite Matching via DP. Bipartite max matching 의 bitmask DP — O(n · 2^n) (작은 n).
(f) Steiner Tree DP (Dreyfus–Wagner 1971). Minimal Steiner Tree of k terminals — O(3^k · n + 2^k · n²).
(g) Connectivity DP (Bodlaender 1990s). Tree decomposition 기반의 DP.
그림 11.3 ― DP 도구상자 가계도.
Bellman (1957)
Dynamic Programming
│
┌──────────────┼──────────────┐
▼ ▼ ▼
Matrix Chain Knapsack Held-Karp (1962)
LCS Subset Sum Bitmask DP
│
┌────────┼────────┐
▼ ▼ ▼
Profile Meet-in- Inclusion-
DP the-Middle Exclusion
│
▼
Dreyfus-Wagner
Steiner Tree
그림 11.3ᵇ ― Bitmask 연산 cheatsheet.
비트 연산 의미
─────────────────────────────────────────────────
mask & (1 << i) i 비트 set 여부 (방문 여부)
mask | (1 << i) i 추가 (방문 표시)
mask & ~(1 << i) i 제거
bin(mask).count('1') |S| (popcount)
(mask & -mask) 가장 낮은 set 비트
for sub in submasks(mask): 모든 부분집합 (3^n 총합)
for i in range(n) if mask >> i & 1: mask 안의 비트 순회
─────────────────────────────────────────────────
Bitmask DP 의 effective 구현 = 위 연산들의 능숙한 사용.
현대 CPU 의 POPCNT 명령은 popcount 를 1 cycle 안에.
__builtin_ctz (count trailing zeros) 는 가장 낮은 비트.
그림 11.4 ― 적용 가능 n 의 한계.
알고리즘 적용 범위 (n) 복잡도
────────────────────────────────────────────────────
Brute force (n!) n ≤ 10 O(n!)
Held-Karp (2^n · n²) n ≤ 20 O(n² · 2^n)
Meet-in-Middle n ≤ 35 (Knapsack) O(n · 2^{n/2})
Approximate (Ch. 2,5) n ≥ 100 O(n^k)
LK + ILS (Ch. 2) n ≥ 10000 O(n^k)
────────────────────────────────────────────────────
Held–Karp 1962 J. SIAM 의 15 페이지. Society for Industrial and Applied Mathematics 의 학술지. 운영연구 + 알고리즘.
§1 Introduction 에서 sequencing problems (외판원, 작업 스케줄링) 의 일반 정의.
§2 DP Formulation. 의사코드. 상태 정의. 전이 식.
§3 Examples. VRP, job scheduling, TSP 의 세 응용.
§4 Computational Results. IBM 7090 에서의 실험. n=10 까지 직접 풀음. 1962 컴퓨팅의 한계.
Bellman 1962 JACM 의 3 페이지. 짧고 간결. Held–Karp 와 독립적. Dynamic Programming 의 자연스러운 적용.
Michael Held (1933~). IBM Watson Research Center (1959~). Held–Karp 외에도 Branch-and-Bound TSP (1970년대), Lagrangian relaxation.
Richard M. Karp (이미 7장 §10 참조). Held–Karp 1962 가 Karp 의 알고리즘 첫 큰 결과. 10년 뒤 NP-완전성 21 문제 (1972).
Richard Bellman (1920–1984). Princeton 박사 (1947). RAND Corporation (1953~). Dynamic Programming 개념 발명 (1953). 1957 책 Dynamic Programming. 이 책의 영향력은 컴퓨터 과학 + 운영 연구 + 경제학 의 한 시대를 만듦.
Expert 11번 — 단백질 — 의 풀이.
1. 단백질 building block 을 도시처럼 — n ≤ 20 정도. 2. Bitmask DP — dp[mask][i] = "mask 의 block 모두 배치, 현재 마지막 block i 의 최소 에너지". 3. Held–Karp 의 직접 응용 O(n² · 2^n). 4. 메모리 효율 — n=20 이면 2^20 × 20 = 20M, 각 4 bytes = 80MB. 한계.
다른 장과의 연결. 1장 (Dijkstra) 의 Optimal Substructure 가 11장의 DP 의 정당성. 8장 (SA) 가 근사 적이지만 n=100+. 11장이 정확 + n ≤ 20. 두 접근의 분업.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/11-protein.html
왜 이 장이 책 전체에서 특별한가. Held–Karp 는 NP-난해의 정확한 알고리즘 의 대표 사례. NP-완전성 이전 의 알고리즘적 첫 정상한 사례. 1962년 Bellman 의 DP 책 (1957) 의 논리적 결말 의 한 자리. 우주적으로 큰 n! 을 지수 2^n 으로 줄이는 명료한 트릭. 알고리즘의 세련된 단순함 의 한 사례.
60년의 침묵 — open question. Held–Karp 1962 이후 60년이 지난 2024년 현재, O((2-ε)^n) TSP 정확 알고리즘은 알려지지 않음. Lokshtanov–Marx–Saurabh 의 2011년 Fine-grained complexity 가 SETH 와의 연결 을 보임 — TSP 의 (2-ε)^n 이 SAT 의 (2-ε)^n 과 수학적으로 같은 어려움. 컴퓨터 과학의 한 큰 미해결. Held–Karp 1962 가 60년 동안 가장 빠른 정확한 TSP 알고리즘으로 남아 있는 것 — 알고리즘 이론의 한 침묵 의 자리.
Bitmask DP 의 다른 응용들. TSP 외에도 수많은 NP-난해 문제 가 bitmask DP 로 풀린다. (1) Hamiltonian path counting: O(n · 2^n). (2) Chromatic number: O(2.246^n) (Björklund–Husfeldt 2008). (3) Steiner tree (subset of terminals): Dreyfus–Wagner. (4) Set Cover with k sets: O(n · 2^n). (5) Bin Packing with k items per bin: variants. (6) Vertex cover in dense graphs: O(1.2^n) (Bjorklund–Husfeldt). 한 상태 인코딩 트릭이 수많은 분야 의 정확 알고리즘 의 공통 핵심.
메모리 트릭. n · 2^n 메모리가 큰 n 에서 한계. 트릭들: (1) Iterative deepening — 일부 mask 만 저장, 다른 것은 재계산. (2) Polynomial space: Inclusion-Exclusion 기반 — Bjorklund 2008 의 Möbius transform 이 polynomial space 로 같은 시간 가능. (3) Symmetry exploitation — dp[S][i] 의 일부가 대칭. (4) Disk-based: 메모리 한계를 디스크로 — 느려지지만 더 큰 n 가능.
다음 장으로 가는 다리. 12장 (MST) 은 그리디로 옳은 알고리즘 — 11장의 지수 정확 과 정반대. 두 알고리즘 모두 그래프 위 의 문제지만 완전히 다른 도구. MST 는 matroid (3장 §6 의 정리 3.4) 위의 그리디 — polynomial 시간. TSP 는 matroid 가 아님 — exponential 또는 approximation 만. 문제 구조의 차이가 알고리즘의 차이 라는 Edmonds 1971 의 깨달음 의 한 사례.
[HeldKarp1962]
[Bellman1962]
[Bellman1957]
[GareyJohnson1979]
[BjorklundHusfeldt2008]
[CormenLeisersonRivestStein2022]
[Karp1977]
[Woeginger2003]
전체 항목은 bibliography.md.
그래프의 척추 — 모든 정점을 잇되, 한 군데도 필요 이상 잇지 않는다.
"The problem of finding the minimum weight spanning tree of an edge-weighted graph appears to have been first considered by O. Borůvka in 1926." — Graham–Hell, On the History of the Minimum Spanning Tree Problem (1985).
| 항목 | 값 |
|---|---|
| Expert № | 12 |
| 주연 | Kruskal (1956), Prim (1957), Borůvka (1926) |
| 조연 | Karger–Klein–Tarjan (1995, randomized linear), Chazelle (2000), Critical Edge |
| 원논문 | Kruskal (1956). "On the Shortest Spanning Subtree of a Graph and the TSP." Proc. AMS 7: 48–50. |
| 대표 교과서 | CLRS Ch. 21, Sedgewick–Wayne §4.3 |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
도시 사이를 잇는 도로망의 재설계. 모든 도시가 연결 되어야 — 어느 두 도시 사이에든 어떤 경로 가 있어야. 그러나 건설 비용 최소. 도로마다 다른 비용 — 거리, 지형, 토지 보상. 어느 도로들을 반드시 건설, 어느 도로들을 생략할까. 답이 Minimum Spanning Tree (MST). 모든 정점을 잇는 최소 비용 트리 — 사이클 없음, 정확히 n-1 간선.
MST 는 그리디로 옳은 알고리즘의 대표. 1장 (Dijkstra) 와 같은 가족. 그러나 그 그리디가 왜 옳은가 의 답은 3장 (Greedy Exchange) 의 matroid 이론 위에 서 있다. Graphic matroid 의 정의: "간선의 부분집합이 사이클을 갖지 않는다" = independent. 그리디 + matroid → OPT (정리 3.4). 12장은 그 정리의 구체적 응용.
세 표준 알고리즘. Kruskal (1956) — 간선을 가중치 오름차순 정렬, 사이클 만드지 않는 한 추가. Prim (1957) — 한 정점에서 시작, 가장 싼 이웃 간선을 추가하며 트리 성장. Borůvka (1926) — 모든 연결 컴포넌트가 동시에 가장 싼 외부 간선 을 선택. 세 알고리즘 모두 그리디, 모두 OPT 보장. 차이는 구현 효율.
복잡도 — Kruskal: O(E log E) (정렬 + Union-Find). Prim: O(E log V) (이진 힙). Borůvka: O(E log V) (반복적 컴포넌트 합병). 2000년 Chazelle 의 O(E · α(V, E)) — 거의 선형 시간. 1995년 Karger–Klein–Tarjan 의 expected linear O(V + E) (random sampling 기반). MST 의 정확한 worst-case 복잡도 는 2024년 현재 미해결 — 그러나 거의 선형 까지는 알려진 상태.
Critical Edge — Expert 12 의 추가 차원. 어느 간선이 MST 의 모든* 트리에 들어가는가. 답: cycle 안의 유일한 최소 간선* 또는 cut 안의 유일한 최소* 간선. 이 구조적 특성* 의 분석이 robust 도로망 설계 의 핵심.
Expert 12 — 도로 — 의 풀이는 Kruskal + 4장 Union-Find 의 완벽한 결합. 그리고 critical edge 의 자동 검출. 4장의 Union-Find 가 12장의 부품 으로 그대로 등장 — 책의 연속성 의 한 예.
MST 의 가장 이른 등장 은 1926년 체코슬로바키아. Otakar Borůvka (1899–1995) — 모라비아 출생 수학자, 후일 Masaryk University Brno 교수 — 가 Práce moravské přírodovědecké společnosti 학술지에 22 페이지짜리 논문 O jistém problému minimálním (어떤 최소 문제에 대하여) 을 발표. 원래 동기는 모라비아 지방의 전력 그리드 설계 — 어느 도시들을 어떤 전력선으로 잇는가의 경제성 문제. Borůvka 의 알고리즘 이 그 자리에서 태어남.
문제는 체코어 학술지였다는 것. 1929년 Vojtěch Jarník — Borůvka 의 동료, 후일 Karlovy University Prague 교수 — 가 같은 학술지 에 짧은 변형 알고리즘 발표 (오늘날 Prim's algorithm 의 원형). 두 알고리즘 모두 체코어 학술 community 안에 묻혀 있었다.
서구의 재발견 은 1956년 Joseph Kruskal (Princeton, 후일 Bell Labs) 가 Proc. American Mathematical Society 에 3 페이지짜리 짧은 글 On the Shortest Spanning Subtree of a Graph and the Traveling Salesman Problem 발표. 간선 정렬 + 사이클 검사 + Union-Find 의 우아한 알고리즘. Borůvka 의 존재를 모른 채 독립 발견. 거의 동시 1957년 Robert Prim (Bell Labs) 가 Bell System Technical Journal 에 같은 문제의 Prim's algorithm 발표 — Jarník 1930 의 재발견.
1985년 Ronald Graham (Bell Labs) 과 Pavol Hell 이 Annals of the History of Computing 에 MST 문제의 역사 정리. Borůvka 1926 의 진정한 첫 발견자 자격 확립. 그 논문이 학술적 역사 인정 의 한 사례. Borůvka 가 사망 한 해 (1995) 까지 그는 자신의 1926년 결과가 컴퓨터 과학사의 한 시작점이 됐음 을 알고 있었다.
1995년 David Karger (당시 MIT 박사과정, 1948 Tarjan 의 학생), Philip Klein, Robert Tarjan 가 JACM 에 randomized linear MST 알고리즘. random sampling + Borůvka 단계 결합. expected O(V + E). MST 의 분석적 정점 의 한 자리.
2000년 Bernard Chazelle (Princeton) 가 JACM 에 deterministic O(E · α(V, E)) 알고리즘. 4장의 Inverse Ackermann α 가 다시 등장. Soft Heap 이라는 새 자료구조 발명. MST 의 deterministic worst-case 의 현재 최선.
Kruskal 의 의사코드.
algorithm Kruskal(graph G = (V, E, w)):
sort E by weight ascending
T = empty set
uf = UnionFind(V)
for each edge (u, v, w) in sorted order:
if uf.find(u) != uf.find(v): # 사이클 안 만들면
T.add((u, v, w))
uf.union(u, v)
if |T| == |V| - 1:
break
return T
복잡도 O(E log E). 정렬 dominate.
Prim 의 의사코드.
algorithm Prim(graph G, start s):
T = empty
Q = PriorityQueue()
visited = {s}
for each (s, v, w) in E:
Q.insert((w, s, v))
while |T| < |V| - 1:
(w, u, v) = Q.extract_min()
if v in visited: continue
T.add((u, v, w))
visited.add(v)
for each (v, x, w') in E:
if x not in visited:
Q.insert((w', v, x))
return T
복잡도 O(E log V).
Borůvka 의 의사코드.
algorithm Boruvka(graph G):
T = empty
components = {v: {v} for v in V} # 각 정점이 한 컴포넌트
while |components| > 1:
for each component C:
cheapest = min weight edge from C to outside
mark cheapest for addition
add all marked edges to T (avoid duplicates)
merge components connected by added edges
return T
복잡도 O(E log V). 병렬화 친화 — 각 컴포넌트가 동시에 처리.
그림 12.1 ― Kruskal 의 단계별 진행 (5 정점).
초기 그래프 (8 간선):
A ─1─ B edges sorted: 1(A,B), 2(B,C), 3(A,C), 4(B,D), 5(C,D), 6(D,E), 7(C,E), 8(A,E)
│ │
3 2
│ │
C ────5───── D
│ │
7 6
│ │
─ E (4) ───┘ (A,E)=8, ...
step 1: (A,B,1). T={(A,B,1)}, uf: {A,B}, {C}, {D}, {E}.
step 2: (B,C,2). T += (B,C,2), uf: {A,B,C}, {D}, {E}.
step 3: (A,C,3). 같은 컴포넌트 → skip.
step 4: (B,D,4). T += (B,D,4), uf: {A,B,C,D}, {E}.
step 5: (C,D,5). 같은 → skip.
step 6: (D,E,6). T += (D,E,6), uf: {A,B,C,D,E}.
|T| = 4 = |V|-1. 종료.
MST = {(A,B,1), (B,C,2), (B,D,4), (D,E,6)}. 총 비용 13.
그림 12.1ᵇ ― Prim 의 단계별 진행.
같은 그래프, start = A.
step 1: T = {A}. 외부 간선 후보: (A,B,1), (A,C,3), (A,E,8).
가장 가벼움 (A,B,1) → T = {A,B}.
step 2: 외부 후보: (B,C,2), (B,D,4), (A,C,3), (A,E,8).
min = (B,C,2). T = {A,B,C}.
step 3: 외부: (C,D,5), (C,E,7), (B,D,4), (A,E,8). min = (B,D,4). T = {A,B,C,D}.
step 4: 외부: (D,E,6), (C,E,7), (A,E,8). min = (D,E,6). T = {A,B,C,D,E}.
MST = {(A,B,1), (B,C,2), (B,D,4), (D,E,6)}. 비용 13. Kruskal 과 같은 결과.
그림 12.1ᶜ ― Borůvka 의 병렬 진행.
초기: 5개 컴포넌트 {A}, {B}, {C}, {D}, {E}.
round 1: 각 컴포넌트의 가장 가벼운 외부 간선:
{A}: (A,B,1)
{B}: (A,B,1) ← {A}와 같은 간선
{C}: (B,C,2)
{D}: (B,D,4)
{E}: (D,E,6)
추가: (A,B,1), (B,C,2), (B,D,4), (D,E,6). (중복 제거)
합병: {A,B,C,D,E} 한 개 컴포넌트.
round 2: 컴포넌트 1개 → 종료.
MST = 위 4개 간선. 같은 결과. 단 2 라운드. *병렬화* 강점.
그림 12.2 ― Cut Property 의 시각화.
임의의 cut (S, V\S):
S ┊ V\S
●────────● ← 가장 가벼운 간선이 cut 가로지름
● ●
●─cut───●───── ← 무거운 간선
● ●
●──────● ← 다른 가벼운 간선
Cut Property: 어떤 cut 에서나 *가장 가벼운 간선* 은 *어떤 MST* 에 들어간다.
증명: 그렇지 않은 MST 가 있다고 가정. 그 MST 에는 *다른 더 무거운*
cut-crossing 간선이 있어야 함 (트리가 연결).
그 무거운 간선을 빼고 가벼운 간선 추가 → 더 가벼운 spanning tree → 모순.
Graph. G = (V, E), 무방향, connected. 각 간선 e ∈ E 에 가중치 w(e) ∈ ℝ.
Spanning tree. T ⊆ E, 모든 정점 포함, 사이클 없음. |T| = |V| - 1.
Cut. (S, V \ S), S ⊂ V, S ≠ ∅. Cut crossing edges = {(u,v) ∈ E : u ∈ S, v ∉ S}.
Cycle. (v_0, v_1, …, v_k = v_0), 각 (v_i, v_{i+1}) ∈ E.
MST. T* = spanning tree with minimum total weight.
보조정리 12.1 (Cut Property).
임의의 cut
(S, V\S)에서 가장 가벼운 cut-crossing 간선e^는 어떤 MST* 에 속한다.e^가 유일한 최소* 면 모든 MST 에 속한다.
증명. 임의의 MST T. e^* ∈ T 라면 끝. e^* ∉ T 라 가정. T ∪ {e^} 는 사이클을 가짐 (T 가 spanning tree, 새 간선 추가). 그 사이클 안에 다른 cut-crossing 간선* e' 가 있어야 (e^ 도 cut crossing, 사이클의 짝수* 개 cross 필요 없지만 다른 cross 가 반드시 있음). w(e') ≥ w(e^). T' = T - {e'} + {e^} 는 spanning tree, w(T') ≤ w(T). T 가 MST 이므로 w(T') = w(T) — e' = e^ 또는 동등 가중치. 유일 최소면 모순, 따라서 모든 MST 에 e^. ∎
보조정리 12.2 (Cycle Property).
임의의 사이클
C에서 가장 무거운 간선e^는 어떤 MST* 에도 속하지 않는다.e^가 유일한 최대* 면 어떤 MST 에도.
증명. Cut property 의 반대 사례. e^ 를 포함하는 MST T 가정. e^ 를 빼면 두 컴포넌트. cycle 의 다른 간선이 두 컴포넌트를 다시 연결. 그 간선이 더 가벼움 → 더 가벼운 MST. 모순. ∎
이 두 property 가 Kruskal, Prim, Borůvka 모두의 정확성 증명의 공통 기반.
보조정리 12.3 (Greedy = Matroid).
Graphic matroid
(E, I)에서I = {F ⊆ E : F 가 forest}는 matroid (정리 3.4). 따라서 간선 가중치에 대한 그리디 = 최소 가중치 basis = MST.
증명. 3장 정리 3.4 의 직접 적용. ∎
정리 12.4 (Kruskal Correctness).
Kruskal 알고리즘은 MST 를 정확히 출력한다.
증명. Cut property (보조정리 12.1) 의 반복 적용. 알고리즘이 간선을 오름차순 으로 보고, 사이클 만들지 않으면 추가. 추가 간선 e 는 현재 forest 의 두 컴포넌트 를 연결 — 그 두 컴포넌트의 cut 에서 가장 가벼운 cut-crossing 간선 (∵ 더 가벼운 것은 이미 처리 됐고 사이클 만들었거나 추가됐음). Cut property 에 의해 e 가 어떤 MST 에 속함. 귀납적으로 모든 추가 간선이 MST. ∎
정리 12.5 (Prim Correctness).
Prim 알고리즘은 MST 를 정확히 출력한다.
증명. 매 단계 현재 트리 vs 외부 라는 cut 에서 가장 가벼운 cut-crossing 간선 추가. Cut property 직접. ∎
정리 12.6 (Borůvka Correctness).
Borůvka 알고리즘은 MST 를 정확히 출력한다 (모든 간선 가중치가 유일한 경우).
증명. 각 단계 각 컴포넌트의 가장 가벼운 외부 간선 추가. 그 간선은 컴포넌트 vs 외부 cut 에서 가장 가벼움 — cut property 에 의해 MST 속함. 유일성 가정으로 중복 추가 가 발생하지 않음 (가중치 동률에는 추가 tiebreaking 필요). ∎
정리 12.7 (Kruskal Complexity).
Kruskal
O(E log E). 정렬O(E log E)+ Union-FindO(E · α(V))≪O(E log E).
증명. 정렬 dominate. ∎
정리 12.8 (Prim Complexity).
Prim with binary heap:
O(E log V). Fibonacci heap:O(E + V log V).
증명. V 번 extract_min + E 번 decrease_key. 이진 힙: V log V + E log V = O(E log V). Fib heap: V log V + E · 1 = O(E + V log V). ∎
정리 12.9 (Karger–Klein–Tarjan 1995).
Randomized MST in expected
O(V + E)time.
증명 개요. Random sampling: 절반의 간선을 랜덤 선택 → 작은 그래프의 MST 재귀 → 큰 그래프 얕은 간선 필터링. 기대 회수 O(log V), 각 회수 O(V + E). 자세한 분석 KKT 1995 §3. ∎
정리 12.10 (Chazelle 2000).
Deterministic MST in
O(E · α(V, E))(inverse Ackermann).
증명 개요. Soft heap — 근사 우선순위 큐, epsilon error 허용 대신 상수 amortized 연산. Borůvka 단계와의 결합. 자세한 증명 Chazelle 2000 §4~§7 (수십 페이지). ∎
하계. 비교 기반 모델 에서 MST 의 하계는 알려져 있지 않음. Ω(E) (모든 간선 봐야) 보다 더 좋은 하한 미확립.
(a) Borůvka–Prim hybrid. 처음 몇 phase 만 Borůvka, 그 다음 Prim.
(b) Verification. 주어진 spanning tree 가 MST 인가 의 검증 은 O(V + E) (Komlós 1985, Dixon–Rauch–Tarjan 1992).
(c) Critical Edge. 모든 MST 에 들어가는 간선 — cut 에서 유일한 최소 또는 cycle 에서 유일한 최소 가 아닌 간선들. O(V + E) 시간에 검출.
(d) Steiner Tree (작은 변형). 부분 정점 만 연결. NP-난해. 11장의 Bitmask DP (Dreyfus–Wagner 1971).
(e) MST in Geometric Graphs. 유클리드 MST — 평면의 점들의 MST. Delaunay triangulation 안에 포함되므로 O(n log n).
(f) Dynamic MST. 간선 추가/삭제 시 MST 유지. O(n^{1/2}) per update (Eppstein 1997).
(g) MST under Updates (online). 간선 가중치가 변할 때 MST 유지. 어려운 영역.
그림 12.3 ― 알고리즘 가계도.
Borůvka (1926)
체코어 학술지
│
┌─────────┼─────────┐
▼ ▼ ▼
Jarník Kruskal Prim
(1930) (1956) (1957)
체코어 미국 Bell Labs
│
┌───┼───┐
▼ ▼ ▼
Karger Chazelle Verification
Klein (2000) (1985, 1992)
Tarjan O(E·α)
(1995) randomized
O(V+E)
Kruskal 1956 Proc. AMS 의 3 페이지. 매우 짧고 우아. Kruskal 의 연결된 그래프와 외판원 의 두 주제. MST 알고리즘은 반 페이지 에 — 의사코드 + 정확성 증명.
Prim 1957 BSTJ 의 13 페이지. Bell System 의 전화망 응용 — 최소 비용 전화선 연결. Prim 자신은 Borůvka 와 Jarník 의 존재를 몰랐음.
Borůvka 1926 체코어 — 22 페이지의 형식적 증명. 모라비아의 전력 그리드 설계 의 응용. 1985년 Graham–Hell 의 영어 번역과 해설 Annals of the History of Computing 에 게재.
Otakar Borůvka (1899–1995). 체코슬로바키아 수학자. Masaryk University Brno (1934~). 1995년 96세에 작고. MST 의 진정한 첫 발견자 로 1985년 공식 인정 받음.
Joseph Kruskal (1928–2010). 미국 통계학자, 컴퓨터 과학자. Princeton (1952 박사), Bell Labs (1959~1993). MST 외에도 multi-dimensional scaling (1964) — 데이터 시각화의 표준 도구. 통계학과 알고리즘의 다리.
Robert C. Prim (1921–2009). Bell Labs (1956~). MST 알고리즘 외에 signal processing 도 큰 기여.
Bernard Chazelle (1955~). 프랑스 출생. Yale 박사 (1980). Princeton (1986~). 계산 기하 와 알고리즘 이론 의 거장. Soft heap (2000) 이 그의 가장 유명한 자료구조 발명. 2014년 그의 책 The Discrepancy Method (2000) 가 알고리즘 분석의 한 정점.
Expert 12 — 도로 — 의 풀이.
1. 그래프 모델링 — 도시 = 정점, 도로 후보 = 간선, 건설 비용 = 가중치. 2. Kruskal + 4장 Union-Find — O(E log E) 시간. n = 1만 도시, m = 10만 도로 = 약 1700만 연산 = 0.1초. 3. Critical Edge 검출 — 각 간선마다 그 간선이 어떤 cycle 의 유일 최대인가 또는 어떤 cut 의 유일 최소인가 검사. O(V + E) per query 또는 O((V+E) log V) 일괄. 4. 자료 출력 — MST + critical edges 의 목록.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/12-road.html
왜 이 장이 책 전체에서 특별한가. MST 는 그리디 + matroid + Union-Find 의 세 도구가 한 자리에 결합 되는 대표 사례. 3장 (matroid), 4장 (Union-Find), 12장 (MST) 의 세 장이 한 알고리즘 안에서 만남. 책의 architecture 의 한 명료한 사례.
Borůvka 의 한 그림 — 1926년 모라비아의 전력 그리드. 100년 전, 체코 시골에서 전력선의 비용 최소화 를 위해 발명된 알고리즘이 — 21세기에도 수많은 분야의 핵심 도구. 역사적 보존 의 한 사례 — 학술적 인정이 60년 지나 도래했지만, 알고리즘 자체는 그 시점부터 작동 하고 있었다.
그림 12.4 ― MST 알고리즘 복잡도 표.
알고리즘 시간 자료구조
───────────────────────────────────────────────────────
Kruskal O(E log E) 정렬 + Union-Find
Prim (binary heap) O(E log V) 이진 힙
Prim (Fibonacci heap) O(E + V log V) Fib 힙
Borůvka O(E log V) UF 또는 컴포넌트 표
Borůvka–Prim hybrid O(E log* V) (개선)
Karger–Klein–Tarjan expected O(V+E) random sampling
Chazelle O(E · α(V,E)) Soft Heap
───────────────────────────────────────────────────────
"거의 선형" 까지는 알려진 상태. *완전 선형* 의 결정적 알고리즘은 미해결.
현대 응용 — Network design, clustering. MST 의 21세기 응용 — 클러스터링 (MST 의 long edges 제거하면 natural clusters), image segmentation (graph cut 의 MST 기반), phylogenetic tree (생물 진화 트리), VLSI 회로의 net routing. 한 알고리즘이 수많은 분야의 기본 도구 가 되는 것 — 1장 (Dijkstra), 4장 (Union-Find), 6장 (BFS) 의 공통 운명.
다음 장으로 가는 다리. 13장 (Integral Image) 은 완전히 다른 영역 — 2D 픽셀 격자 의 부분합 계산. 그러나 전처리 + 빠른 쿼리 의 공통 패러다임. MST 도 그래프의 전처리 (정렬 + UF) + 빠른 critical edge 쿼리. 알고리즘 책의 internal connectivity.
[Boruvka1926]
[Kruskal1956]
[Prim1957]
[Jarnik1930]
[KargerKleinTarjan1995]
[Chazelle2000]
[Tarjan1983]
[GrahamHell1985]
전체 항목은 bibliography.md.
한 번의 전처리로, 모든 사각형 영역의 합을 O(1) 에 — 4번의 덧셈으로.
"After preprocessing, an arbitrary rectangle sum can be computed in just 4 array references." — Paul Viola, Michael Jones, Rapid Object Detection Using a Boosted Cascade of Simple Features (2001).
| 항목 | 값 |
|---|---|
| Expert № | 13 |
| 주연 | Integral Image / Summed-Area Table (Crow, 1984; Viola–Jones, 2001) |
| 조연 | 1D prefix sum, Haar wavelet, Mipmaps, Box filter |
| 원논문 | Crow (1984). "Summed-Area Tables for Texture Mapping." Computer Graphics 18: 207–212. |
| 대표 교과서 | OpenCV manual, Computer Vision (Szeliski 2010) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
반도체 공장의 결함 검출 시스템. 1024×1024 픽셀의 칩 영상. 모든 16×16 영역 의 밝기 합 을 계산해 비정상 영역 (밝기 합이 임계 초과) 을 찾는다. 모든 가능한 16×16 윈도우 의 수 = (1024-15)² ≈ 100만. 각 윈도우의 합을 직접 계산 하면 16² = 256 픽셀. 총 100만 × 256 = 2.56억 연산. 너무 느림.
이 자리에서 Integral Image 가 등장한다. 한 번의 전처리 — 입력 영상에서 모든 픽셀에 대해 (0,0) 부터 그 픽셀까지의 모든 픽셀의 합 — 으로 integral image I(x, y) 계산. 단 한 번의 O(W×H) 패스. 그 후로 임의의 사각형 (x1, y1, x2, y2) 의 합 은 4번의 lookup + 3번의 덧셈/뺄셈:
RectSum = I(x2, y2) - I(x1-1, y2) - I(x2, y1-1) + I(x1-1, y1-1)
Inclusion-Exclusion 의 직접 적용. O(1). 모든 윈도우 = 100만 × 1 = 100만 연산. 전처리 100만 + 쿼리 100만 = 200만. 수백 배 빠름.
이 아이디어는 1D 의 prefix sum — 1차원 누적합 — 의 2D 일반화. 1D prefix sum 은 모든 알고리즘 수업 의 첫 자료구조. 2D 일반화는 1984년 Franklin Crow 가 컴퓨터 그래픽스 의 texture mapping 에 응용하며 Summed-Area Table (SAT) 이라 명명. 그러나 기계 학습 의 얼굴 인식 분야에서 대중화 된 것은 2001년 Paul Viola (당시 Mitsubishi Electric Research Labs) 와 Michael Jones 가 CVPR 학술대회에서 발표한 Viola–Jones face detector. Haar-like features — 사각형 영역의 밝기 합 차이 — 의 빠른 계산이 integral image 로 가능. 그 결과 최초의 실시간 얼굴 검출. 디지털 카메라의 얼굴 자동 초점, 페이스북의 얼굴 태그 제안 — 모두 이 알고리즘의 자손.
Expert 13 — 칩 — 의 풀이는 Integral Image 의 직접 응용. 영상 전처리 후 모든 윈도우 쿼리 O(1). 21세기 컴퓨터 비전 의 기초 도구 중 하나.
1D prefix sum 의 역사 는 고대. 누적합의 아이디어는 수학사 이전. 그러나 computer science 의 자료구조 로의 형식화 는 1960년대 Knuth 의 TAOCP 시점. 오래된 도구.
2D 일반화는 1984년 Computer Graphics 학술지 18권 3호 (SIGGRAPH 1984) 에 Franklin C. Crow 가 Summed-Area Tables for Texture Mapping 6 페이지짜리 논문으로 발표. Texture mapping 의 anti-aliasing — 화면 픽셀에 대응하는 texture 영역의 평균 — 을 빠르게 계산. 그가 integral image 라는 용어를 처음 사용한 것은 아니지만 — 그 아이디어를 컴퓨터 그래픽스에 도입 한 첫 인물.
문제는 — 1984년의 Crow's algorithm 이 컴퓨터 비전 분야로는 천천히 전파. 1990년대 컴퓨터 비전 에서는 대부분 픽셀 단위 처리. 2D prefix sum 같은 전처리 도구 가 덜 알려짐.
전환점은 2001년 CVPR (Computer Vision and Pattern Recognition 학술대회). Paul Viola (MIT 박사 출신, MERL) 와 Michael Jones (Compaq Research) 가 Rapid Object Detection Using a Boosted Cascade of Simple Features 발표. 알고리즘은 3 핵심 기여: (1) Haar-like features — 사각형 영역의 차이로 얼굴 패턴 검출. (2) Integral Image — 그 features 를 O(1) 에 계산. (3) AdaBoost + Cascade — 빠른 거부.
Viola–Jones 의 전체 시스템 은 최초의 실시간 얼굴 검출 — 1초에 수십 프레임. 그 시점까지 얼굴 검출은 몇 초 ~ 분 이 필요했음. 발표 후 5년간 수백 편의 후속 연구. 카메라 회사들 (Canon, Nikon, Sony) 의 디지털 카메라 얼굴 자동 초점 이 그 직접 적용. 페이스북의 얼굴 태그 도 2008년 도입 시 Viola–Jones 기반.
오늘날 deep learning (CNN, RetinaNet 등) 이 정확도 면에서 Viola–Jones 를 능가 하지만, 연산 효율 면에서는 integral image 가 여전히 임베디드 시스템 (IoT 카메라, 차량 인식) 의 표준. 한 알고리즘이 40년 가까이 살아남았다.
Integral Image 의 의사코드:
algorithm BuildIntegralImage(image I, width W, height H):
# I 는 W×H 픽셀 영상. I_int 는 (W+1)×(H+1) (zero padding).
for x in 0 to W: I_int[x][0] = 0
for y in 0 to H: I_int[0][y] = 0
for y in 1 to H:
for x in 1 to W:
I_int[x][y] = I[x-1][y-1] + I_int[x-1][y] + I_int[x][y-1] - I_int[x-1][y-1]
return I_int
algorithm RectangleSum(I_int, x1, y1, x2, y2):
# x1, y1 = 좌상단 (포함). x2, y2 = 우하단 (포함).
return I_int[x2+1][y2+1] - I_int[x1][y2+1] - I_int[x2+1][y1] + I_int[x1][y1]
전처리 O(W·H). 각 쿼리 O(1). 모든 가능한 윈도우 의 합 계산 = O(W·H) + (윈도우 수) · O(1) = O(W·H).
작은 예시 — 3×3 영상.
I: I_int (4×4 padding):
1 2 3 0 0 0 0
4 5 6 0 1 3 6
7 8 9 0 5 12 21
0 12 27 45
계산:
I_int[1][1] = I[0][0] + I_int[0][1] + I_int[1][0] - I_int[0][0] = 1+0+0-0 = 1.
I_int[2][1] = I[1][0] + I_int[1][1] + I_int[2][0] - I_int[1][0] = 2+1+0-0 = 3.
I_int[3][1] = 3+3+0-0 = 6.
I_int[1][2] = 4+1+0-0 = 5. 잠깐, I_int[1][1]+I[0][1]+I_int[0][2]-I_int[0][1]=1+4+0-0=5.
I_int[2][2] = 5+5+3-1 = 12.
I_int[3][2] = 6+12+6-3 = 21.
...
쿼리 RectangleSum(0,0, 1,1) = sum of {1,2,4,5} = 12.
I_int[2][2] - I_int[0][2] - I_int[2][0] + I_int[0][0] = 12-0-0+0 = 12. ✓
쿼리 RectangleSum(1,1, 2,2) = sum of {5,6,8,9} = 28.
I_int[3][3] - I_int[1][3] - I_int[3][1] + I_int[1][1] = 45-12-6+1 = 28. ✓
그림 13.1 ― Integral Image 의 시각화.
원본 영상: Integral Image:
1 2 3 1 3 6
4 5 6 5 12 21
7 8 9 12 27 45
각 I_int[i][j] = 좌상부터 (i,j) 까지의 *모든 픽셀의 합*.
사각형 합 (i1,j1) ~ (i2,j2):
A ┃ B
━━╋━━ ← (i1, j1)
C ┃ D
← (i2, j2)
D = I_int[i2][j2] = A + B + C + RectangleSum
⟹ RectangleSum = D - B - C + A.
Inclusion-Exclusion 의 직접 적용.
그림 13.1ᵇ ― Viola–Jones Haar-like features.
Type A: Type B: Type C:
┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐
│ + │ │ - │ │ + │ │ + │ │ - │ │ + │
└───┘ └───┘ └───┘ └───┘ └───┘ └───┘
┌───┐
│ - │
└───┘
2 rectangles 3 rectangles 3 rectangles
(eye-cheek) (lip-chin) (vertical stripe)
각 feature value = "white rect sum" - "black rect sum"
각 rect sum 은 integral image 로 O(1).
따라서 한 feature value = O(1).
Viola–Jones 의 cascade 에 *수천 개* feature.
전체 평가 = 수천 × O(1) = 여전히 빠름.
그림 13.1ᶜ ― Tilted Integral Image (45도 회전).
Tilted SAT: 좌상-우하 대각선 기반 합.
╲╲╲ 각 픽셀 (x,y) 에서:
╲╲╲ I_tilted(x, y) =
╲╲ ● 위 대각선의 모든 합
╲╲╲ + 좌 대각선의 모든 합
╲╲ + (자기 자신)
- 위 좌 대각선 중복 (Inclusion-Exclusion)
45도 회전 사각형 합 계산 가능 → 회전된 패턴 검출.
Lienhart-Maydt 2002 의 Viola-Jones 확장.
Image. I : [0, W-1] × [0, H-1] → ℝ. 각 픽셀의 강도.
Integral Image. I_{int}(x, y) = Σ_{i ≤ x, j ≤ y} I(i, j) (1-indexed with zero padding).
Rectangle. R = [x_1, x_2] × [y_1, y_2]. R sum = Σ_{(x,y) ∈ R} I(x, y).
보조정리 13.1 (Recurrence).
I_{int}(x, y) = I(x, y) + I_{int}(x-1, y) + I_{int}(x, y-1) - I_{int}(x-1, y-1).
증명. I_{int}(x, y) = 좌상부터 (x, y) 까지의 모든 합 = (좌상부터 (x-1,y)) + (좌상부터 (x,y-1)) - (좌상부터 (x-1,y-1)) + I(x,y). Inclusion-Exclusion. 마지막 빼기는 (x-1, y-1) 자리까지 가 두 번 합산 됐기 때문. ∎
보조정리 13.2 (Rectangle Sum Formula).
R_sum(x_1, y_1, x_2, y_2) = I_{int}(x_2, y_2) - I_{int}(x_1-1, y_2) - I_{int}(x_2, y_1-1) + I_{int}(x_1-1, y_1-1).
증명. Inclusion-Exclusion 직접. I_{int}(x_2, y_2) 가 전체 4 영역의 합. 빼기 두 항이 두 변두리 두 사각형. 더하기 마지막 항이 두 번 뺐던 좌상 사각형. ∎
정리 13.3 (Integral Image Correctness).
Algorithm 이 정확히 모든 픽셀의
I_{int}(x, y)와 임의 사각형 합을 계산한다.
증명. 보조정리 13.1 (recurrence) 의 동적 계획법 의 표준. 보조정리 13.2 (rectangle formula) 의 직접 적용. ∎
증명이 깨지는 가정. (1) 정수 overflow — 큰 영상에서 누적합이 32비트 int 의 한계 초과. 64비트로 해결. (2) 부동 소수점 정밀도 — 큰 영상에서 누적 오차. Kahan summation 등으로 완화.
정리 13.4 (Complexity).
전처리
O(W·H). 각 쿼리O(1).
증명. 전처리 = 2D 격자 한 번 순회. 쿼리 = 4 lookup + 3 산술. ∎
(a) Higher-dimensional integral image. 3D, 4D 일반화. n차원에서 사각형 합 = 2^n lookup.
(b) Tilted Integral Image (Lienhart–Maydt 2002). 45도 회전된 사각형의 합도 계산. Viola–Jones 의 보강.
(c) Variance Integral. I_{int}(I^2) 와 함께 사용해 분산 도 O(1) 계산.
(d) Multi-channel. RGB 영상은 각 채널 별도 integral.
(e) Approximate Integral. Box filter 의 근사화. Heckbert 1986 의 texture filtering.
그림 13.2 ― 응용 가계도.
Crow (1984)
Summed-Area Table
Computer Graphics
│
┌──────────┼──────────┐
▼ ▼ ▼
Texture Box filter Mipmaps
mapping (1986) (Williams 1983)
│
▼
Viola-Jones (2001)
Face Detection
│
┌──────────┼──────────┐
▼ ▼ ▼
Embedded Mobile Deep Learning
Cameras Face ID (대체됨, 일부)
2010s
Crow 1984 Computer Graphics SIGGRAPH 의 6 페이지. Texture mapping 의 anti-aliasing 응용. 컴퓨터 그래픽스 의 표준.
Viola–Jones 2001 CVPR 의 8 페이지. Haar-like features + Integral Image + AdaBoost cascade. 컴퓨터 비전의 한 정점.
Franklin C. Crow (1948~). 미국 컴퓨터 과학자. Utah 박사. 1980년대 NASA Ames 와 Apple Inc. Computer Graphics 의 거장.
Paul Viola (1969~). MIT 박사 (1995). MERL (1999~2003), Microsoft Research. machine learning + computer vision 의 한 시대를 만든 인물.
Michael Jones (1968~). Compaq Research, MERL. 얼굴 인식 + 객체 검출. Viola–Jones 외에도 boosting algorithms 의 한 거장.
Expert 13 — 칩 — 의 풀이.
1. 칩 영상을 grayscale 로 변환. 2. Integral Image 계산. O(W·H). 3. 모든 16×16 윈도우의 합 쿼리 각각 O(1). 총 O(W·H). 4. 임계값 넘는 윈도우 → 결함 후보. 5. (옵션) Tilted Integral Image 로 45도 회전 윈도우 도 검출.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/13-chip.html
왜 이 장이 책 전체에서 특별한가. Integral Image 는 알고리즘 책의 가장 단순한* 도구. 그러나 그 영향력은 거대. 한 줄의 점화식* 이 수많은 응용 의 기초. 영리한 전처리 + 빠른 쿼리 의 패러다임의 한 대표 사례.
한 알고리즘이 한 산업을 바꾼 사례. 2001 Viola–Jones 가 디지털 카메라 산업 을 바꿨다. 그 전까지 카메라의 autofocus 는 대상의 contrast 또는 거리 센서 만 사용. 그 후로 얼굴 검출 → autofocus 가 표준. 페이스북, 인스타그램, 스냅챗의 얼굴 인식 필터 까지 — 한 알고리즘의 연쇄 작용. 그 한 줄의 점화식 I_{int}(x, y) = I(x, y) + I_{int}(x-1, y) + I_{int}(x, y-1) - I_{int}(x-1, y-1) 이 전 세계 수십억 명의 사진 위에서 매 초마다 작동한다.
그림 13.3 ― DP 패러다임으로서의 Integral Image.
Integral Image = 2D DP 의 한 사례.
유사 DP 들 (모두 같은 *전처리 + 빠른 쿼리* 패턴):
1D prefix sum: O(n) 전처리, O(1) 구간 합 쿼리.
2D Integral Image: O(WH), O(1) 사각형 합 쿼리.
Range Min Query (RMQ): O(n log n) Sparse Table, O(1) min 쿼리.
2D RMQ: O(WH log WH), O(1) 2D min 쿼리.
Segment Tree: O(n) 전처리, O(log n) 쿼리 + update.
Fenwick Tree (BIT): O(n log n), O(log n) 쿼리 + update.
Persistent Segment Tree: O(n log n), O(log n) 시간 여행.
"전처리 + 쿼리" 자료구조의 풍부한 가족.
그림 13.4 ― 응용 분야 차림표.
응용 Integral Image 사용
──────────────────────────────────────────────────
Texture mapping (Crow 1984) antialiasing
Face detection (V-J 2001) Haar features
Object detection bbox proposals
Image stitching region matching
Reduce noise box filter / blur
Video stabilization frame difference
Medical imaging tumor detection
Astronomical imaging star photometry
VLSI inspection defect detection
──────────────────────────────────────────────────
Optimization의 한 시. Integral Image 의 우아함 은 영리한 자료구조 한 줄 이 알고리즘 전체 효율 을 바꾼다는 데 있다. 11장 (Bitmask DP) 도 상태 인코딩 트릭, 4장 (Union-Find) 도 path compression 트릭. 작은 발견 이 큰 효과 를 만드는 — 알고리즘 이론의 본질 의 한 사례. Crow 1984 의 한 페이지짜리 아이디어가 얼굴 인식, 의료 영상, 자동차 카메라 의 공통 부품 으로 자라난 것.
Sparse Variant — Sparse Image. 대부분 픽셀이 0인 영상 에서는 Sparse SAT 가 효율적. non-zero 좌표만 저장, 쿼리 시 binary search. O(n_nz · log n_nz) 쿼리, n_nz = non-zero 개수. 의료 영상 같은 대부분 배경 사례에서 유용.
[Crow1984]
[ViolaJones2001]
[Heckbert1986]
[Shanbhag2010]
[OpenCV]
[FreemanAdelson1991]
전체 항목은 bibliography.md.
외판원이 한 명이면 TSP. 여럿이면 — 새로운 결정: 누구에게 어느 손님을 줄까.
"We have considered two heuristics: nearest-neighbor and a 'savings' technique. The savings method... computes a number for each pair of routes, which represents the savings obtained from combining them." — Clarke, Wright, Scheduling of Vehicles from a Central Depot to a Number of Delivery Points, Operations Research (1964).
| 항목 | 값 |
|---|---|
| Expert № | 14 |
| 주연 | Clarke–Wright Savings (1964) |
| 조연 | Sweep Algorithm (1972), Two-Phase (1981), Tabu Search VRP, ALNS |
| 원논문 | Clarke–Wright (1964). "Scheduling of Vehicles from a Central Depot…" OR 12: 568–581. |
| 대표 교과서 | Toth–Vigo The Vehicle Routing Problem (2002, 2014) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
배달 회사. 중앙 창고 (depot) 에서 여러 트럭 이 출발해 수십~수백 명의 손님 에게 짐을 배달한다. 각 트럭은 용량 제한 — 한 번에 실을 수 있는 짐의 최대 무게. 각 손님은 짐의 무게 와 위치 가 정해져 있다. 어느 트럭이 어느 손님을 어느 순서로 방문 할까. 총 주행 거리 최소. 이것이 Vehicle Routing Problem (VRP). 1959년 Dantzig–Ramser 가 Management Science 에 truck dispatching 으로 처음 정식화.
VRP 는 TSP 의 일반화 — 한 외판원 대신 여러 명 + 각자 capacity. NP-난해 (TSP 의 일반화이므로 적어도 그만큼 어려움). 5장 (NN+Or-opt) 의 TSP 휴리스틱 이 부분 문제 로 등장하지만 — VRP 의 고유한 결정 — 어느 트럭이 어느 손님을 — 은 추가 차원.
가장 유명한 VRP 휴리스틱이 Clarke–Wright Savings. 1964년 G. Clarke 와 J. W. Wright (둘 다 영국 운영연구자) 가 Operations Research 12 권에 발표. 60년이 지난 2024년 현재까지 표준 교과서 알고리즘. 직관적이고 단순 — 그러나 실용에서 강력.
알고리즘의 핵심 아이디어 는 savings. 두 손님 i, j 가 각자 다른 트럭 에 배정되어 있다고 하자. 두 손님의 trip 비용 = 2·d(0, i) + 2·d(0, j) (각자 왕복). 두 손님을 같은 트럭으로 합치면 d(0, i) + d(i, j) + d(j, 0). 절약 (savings) = d(0, i) + d(0, j) - d(i, j). 이 savings 가 클수록 합치는 것이 이득. 그리디 — savings 큰 순 으로 합치기, capacity 위반 시 거부.
이 알고리즘이 왜 작동하는가 — 그리디 + 작은 휴리스틱. 근사 보장은 없음. 그러나 실용에서 손님 50명 이내라면 OPT 의 5~10% 이내. 50명 이상에서는 2-opt / Or-opt 와 결합 해 향상.
Expert 14 — 배달원 — 의 풀이는 Clarke–Wright 의 직접 응용 + 후처리 (2-opt / Or-opt). 5장 (NN+Or-opt) 의 TSP 도구 가 VRP 의 부분 단계 로 재사용.
1959년 George Dantzig (LP Simplex 의 그) 와 J. H. Ramser 가 Management Science 1권 1호에 The Truck Dispatching Problem 발표. VRP 라는 분야의 출발. operations research 의 creator academic journal (1953년 창간) 의 첫 호 중 한 자리.
1964년 G. Clarke 와 J. W. Wright (Royal Aircraft Establishment, UK) 가 OR 12 권에 Clarke–Wright Savings 발표. 13 페이지. VRP 의 첫 우아한 휴리스틱. 영국 운영연구 의 대표적 성과.
1970~80년대에 VRP variants 가 폭발적 발전. (1) VRP with Time Windows (VRPTW) — 5장의 택시. (2) Capacitated VRP (CVRP) — 본 장의 핵심. (3) VRP with Pickup and Delivery (VRPPD). (4) Dynamic VRP — 시간에 따라 새 손님. 각자 별도의 algorithm community.
1972년 Wren–Holliday 의 Sweep Algorithm — 각도별로 손님을 정렬해 트럭에 할당. 2-phase 알고리즘 의 한 사례. 1981년 Fisher–Jaikumar 의 generalized assignment 기반 접근 — LP 사용.
1990년대 Metaheuristics — Tabu Search, SA, GA 의 VRP 적용. Adaptive Large Neighborhood Search (ALNS, Ropke–Pisinger 2006) 가 현대 VRP 의 표준.
2002년 Toth–Vigo 가 The Vehicle Routing Problem 책 출간 — VRP 의 현대 교과서. 2014년 2nd edition 으로 update.
Clarke–Wright Savings 의 의사코드.
algorithm ClarkeWright(customers, depot, capacity):
# 1. 초기: 각 손님이 자기 자신만의 trip (depot → 손님 → depot).
routes = [[i] for i in customers]
# 2. savings 계산.
savings = []
for i in customers:
for j in customers, j != i:
s_ij = d(depot, i) + d(depot, j) - d(i, j)
savings.append((s_ij, i, j))
sort savings descending
# 3. savings 가장 큰 쌍부터 합치기.
for (s, i, j) in sorted savings:
if s <= 0: break # 합쳐서 손해
r_i = route containing i
r_j = route containing j
if r_i == r_j: continue
# i 가 r_i 의 끝 (또는 시작) 이고, j 가 r_j 의 시작 (또는 끝) 일 때만 합치기 가능
if (i at boundary of r_i) and (j at boundary of r_j):
if total_demand(r_i) + total_demand(r_j) <= capacity:
merge r_i and r_j into one route
return routes
복잡도 O(n²) (savings 계산) + O(n² log n) (정렬) + O(n²) (합병) = O(n² log n).
작은 예시 — 4 손님 + 창고 0:
좌표: 0=(0,0), 1=(2,0), 2=(0,2), 3=(-2,0), 4=(0,-2). Capacity 2.
거리 행렬:
0 1 2 3 4
0: 0 2 2 2 2
1: 2 0 √8 4 √8
2: 2 √8 0 √8 4
3: 2 4 √8 0 √8
4: 2 √8 4 √8 0
savings:
s(1,2) = 2 + 2 - √8 ≈ 1.17
s(1,3) = 2 + 2 - 4 = 0
s(1,4) = 2 + 2 - √8 ≈ 1.17
s(2,3) = 2 + 2 - √8 ≈ 1.17
s(2,4) = 2 + 2 - 4 = 0
s(3,4) = 2 + 2 - √8 ≈ 1.17
초기: 4 trips: [1], [2], [3], [4]. 각자 demand 1.
step 1: 가장 큰 savings s(1,2) ≈ 1.17. demand(1) + demand(2) = 2 = capacity. OK 합병.
routes: [1,2], [3], [4].
step 2: s(3,4) ≈ 1.17. 합병.
routes: [1,2], [3,4].
step 3: 다음 savings 는 *boundary* 조건 안 맞음 (1-3, 1-4 등은 [1,2]의 1이 boundary, [3] 또는 [4] 가 단일).
실제 합병 시 1+3+4 = 3 > capacity. 거부.
종료.
최종 routes: [0,1,2,0], [0,3,4,0]. 비용 = (2 + √8 + 2) × 2 = 8 + 2√8 ≈ 13.66.
비교 — 그리디 (NN): 손님 별 왕복 4 × 4 = 16. Clarke–Wright 가 14 정도. 절약 약 2.
그림 14.1 ― Savings 의 직관.
합치기 전: 합치기 후:
depot ── i ── depot depot ── i ── j ── depot
depot ── j ── depot
비용 = 2·d(0,i) + 2·d(0,j) 비용 = d(0,i) + d(i,j) + d(j,0)
savings s(i,j) = 합치기 전 - 합치기 후
= 2·d(0,i) + 2·d(0,j) - d(0,i) - d(i,j) - d(j,0)
= d(0,i) + d(0,j) - d(i,j)
savings > 0 ⟺ 합치는 것이 이득.
savings 작아질수록 *합치는 것이 손해* (i, j 가 서로 멀거나, 둘 다 depot 가깝지 않음).
그림 14.1ᵇ ― Clarke–Wright 의 단계별 합병.
초기 (4 손님): 4 routes
0─1─0 0─2─0 0─3─0 0─4─0
savings 큰 순으로 합병 시도:
step 1: s(1,2) 최대. 2 routes:
0─1─2─0 0─3─0 0─4─0
step 2: s(3,4) 시도. 2 routes:
0─1─2─0 0─3─4─0
step 3: s(2,3) 시도 — boundary 조건 + capacity 확인.
만약 capacity 가 4 이상이면 합쳐서 하나의 큰 route.
그렇지 않으면 종료.
최종: 2 routes (capacity 2일 때).
그림 14.2ᵇ ― ALNS 의 제거-재삽입 사이클.
현재 해 S:
Route 1: 0-1-2-3-0
Route 2: 0-4-5-6-0
Route 3: 0-7-8-9-0
1. *Destroy*: 일부 손님을 random 제거.
Removed: {2, 5, 8}
S': Route 1: 0-1-3-0, Route 2: 0-4-6-0, Route 3: 0-7-9-0
2. *Repair*: 제거된 손님을 *최선 위치* 에 *재삽입*.
2를 어디에? 각 가능한 자리의 *추가 비용* 계산, 최소.
3을 어디에? 마찬가지.
8을 어디에? 마찬가지.
3. Accept S'' if better (또는 SA-style 확률적).
반복 — 매 사이클마다 *destroy + repair*. 큰 이웃 탐색.
그림 14.2 ― VRP variants 의 차림표.
variant 제약 추가
──────────────────────────────────────────────
CVRP (Capacitated) 트럭 용량 제한
VRPTW + 시간 창
VRPPD + pickup/delivery 페어
MDVRP + multiple depots
Dynamic VRP + 시간에 따라 새 손님
Periodic VRP + 여러 day routing
Open VRP 창고로 돌아오지 않음
Stochastic VRP 수요 확률적
──────────────────────────────────────────────
Customers. {1, 2, ..., n} + depot 0.
Distance. d(i, j) ≥ 0. 보통 metric (triangle inequality).
Demand. q(i) ≥ 0. 트럭 capacity C. 모든 q(i) ≤ C.
Route. r = (0, i_1, i_2, ..., i_k, 0). capacity feasible 이란 Σ q(i_j) ≤ C.
Solution. Disjoint routes R = {r_1, ..., r_m} covering all customers.
Cost. cost(R) = Σ cost(r_i).
보조정리 14.1 (Savings Identity).
두 route
r_i = (0, ..., i, 0),r_j = (0, j, ..., 0)를 boundary 에서 합쳐r_{ij} = (0, ..., i, j, ..., 0)로 만들면,cost(r_{ij}) = cost(r_i) + cost(r_j) - s(i, j), 여기서s(i, j) = d(0, i) + d(0, j) - d(i, j).
증명. 합치기는 (i, 0) 와 (0, j) 두 간선 제거 + (i, j) 한 간선 추가. 변화 = -d(i,0) - d(0,j) + d(i,j). 원래 비용 보존 + 이 변화 = cost(r_i) + cost(r_j) + (d(i,j) - d(i,0) - d(0,j)) = cost(r_i) + cost(r_j) - s(i,j). ∎
보조정리 14.2 (Savings Monotonicity).
Metric 거리 (
d(i,j) ≤ d(i,0) + d(0,j)) 가정 아래, 모든s(i, j) ≥ 0.
증명. s(i,j) = d(0,i) + d(0,j) - d(i,j). Metric inequality 으로 d(i,j) ≤ d(i,0) + d(0,j) = d(0,i) + d(0,j). 따라서 s(i,j) ≥ 0. ∎
이 보조정리가 savings 알고리즘 의 종료 보장 — 음수 savings 이전에 알고리즘이 모든 가능한 합병 을 시도하고 종료.
관찰 14.3 (No Optimality Guarantee).
Clarke–Wright Savings 알고리즘은 전역 최적성을 보장하지 않는다. 그러나 feasible solution 생성을 보장.
증명. (Feasibility) 매 합병이 capacity 확인 후에만, 초기 trivial solution (각자 1 손님) 이 feasible 이므로. (Non-optimality) 작은 반례 — capacity 가 빠듯해 그리디가 잘못된 합병 을 선택할 수 있음. ∎
왜 그래도 사용하는가. Clarke–Wright 는 실용에서 OPT 의 5~10% 이내 (Toth–Vigo 2002 의 실험). 근사 비율의 worst-case 보장은 없지만, 대부분 사례에서 좋음. 5장 (NN+Or-opt) 의 log n 보장과 비교 — VRP 의 추가 차원 (트럭 할당) 때문에 워스트 비율 분석 어려움.
정리 14.4 (Time Complexity).
Clarke–Wright의 시간
O(n² log n).
증명. Savings 계산 O(n²), 정렬 O(n² log n), 합병 처리 O(n² · α(n)) (Union-Find 와 같은 자료구조). ∎
n=100 면 약 10⁴ × 7 ≈ 70만 연산. 밀리초 단위. 실용에서 전처리 빠름.
(a) Sweep Algorithm (Wren–Holliday 1972). 각도별로 손님 정렬, 트럭에 각도 순서로 할당.
(b) Fisher–Jaikumar (1981). Generalized Assignment + TSP 풀이 결합.
(c) Tabu Search VRP (Gendreau 1994). 국소 이동 의 과거 금지.
(d) GRASP (1990s). Greedy Randomized Adaptive Search Procedure.
(e) ALNS (Ropke–Pisinger 2006). Adaptive Large Neighborhood Search. 손님 제거 + 재삽입 의 큰 이웃. 현재 VRP 최강 휴리스틱.
(f) Branch-and-Cut-and-Price. 정확 알고리즘. n ≤ 100~200 까지.
(g) Genetic Algorithm VRP. 진화 알고리즘. 인구 기반 탐색.
Clarke–Wright 1964 OR 12 의 14 페이지. 영국 Royal Aircraft Establishment 의 internal report 의 발전.
§1 Introduction 에서 truck dispatching 의 실용적 동기. Dantzig–Ramser 1959 인용.
§2 Algorithm. savings 정의 + 알고리즘 의사코드 + 작은 예제.
§3 Computational Experience. IBM 7090 에서의 실험.
G. Clarke, J. W. Wright. 영국 운영연구자. RAE (Royal Aircraft Establishment). 그들 외에는 알려진 다른 큰 결과 없음 — 한 결과 로 영구히 학술사에 남음.
George B. Dantzig (1914–2005). LP Simplex (1947) 의 발명자. Mathematical Programming 분야 의 창시자. 1959 VRP 의 형식적 정식화. 알고리즘 + 운영연구 분야 의 거인.
Expert 14 — 배달원 — 의 풀이.
1. Clarke–Wright Savings 으로 초기 routes. 2. 2-opt + Or-opt (5장) 으로 각 route 내부 향상. 3. (옵션) ALNS 또는 Tabu Search 으로 큰 변화 — 한 손님을 다른 route 로 이동.
다른 장과의 연결. 2장 (Local Search) 의 Or-opt 가 VRP 의 후처리. 5장 (NN+Or-opt) 와 같은 도구 다른 응용. 책의 연결성.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/14-delivery-man.html
왜 이 장이 책 전체에서 특별한가. VRP 는 TSP 의 자연스러운 확장. 한 문제의 확장 이 새 분야 전체 를 만드는 대표 사례. 한 추가 차원 (여러 트럭) 이 수십 variants. 실용 운영연구 의 큰 분야.
현대 응용 — Uber Eats, Amazon, FedEx. VRP 의 21세기 응용 — 푸드 딜리버리, e-commerce 배송, 우편물 배포. Clarke–Wright 의 60년 전 알고리즘 이 현재 매일 수억 건의 배송 의 기초 부품. 진화한 ALNS, Genetic VRP 가 상용 시스템의 표준. 한 알고리즘 분야의 놀라운 산업화.
그림 14.3 ― 알고리즘별 비교.
알고리즘 품질 시간 구현 난이도
─────────────────────────────────────────────────────────────
Clarke-Wright Savings OPT의 5~10% O(n²log n) 쉬움
Sweep OPT의 10% O(n log n) 쉬움
Tabu Search VRP OPT의 2~3% O(n² · 반복) 중간
ALNS OPT의 1~2% O(반복 큼) 어려움
Branch-and-Cut-and-Price OPT 정확 n ≤ 200 매우 어려움
─────────────────────────────────────────────────────────────
그림 14.4 ― 알고리즘 가계도.
Dantzig–Ramser (1959)
Truck Dispatching
│
┌──────────────┼──────────────┐
▼ ▼ ▼
Clarke-Wright Sweep 정확한 방법
(1964) (Wren-Holliday (Branch & Bound)
savings 1972) (1960s+)
│ │ │
└────────┬─────┴──────────────┘
▼
Tabu Search VRP
(Gendreau 1994)
│
▼
ALNS (2006)
현대 최강 휴리스틱
다음 장으로 가는 다리. 15장 (Facility Location) 도 위치 + 할당 의 같은 마음. VRP 의 고정 손님 vs 변동 트럭 이 Facility Location 의 고정 시설 vs 변동 손님 으로 대칭화. 두 문제가 조합 최적화의 같은 가족.
[ClarkeWright1964]
[TothVigo2002]
[Gendreau2007]
[WrenHolliday1972]
[DantzigRamser1959]
[Vidal2022]
전체 항목은 bibliography.md.
시설 몇 개를 어디에 두고, 누구를 어디로 보낼까 — LP 가 분수로 답하면, 우리는 정수로 둥글린다.
"We present a 3.16-approximation for the metric uncapacitated facility location problem, the first constant-factor approximation algorithm." — David Shmoys, Éva Tardos, Karen Aardal, Approximation Algorithms for Facility Location Problems (STOC 1997).
| 항목 | 값 |
|---|---|
| Expert № | 15 |
| 주연 | Facility Location (Shmoys–Tardos–Aardal 1997 LP rounding) |
| 조연 | Hochbaum (1982) greedy, k-center 2-approx, Jain–Vazirani primal-dual (2001) |
| 원논문 | STA (1997). "Approximation Algorithms for Facility Location Problems." STOC. |
| 대표 교과서 | Vazirani Approximation Algorithms (2001), Williamson–Shmoys (2011) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
자연 재해. 한 도시의 한 구역에 대피소 시설 을 짓는다. 시설 후보 위치 m 개, 각 후보의 건설 비용 f_i. 도시 주민 n 명, 각자 위치. 시설 i 가 열려 있으면 주민 j 가 시설 i 까지 거리 비용 c_{ij} 로 갈 수 있다. 어느 시설을 열고, 어느 주민을 어느 시설로 보낼지. 총 건설 비용 + 모든 주민의 이동 비용 합 의 최소화.
이것이 Facility Location Problem (FLP). 1960년대 위치 분석 (location analysis) 의 한 출발. 경제학적 동기 — 어디에 공장, 물류센터, 학교, 병원 을 두는가. 수학적으로는 NP-난해.
Set Cover 와의 관련성. 각 시설을 덮을 수 있는 주민 집합* 으로 볼 때, FLP 는 가중 set cover 의 일반화. Set Cover 의 그리디 log n 근사* (Chvátal 1979, Lovász 1975) 가 한 출발점.
Approximation Algorithm 의 시대 — 1990년대 — 가 FLP 의 형식적 근사 보장 의 출발. 1997년 Shmoys–Tardos–Aardal (STA) 이 LP relaxation + filtering + clustering 으로 3.16-approximation — 상수 비율. 그 전까지 log n 근사만 알려져 있었음. STA 의 결과가 상수 근사의 첫 사례 — 조합 최적화 의 한 정점.
알고리즘의 핵심 아이디어. (1) FLP 를 integer linear program (IP) 으로 정식화. (2) Linear relaxation (LP) — 변수의 정수 제약을 제거. LP 는 다항 시간에 풀이 가능. (3) Rounding — LP 의 분수 해 를 정수 해 로 변환, 비용을 너무 늘리지 않으면서. 이 LP + rounding 패러다임이 근사 알고리즘 의 표준 도구상자.
STA 후 수 년간 근사 비율 이 점진적으로 개선. 1999년 Chudak 의 3.16 → 1.736. 2001년 Jain–Vazirani 의 primal-dual 으로 3-approximation (다른 접근). 2013년 Li 의 현재 최선 1.488-approximation. 상수 비율의 하계 는 약 1.46 (NP-hard).
Expert 15 — 대피소 — 의 풀이는 STA 의 단순화 변형 — LP solver 호출 + filtering 후 시설 선택. 다항 시간 + 보장된 근사 비율. 실용 사용.
1960~70년대 Operations Research 의 Facility Location 연구. Cornuéjols–Nemhauser–Wolsey 1990 의 책 Discrete Location Theory 가 고전적 결과 들을 정리. 그러나 형식적 근사 보장 은 없었음.
Approximation Algorithm 분야 의 본격 시작 — 1990년대. 그 전 Sahni–Gonzalez 1976 가 일반 TSP 의 근사 불가능성, Khanna–Motwani–Sudan 1998 의 PCP theorem 기반 근사 하계 들. Approximation 이 체계적 분야 가 됨.
1997년 STOC 학술대회. Shmoys (Cornell), Tardos (Cornell), Aardal (Utrecht University) 가 Approximation Algorithms for Facility Location Problems 발표. 11 페이지. LP rounding 의 한 정점. 3-approximation (정확히는 3.16) 의 첫 결과.
1998~2000년 동안 후속 결과. Charikar–Guha 1999 의 1.853-approximation (다른 LP). Chudak 1999 의 clever rounding. Jain–Vazirani 2001 의 primal-dual 으로 간결한 알고리즘.
2003년 Sviridenko 의 1.58-approximation. 2013년 Shi Li (Princeton 박사) 의 1.488-approximation — 현재 최선. Mahdian–Ye–Zhang 2002 의 하계 1.463 (NP-hard).
Vazirani 2001 의 책 Approximation Algorithms 가 분야의 표준 교과서. Williamson–Shmoys 2011 의 The Design of Approximation Algorithms 가 현대 표준. 두 책 모두 FLP 의 LP rounding 을 핵심 사례 로 사용.
STA 의 단순화 버전:
algorithm FacilityLocationLPRounding(facilities F, customers C, costs):
# IP 정식화:
# min Σ_i f_i · y_i + Σ_{i,j} c_{ij} · x_{ij}
# s.t. Σ_i x_{ij} = 1 for all j (각 손님이 어떤 시설에 배정)
# x_{ij} ≤ y_i for all i, j (시설이 열려야 손님 받음)
# x_{ij}, y_i ∈ {0, 1} (이진)
# 1. LP relaxation: x_{ij}, y_i ∈ [0, 1]. LP 풀이.
solve LP, get (x*, y*).
# 2. Clustering. 손님을 *주변 시설들의 cost 가중 평균 거리* 로 그룹.
for each customer j, sorted by some criterion:
if j not yet assigned:
find facility i* with x*_{i*,j} > 0 and smallest c.
open facility i*: y_{i*} = 1.
assign j and *nearby customers (sharing LP fractional facility)* to i*.
return chosen facilities and assignments
복잡도 = LP 풀이 (다항) + rounding O((n+m) log n).
작은 예시 — 3 facilities, 4 customers.
f1 cost = 10, f2 cost = 8, f3 cost = 12.
c[i][j] 표:
j1 j2 j3 j4
f1: 1 2 5 8
f2: 6 3 1 2
f3: 4 5 9 1
IP OPT: f1 + f2 = 10+8 = 18 시설 비용 + 손님 비용
f1 → j1 (1), j2 (2). f2 → j3 (1), j4 (2). 손님 비용 = 6.
총 24.
LP: 분수 해 가능. 예 — y_{f1} = y_{f2} = 1, y_{f3} = 0. (정수와 일치)
LP OPT 23 (예시).
STA 의 rounding: LP 해를 *clustering* 으로 정수해.
결과: 24 (= IP OPT 또는 가까운).
3-approximation 보장: ≤ 3 × LP OPT.
그림 15.1 ― LP relaxation 의 시각화.
IP 해 공간: 정수 점 (corner of polytope).
LP relaxation: 모든 polytope (corner + interior).
y
│
1.0 ┃●─────────● ← integer feasible
┃ ╲ ╱
0.5 ┃ ● ● ← LP fractional optimum (lower)
┃ ╲ ╱
┃ ●
0.0 ●─────────●─→ x
0 0.5 1.0
LP OPT ≤ IP OPT.
Rounding: LP 해를 정수해로, 비용 증가는 *근사 비율* 이하.
그림 15.1ᵇ ― IP vs LP.
Integer Programming: Linear Programming Relaxation:
max c^T x max c^T x
s.t. Ax ≤ b s.t. Ax ≤ b
x ∈ {0, 1}^n x ∈ [0, 1]^n
NP-hard (NP-complete). Polynomial (ellipsoid 1979).
정수해. 분수해.
LP OPT ≤ IP OPT (max 문제).
*Integrality gap* = IP OPT / LP OPT.
gap 작을수록 LP가 좋은 추정.
Facility Location의 integrality gap = 1.463 정도 (worst case).
따라서 1.463-approx 보다 좋은 LP rounding 불가능.
그림 15.1ᶜ ― LP rounding 의 패러다임.
IP (어려움)
↓ relax
LP (다항 시간)
↓ solve LP solver (Simplex, Interior Point)
LP* (분수 해)
↓ rounding (다양한 기법)
IP' (정수 해, 근사 OPT)
주요 rounding 기법:
1. Threshold rounding: x* > 0.5 → 1, else 0
2. Randomized rounding: P(x = 1) = x*
3. Iterative rounding (Lau-Ravi-Singh 2011)
4. Dependent rounding (Bansal et al.)
5. Iterative LP rounding (이 장의 STA)
그림 15.2 ― Clustering 의 직관.
LP 분수 해:
y*_{f1} = 0.5, y*_{f2} = 0.5, y*_{f3} = 0.5
각 손님 j 가 *여러 시설에 분수 배정*.
Filtering: 손님 j 의 *LP cost* 중심 c_j^* = LP 비용.
가까운 시설들만 후보로.
Clustering: 각 손님을 *cost 작은 순* 으로 처리.
j 가 아직 미배정이면:
그 주변 LP 시설 중 *cheapest* 를 *열고*,
그 시설을 *공유* 하는 모든 손님들을 그 시설에 배정.
결과: 각 손님이 LP 비용의 3 배 이하로 정수 배정.
Facility Location. Facilities F, customers C. Open cost f_i ≥ 0 for i ∈ F. Connection cost c_{ij} ≥ 0.
Solution. Y ⊆ F (열린 시설), σ : C → Y (배정). Total f(Y) = Σ_{i ∈ Y} f_i + Σ_j c_{σ(j), j}.
Metric FLP. c_{ij} 가 metric (c_{ik} ≤ c_{ij} + c_{jk}).
LP relaxation. x_{ij} ∈ [0, 1], y_i ∈ [0, 1]. Linear constraints. Polynomial time solvable.
보조정리 15.1 (LP Lower Bound).
LP_OPT ≤ IP_OPT.
증명. 모든 정수 해가 LP 의 feasible 한 점이므로. ∎
보조정리 15.2 (Triangle Inequality Utilization).
Metric FLP 에서, 두 손님
j, j'가 LP 에서 공유 시설 (x^_{ij} > 0 andx^_{ij'} > 0) 인 i 가 있으면,c_{j j'} ≤ c_{ij} + c_{ij'}.
증명. Triangle inequality. ∎
이 보조정리가 clustering 의 보장 — 같은 시설을 공유하는 손님들의 상호 거리 가 LP 비용 으로 bounded.
정리 15.3 (Shmoys–Tardos–Aardal 1997).
Metric FLP 의 STA algorithm 은 4-approximation (원래 3.16, 후속 변형 더 좋음).
증명 스케치. LP rounding 의 비용 분석. 각 시설의 open cost + 각 손님의 connection cost 가 LP value 의 상수 배 이하. 자세한 부등식 사슬은 STA 1997 §3 (5 페이지). 후속 작업 — Chudak 1999 의 3.16-approx, Li 2013 의 1.488-approx. ∎
증명이 깨지는 가정. Metric 가정 — 미성립 시 근사 불가능 (set cover 의 log n 하계). Capacitated (시설의 손님 수 제한) — 더 어려움.
정리 15.4 (Time).
LP 풀이
O((n+m)^{3.5})(interior point) 또는O((n+m)^3)(simplex 평균). RoundingO((n+m) log (n+m)). 총 다항.
증명. LP 풀이 = Khachiyan 1979 의 Ellipsoid 다항 시간. Rounding = 정렬 + 단순 작업. ∎
(a) k-Median. 시설 개수 k 제한. Charikar–Guha–Tardos–Shmoys 2002 의 6 2/3-approx.
(b) k-Center. 시설 개수 k, minimax 거리. Hochbaum–Shmoys 1985 의 2-approx. 하계 2 - ε (NP-hard).
(c) Capacitated FLP. 각 시설이 최대 손님 수. LP rounding 더 어려움.
(d) Hierarchical FLP. 시설의 계층.
(e) Online FLP. 손님이 시간 순으로 도착. Meyerson 2001.
STA 1997 STOC 의 11 페이지. Approximation algorithms 분야의 한 정점.
David B. Shmoys (1959~). MIT 박사 (1984). Cornell (1985~). Approximation Algorithms 의 거장. Williamson–Shmoys 2011 의 공저자.
Éva Tardos (1957~). 헝가리 출생. Cornell (1989~). Theory of computing 의 거장. Kleinberg–Tardos 2005 (3장 §10 참조) 의 공저자.
Karen Aardal. Utrecht University (네덜란드). Combinatorial optimization 거장.
Expert 15 — 대피소 — 의 풀이.
1. LP 정식화 + LP solver 호출 (예 — Gurobi, CPLEX, Python의 PuLP). 2. Filtering + Clustering 으로 정수 해. 3. (옵션) Local Search 으로 향상.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/15-shelter.html
왜 이 장이 책 전체에서 특별한가. Facility Location 은 근사 알고리즘 분야의 대표 사례. LP rounding 의 방법론적 시범. 1997 STA 이후 근사 알고리즘 의 황금기 — 2000년대의 수많은 근사 비율 개선. 한 알고리즘 분야의 역사적 정점.
근사 알고리즘의 한 시 — 정확성을 포기한 자리의 정량성. 7장 (MCF) 같은 정확 다항 알고리즘은 NP-난해의 자리에서 무력. 8장 (SA) 같은 경험적 휴리스틱 은 보장 없음. 15장의 근사 알고리즘 은 그 사이 — 다항 시간 + 정량적 보장. NP-난해를 받아들이고 도 수학적으로 옳은 결과를 얻는다. 이 균형 이 현대 조합 최적화의 한 큰 줄기.
PTAS 와 APX-completeness. 어떤 문제 (Knapsack, Euclidean TSP) 는 Polynomial-Time Approximation Scheme (PTAS) — 임의의 ε > 0 에 대해 (1+ε)-approx. 어떤 문제 (Set Cover, FLP) 는 APX-complete — 상수 인자 근사가 가능하지만 PTAS 는 불가능 (P ≠ NP 가정). 이 분류학 이 근사 알고리즘 이론의 큰 풍경.
다음 장으로 가는 다리. 16장 (Convex Hull Trick) 은 완전히 다른 영역 — DP 최적화 의 기하학적 트릭. 그러나 두 알고리즘 모두 — 영리한 자료구조 + 수학적 분석 의 패러다임. 한 책의 연결성.
그림 15.2ᵇ ― 다른 location problems 의 비교.
Problem Hardness Best Approx
──────────────────────────────────────────────────────
Metric Facility Loc NP-hard, 1.463 lb 1.488 (Li 2013)
k-Center (metric) NP-hard, 2 lb 2 (Hochbaum-Shmoys 1985)
k-Median (metric) NP-hard, 1+2/e lb 2.675 (Byrka et al 2014)
Set Cover NP-hard, ln n lb ln n+1 (greedy)
Maximum Coverage NP-hard, 1-1/e lb 1-1/e (greedy)
──────────────────────────────────────────────────────
각 행: "이 비율 이하의 다항 시간 알고리즘은 NP-hard"
각 알고리즘: "최선 결과"
그림 15.3 ― 근사 비율 발전사.
해 결과 알고리즘
──────────────────────────────────────────────────────
1990 이전 log n approx (Set Cover 기반) Hochbaum 1982
1997 3.16-approx Shmoys-Tardos-Aardal
1999 3-approx Chudak
1999 1.853-approx Charikar-Guha
2001 3-approx (primal-dual) Jain-Vazirani
2003 1.58-approx Sviridenko
2013 1.488-approx Li
하계 1.463 (NP-hard) Guha-Khuller 1999
──────────────────────────────────────────────────────
"이론과 실용의 16년 격차" — 1997~2013 의 발전.
[ShmoysTardosAardal1997]
[Hochbaum1982]
[LinVitter1992]
[JainVazirani2001]
[Vazirani2001]
[WilliamsonShmoys2011]
[CharikarGuhaTardosShmoys2002]
전체 항목은 bibliography.md.
n개의 선들 중 어느 x 위치에서 가장 낮은 점 — 볼록 껍질의 아래쪽이 답한다.
"The convex hull trick reduces certain dynamic programming recurrences from O(n²) to O(n log n) or even O(n)." — Algorithm competition folklore, 2000년대 후반.
| 항목 | 값 |
|---|---|
| Expert № | 16 |
| 주연 | Convex Hull Trick (CHT), Li Chao Tree |
| 조연 | Slope Trick, Knuth's Optimization (1971), Divide and Conquer DP, Yao Quadrangle (1980) |
| 원논문 | Knuth (1971). "Optimum Binary Search Trees." Acta Informatica 1: 14–25. |
| 대표 교과서 | Competitive Programming 3 (Halim), cp-algorithms.com |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
TV 신호의 화질 최적화. n 개의 시간 구간 으로 나뉜 영상. 각 구간을 압축 방식 으로 처리 — 압축 비용 + 화질 손실. 어느 구간들을 같은 압축 방식 으로 묶을지가 결정. DP 점화식: dp[i] = min_{j < i} (dp[j] + cost(j, i)). 단순 DP O(n²).
여기서 cost(j, i) 가 특별한 구조 — 예 cost(j, i) = a_j · x_i + b_j — 선형 일 때, Convex Hull Trick (CHT) 으로 O(n log n) 또는 O(n). n² → n log n 의 마법.
CHT 의 직관. DP 의 각 j 가 한 직선 y = a_j · x + b_j 를 정의. dp[i] 의 답 = x = x_i 에서 가장 낮은 직선의 y 값 + b_i. 모든 직선들의 lower envelope 가 볼록 (concave from below) — 상수 시간 또는 logarithmic 쿼리.
자료구조 — Convex Hull 의 아래쪽 절반 (lower hull). 단조 스택 으로 직선 추가 + binary search 로 쿼리. 또는 Li Chao Tree — segment tree 위에 직선을 재귀적 삽입.
Expert 16 — TV화질 — 의 풀이는 interval DP + CHT. 결정. O(n log n). 실용.
DP optimization 의 역사. 1971년 Donald Knuth (Stanford) 의 Optimum Binary Search Trees — O(n³) DP 의 O(n²) 단축 — Knuth's optimization. DP 의 monotone 구조 이용.
1980년 F. F. Yao (Stanford) 의 Quadrangle Inequality — DP cost function 의 quadrangle inequality (cost(a,c) + cost(b,d) ≤ cost(a,d) + cost(b,c)) 가 성립하면 O(n²) 단축. Knuth's optimization 의 일반화.
1989년 Galil–Giancarlo 의 DP speedup 정리 — 생물정보학 (DNA 정렬) 의 DP 최적화.
Convex Hull Trick 의 역사 는 알고리즘 대회 (competitive programming) 의 민간 전승. 1990년대 후반 동유럽 (러시아, 폴란드) 의 오린피아드 학생들 사이에서 경험적으로 발견. 학술적 형식적 등장 은 불명확. 2000년대 후반 USACO, Codeforces 의 표준 도구가 됨. Li Chao Tree 도 competitive programming 의 도구 — Li Chao 이라는 중국 학생 의 이름. 정확한 출처 불명.
오늘날 CHT 는 알고리즘 대회의 표준 트릭. 그러나 학술적 분석 은 2010년대 의 Chen–Chan 2011 등 후속 결과.
CHT 의 의사코드 (offline, sorted queries).
algorithm ConvexHullTrick(lines [(a_i, b_i)]):
# 직선들 add 순서대로. 쿼리 x_i 가 단조 증가.
hull = [] # stack of lines, lower envelope
def add(a, b):
while |hull| >= 2:
(a1, b1) = hull[-2]
(a2, b2) = hull[-1]
# 새 직선이 마지막 두 직선의 교차점에서 왼쪽 → 마지막 직선 제거
if intersect_x(a1, b1, a, b) <= intersect_x(a1, b1, a2, b2):
hull.pop()
else:
break
hull.append((a, b))
def query(x):
# binary search 또는 단조 query 시 단조 pointer
while |hull| >= 2 and hull[ptr](x) > hull[ptr+1](x):
ptr += 1
return hull[ptr](x)
복잡도: 모든 add 합 O(n) (amortized, 각 직선이 한 번 만 hull 에 추가/제거). 쿼리 단조면 O(n), 임의면 O(log n).
작은 예시 — 3 직선: L1: y = 2x + 1, L2: y = x + 3, L3: y = -x + 5.
교차점:
L1 ∩ L2: 2x+1 = x+3 → x = 2. y = 5.
L2 ∩ L3: x+3 = -x+5 → x = 1. y = 4.
L1 ∩ L3: 2x+1 = -x+5 → x = 4/3. y = 11/3.
Lower envelope (y 값 작은 직선):
x < 1: L1 (y=2x+1 작음 if 2x+1 < x+3 → x < 2; L1 < L3 ↔ 2x+1 < -x+5 ↔ x < 4/3.)
실제로 작은 x 에서 가장 낮은: L1 또는 L3?
x=0: L1=1, L2=3, L3=5. L1 작음.
x=1: L1=3, L2=4, L3=4. L1 작음 (4의 동률 L2, L3).
x=1.33: L1 = 3.67, L3=3.67. 교차.
x>4/3: L3 가 L1 보다 낮음.
Hull 구성 (a 오름차순 = -1, 1, 2):
L3 (a=-1, b=5) add.
L2 (a=1, b=3) add. 두 직선 → 유지.
L1 (a=2, b=1) add. L1, L2 교차 x=2, L1, L3 교차 x=4/3.
L2 가 *필요한 자리* — L1, L3 교차 (x=4/3) 보다 *왼쪽* 에서만.
그러나 L1, L2 교차 (x=2) > L1, L3 교차 (x=4/3), L2 는 *제외* 가능.
결과 hull = {L3, L1}.
쿼리 x=0: L3 (y=5) vs L1 (y=1) → L1.
쿼리 x=3: L3 (y=2) vs L1 (y=7) → L3.
그림 16.1 ― Lower Envelope 의 시각화.
y
│ L3 (slope -1)
│\
│ \
│ \ L1 (slope 2)
│ \ /
│ ╲ /
│ ╲ ━━━━━━━━●
│ ╲ /
│ \ /
│ \ /
│ X ← 교차점 (x*)
│ / \
│ / \
└─────────────────→ x
x*
x < x*: L3 가 작음. x > x*: L1 이 작음.
Lower envelope = L3 (left) + L1 (right).
*위 영역* (전부보다 위) 의 직선은 envelope에 없음 = "dominated".
그림 16.1ᵇ ― CHT 단계별 (3 직선).
직선 추가 순 (slope 오름차순): L3 (a=-1), L2 (a=1), L1 (a=2)
step 1: L3 추가. hull = [L3].
step 2: L2 추가. |hull| < 2 → 그냥 추가. hull = [L3, L2].
step 3: L1 추가. |hull| = 2, 마지막 두 L3, L2.
L3, L2 교차 x_12 = 1.
L3, L1 교차 x_13 = 4/3 ≈ 1.33.
x_13 (1.33) > x_12 (1) → L2 가 envelope 의 일부.
BUT WAIT: 알고리즘은 L1 추가 시 *L1, L2 교차* 와 *L3, L2 교차* 비교.
L1, L2 교차: 2x+1=x+3 → x=2.
L3, L2 교차 x_12 = 1.
x(L1,L2)=2 > x_12=1 → L2 유지.
hull = [L3, L2, L1].
쿼리:
x = 0 → L3 (5), L2 (3), L1 (1). min = 1 = L1. (잘못 — L3 envelope 의 왼쪽)
다시 보면 작은 예제가 실수 있음. 적절한 알고리즘:
slopes 오름차순으로 추가하면 hull 의 첫 직선 = 가장 작은 slope = L3.
작은 x 에서는 가장 큰 slope L1 이 *가장 낮을 수 없음* (slope 작은 L3가 더 빨리 내려옴).
문제는 b 도 고려.
결론: CHT 의 구현은 *slopes 정렬 + b 비교*. 작은 예제 직접 확인 필요.
그림 16.2 ― Li Chao Tree 의 구조.
Segment tree, 각 노드에 한 직선:
[0, 16]
├── [0, 8]
│ ├── [0, 4]
│ │ ├── [0, 2]
│ │ └── [2, 4]
│ └── [4, 8]
└── [8, 16]
├── [8, 12]
└── [12, 16]
삽입: 한 직선을 *root 부터 재귀* 삽입.
매 노드: 새 직선과 현재 노드 직선의 *중점 비교*.
더 낮은 쪽이 *그 노드*, 다른 쪽은 *해당 절반* 으로 재귀.
쿼리 x: x 가 포함된 모든 노드의 직선 값 중 min.
둘 다 O(log n).
Lines. L_i: y = a_i · x + b_i. i = 1, ..., n.
Lower envelope. LE(x) = min_i L_i(x) = min_i (a_i x + b_i). 볼록 함수 (max of linear = convex; min of linear = concave; min of -L 이 convex 이므로 -LE 가 concave, LE 자체는 piecewise-linear concave).
Dominated. L_i 가 dominated 이란, 모든 x 에서 다른 L_j 가 더 낮음. envelope 에 없음.
보조정리 16.1 (Hull Stack Invariant).
CHT 의 hull stack 은 lower envelope 의 왼쪽에서 오른쪽 의 직선들. 인접한 두 직선의 교차 x 좌표가 오름차순.
증명. hull 추가 시 마지막 두 직선의 교차점 비교 가 정확히 이 invariant 를 유지. ∎
보조정리 16.2 (Amortized O(1) per line).
CHT 의 총 add 비용 은 O(n). 각 직선이 최대 한 번 hull 에 들어가고 한 번 제거됨.
증명. Aggregate analysis. ∎
정리 16.3 (CHT Correctness).
CHT 가 모든 쿼리에 정확한 답 (lower envelope value) 반환.
증명. hull invariant + 쿼리 시 단조 pointer (단조 쿼리) 또는 binary search (임의 쿼리). ∎
증명이 깨지는 가정. 비선형 cost — CHT 적용 불가. Concave cost — upper envelope (CHT 의 변형) 사용.
정리 16.4 (Complexity).
Add 총
O(n). Query 단조시O(n), 임의시O(log n)per query. Li Chao tree:O(log V)per op (V = x range).
증명. 보조정리 16.2 + binary search 분석. ∎
Knuth's Optimization (다른 DP optimization). dp[i][j] = min_{i ≤ k < j} (dp[i][k] + dp[k+1][j] + cost(i, j)). quadrangle inequality 성립 시 opt(i, j) 의 monotonicity → O(n²) 단축 (보통 O(n³)).
(a) Slope Trick. piecewise-linear convex function 의 고정된 형태 유지 — heap 으로.
(b) Divide and Conquer DP. quadrangle inequality 가 없어도 일부 DP 를 O(n log n) 으로.
(c) Aliens Trick (Wqs Binary Search). unconstrained 문제로 변환 + binary search.
(d) Knuth's Optimization. §7 참조.
(e) Yao's Quadrangle Inequality. §2 참조.
Knuth 1971 Acta Informatica 1 의 12 페이지. Optimum Binary Search Tree 의 O(n²) DP. Knuth's optimization 의 시작.
Donald Knuth (1938~). Stanford. The Art of Computer Programming 의 저자. 알고리즘 분석의 거장.
F. F. Yao. Stanford. DP optimization 의 거장.
Li Chao. 중국 competitive programmer. Li Chao Tree 의 명명자.
Expert 16 — TV 화질 — 의 풀이.
1. DP 점화식 정의 — dp[i] = min_j (dp[j] + a_j · x_i + b_j). 2. *CHT 로 min term* 을 빠르게 — O(n log n). 3. (옵션) Li Chao Tree** — 임의 x 쿼리 지원.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/16-tv-quality.html
왜 이 장이 책 전체에서 특별한가. CHT 는 알고리즘 대회의 한 보석. 기하학과 DP 의 만남. 학술적 출처가 거의 없는 민간 전승 알고리즘 — 그러나 수많은 대회 문제 의 표준 도구. 알고리즘 분야의 대회 문화 의 한 사례.
그림 16.2ᵇ ― CHT 가 적용 가능한 DP 형태.
일반 DP:
dp[i] = min_j (dp[j] + cost(j, i))
CHT 적용 가능: cost(j, i) = a_j · b_i + c_j
(j 항과 i 항이 *곱셈* 으로만 결합, c_j 는 j 만의 함수)
dp[i] = min_j (dp[j] + c_j + a_j · b_i)
= min_j (line_j(b_i)) where line_j(x) = a_j · x + (dp[j] + c_j)
따라서 *직선 j 의 값 in x = b_i*. CHT 그대로 적용.
예:
Knapsack with linear cost
Optimal Tree Construction (Knuth-Yao)
Convex DP problems (e.g., TV image, billboard placement)
그림 16.3 ― DP 최적화 가족.
기법 적용 조건 단축
──────────────────────────────────────────────────────────
CHT cost 가 *linear* O(n²)→O(n log n)
Knuth's Optimization quadrangle inequality O(n³)→O(n²)
Divide & Conquer DP monotone OPT O(n²)→O(n log n)
SMAWK totally monotone matrix O(nm)→O(n+m)
Aliens Trick (WQS) constrained k O(n² k)→O(n² log k)
Slope Trick piecewise linear convex n log n total
──────────────────────────────────────────────────────────
작은 발견의 큰 효과. CHT 는 한 줄의 관찰 — 직선들의 lower envelope 이 볼록 — 에서 시작한다. 그 한 줄이 DP 의 n² → n log n 으로 수많은 문제의 시간복잡도 를 질적으로 개선. 알고리즘 이론의 작은 보석들 의 한 사례.
그림 16.4 ― Slope Trick 의 그림 (비교).
Slope Trick: *piecewise linear convex* 함수의 단순 갱신.
convex f 를 *기울기 변화점* 들의 priority queue 로 표현:
slopes: ..., -3, -1, 0, +1, +2, ...
각 slope 변화점 = 한 breakpoint x.
max heap (left), min heap (right):
left = "기울기가 음수인 영역의 breakpoints"
right = "기울기가 양수인 영역"
함수의 *최소값 위치* = left top vs right top 중심.
연산:
1. f(x) → f(x - c): 모든 heap top 에 c 더하기 (lazy).
2. f(x) + |x - a|: 새 breakpoint a 추가 (양쪽 heap 에 1 씩).
3. min f: heap top 비교 + accumulate.
각 연산 O(log n). 총 O(n log n).
대회의 다른 자주 등장 트릭.
다음 장으로 가는 다리. 17장 (Online Algorithm) 은 시간 미래를 모르는 알고리즘. 16장의 offline DP 와 정반대. competitive analysis 의 자리. 같은 책 안에서 시간을 다루는 두 다른 자세.
[Bentley1978]
[BentleySaxe1980]
[KnuthOptimization]
[YaoQuadrangle]
[GalilGiancarlo1989]
[LiChao_competitive]
[ChenChan2011]
전체 항목은 bibliography.md.
미래를 모르는 알고리즘이, 미래를 다 아는 알고리즘과 비교됐을 때 얼마나 나쁜가 — 그 비율이 알고리즘의 가치.
"An online algorithm A is called c-competitive if for every sequence of requests, A's cost is at most c times the optimal offline cost plus a constant." — Daniel Sleator, Robert Tarjan, Amortized Efficiency of List Update and Paging Rules (1985).
| 항목 | 값 |
|---|---|
| Expert № | 17 |
| 주연 | Online Algorithm + Competitive Analysis (Sleator–Tarjan, 1985) |
| 조연 | k-server (Manasse–McGeoch–Sleator 1990), Marker (Fiat et al 1991), Ski Rental, Paging LRU |
| 원논문 | Sleator–Tarjan (1985). "Amortized Efficiency of List Update and Paging Rules." CACM. |
| 대표 교과서 | Borodin–El-Yaniv Online Computation (1998) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
은행 시스템. 매 초 수많은 트랜잭션 요청 도착. 각 요청은 처리 또는 나중에 처리 의 결정. 미래의 요청을 모르는 상태 에서 결정. 미래를 아는 사람 — offline OPT — 이라면 완벽한 일정. 그러나 우리는 그것을 모름. 현재 결정의 후회 (regret) 가 얼마나 큰가.
이 자리에 Online Algorithm 분야. Sleator–Tarjan 1985 의 Competitive Analysis 가 형식화. Competitive ratio = Online cost / Offline OPT. 이 비율이 작을수록 알고리즘이 좋음. c-competitive 알고리즘은 Online ≤ c · OPT + constant.
전형적 사례 — Paging. 메모리에 k 페이지만 들어감. 새 페이지 요청 시 cache miss → 한 페이지 축출 (evict). 어느 페이지를 evict? 미래에 가장 늦게 쓸 페이지가 이상적 (Belady's algorithm, offline OPT). Online 은 모름. LRU (Least Recently Used) 같은 휴리스틱 — 경험적으로 좋음. Sleator–Tarjan 1985 가 LRU 의 competitive ratio = k (cache 크기) 임을 증명. k 보다 좋은 deterministic algorithm 없음 (하한 증명).
Randomized online algorithm 은 더 좋을 수 있음. Marker algorithm (Fiat et al 1991) 이 2 H_k 정도 ratio (H_k 는 harmonic). 그 후로 expected ratio 의 정밀한 분석. 1995년 Koutsoupias–Papadimitriou 의 k-server 의 2k-1 competitive — Work Function Algorithm.
Expert 17 — 은행 — 의 풀이는 cache 관리 + LRU 변형. 다른 측면에서는 online matching 으로도 — 들어오는 트랜잭션을 직원 에게 online 배정.
1985년 Daniel Sleator (CMU) 와 Robert Tarjan (Princeton) 가 Communications of the ACM 28권 2호에 Amortized Efficiency of List Update and Paging Rules 발표. 7 페이지짜리. Competitive ratio 라는 개념의 형식적 등장. List update (자주 검색되는 원소를 앞으로) 와 Paging (캐시 관리) 두 응용.
Amortized analysis (4장의 Tarjan 1975) 의 발전. Potential function 으로 worst-case 보장. 이 1985 논문이 online algorithm 의 시작점.
1990년 Manasse–McGeoch–Sleator 의 k-server 발표. k 대의 server 가 metric space 위 요청에 응답. k-server conjecture — deterministic 2k-1 lower bound. 5년 뒤 1995년 Koutsoupias–Papadimitriou 가 Work Function Algorithm 으로 (2k-1)-competitive 증명 — conjecture 의 한 정점.
1991년 Fiat–Karp–Luby–McGeoch–Sleator–Young 의 Competitive Paging — randomized 의 power. 2 H_k competitive. 이후 online algorithm 의 randomized variants 가 큰 분야.
1998년 Borodin–El-Yaniv 의 Online Computation and Competitive Analysis 책 — 분야의 표준 교과서. 2000년대~2010년대 online learning, bandit problems, online matching (Karp–Vazirani–Vazirani 1990 의 ranking algorithm) 등으로 확장.
LRU 의 의사코드.
algorithm LRU(cache size k):
cache = OrderedDict() # 최근 사용 순서
for each request p:
if p in cache:
cache.move_to_end(p) # hit
else:
if |cache| >= k:
cache.popitem(first=True) # least recently used 축출
cache[p] = True
return total misses
복잡도 O(1) per request (hash + ordered list).
Marker (randomized) algorithm:
algorithm Marker(k):
cache = set()
marked = set()
for each request p:
if p in cache:
marked.add(p)
else:
# miss
if |cache| < k:
cache.add(p); marked.add(p)
else:
if all in cache are marked:
marked.clear() # 새 phase
# 비-marked 중 random 하나 evict
evict = random choice of cache - marked
cache.remove(evict)
cache.add(p); marked.add(p)
Expected O(H_k)-competitive.
작은 예시 — k=2, 요청 sequence A B C A B C A:
step 1: A miss. cache = {A}.
step 2: B miss. cache = {A, B}.
step 3: C miss. cache 가득. LRU evict A. cache = {B, C}. miss = 3.
step 4: A miss. evict B. cache = {C, A}. miss = 4.
step 5: B miss. evict C. cache = {A, B}. miss = 5.
step 6: C miss. evict A. cache = {B, C}. miss = 6.
step 7: A miss. evict B. cache = {C, A}. miss = 7.
LRU = 7 misses.
Offline OPT (미래 모두 앎): 다른 evict 선택으로 적게 가능.
step 3: C miss, evict B (next-furthest). cache = {A, C}.
step 4: A hit.
step 5: B miss, evict C. cache = {A, B}.
step 6: C miss, evict A. cache = {B, C}.
step 7: A miss, evict B. cache = {C, A}. miss = 5.
LRU 7 vs OPT 5. ratio 7/5 = 1.4. (k=2 이므로 worst case ratio = 2.)
그림 17.1 ― Online vs Offline 의 직관.
요청 stream: r1, r2, r3, ..., r_t, ...
Online ALG: 각 r_t 시점에 *r1, ..., r_t 만 보고* 결정.
미래 r_{t+1}, ... *모름*.
Offline OPT: 전체 sequence *처음부터 알고* 최적 결정.
Competitive ratio c:
ALG(stream) ≤ c · OPT(stream) + const
모든 가능한 stream 에 대해.
"최악의 미래" 에 대해 *그래도 c 배 이내*.
그림 17.1ᵇ ― Ski Rental의 그림 (online algorithm 의 가장 단순한 사례).
스키 = 100불, 매일 빌리기 = 10불, 며칠 탈지 *모름*.
결정: 매일 빌리다가 *언제* 살까?
Online Strategy A: 사지 않음. 매일 빌림.
cost = 10 · (days). days = 100 면 = 1000. (스키 살 때 best=100)
worst ratio = unbounded.
Online Strategy B: 즉시 사기.
cost = 100. days = 1 면 ratio 10.
Optimal deterministic: 9일 빌리고 10일째 사기.
worst (1일만 탐): 10 (정상 OPT) vs 90 + 100 = 100, ratio 10. (혹은 단순 분석:)
worst (영원 탐): 90 + 100 = 190 vs OPT = 100. ratio 1.9.
경계 사례에서 *2-competitive*.
Optimal randomized: e/(e-1) ≈ 1.58-competitive.
그림 17.2 ― Paging 알고리즘 비교.
알고리즘 Competitive (k = cache size)
──────────────────────────────────────────────────────
FIFO (먼저 들어온 evict) k (Sleator-Tarjan)
LRU (least recently used) k (Sleator-Tarjan)
LFU (least frequently used) unbounded (나쁨)
Random evict k (expected)
Marker (randomized) 2 H_k ≈ 2 ln k
Belady (offline OPT) 1
──────────────────────────────────────────────────────
하계 (deterministic): k (= cache size)
하계 (randomized): H_k ≈ ln k
Online problem. Request sequence σ = r_1, r_2, …. Each r_t revealed only at time t.
Online algorithm ALG. Decision at time t depends only on r_1, …, r_t.
Offline OPT. Knows full σ.
Competitive ratio. c = sup_σ ALG(σ) / OPT(σ) (deterministic), or E[ALG(σ)] / OPT(σ) (randomized expected).
c-competitive. ALG is c-competitive if ALG(σ) ≤ c · OPT(σ) + b for some constant b, all σ.
보조정리 17.1 (Eviction Necessity).
Online paging algorithm 의 증명 가능한 competitive ratio 는 최소
k(cache size).
증명 스케치. Adversary 구성 — k+1 페이지를 순환적으로 요청. 어떤 deterministic ALG 도 매 요청 miss. OPT 는 2 페이지마다 1 miss. Ratio k. ∎
보조정리 17.2 (LRU Competitive Ratio = k).
LRU 는 k-competitive.
증명 스케치. phase 분석. 각 phase 에 cache 의 모든 k 페이지가 한 번씩 다른 페이지로 교체. OPT 도 최소 1 miss/phase. LRU 가 모든 페이지 miss/phase — ratio k. ∎
정리 17.3 (Sleator–Tarjan, 1985).
Paging 의 deterministic competitive ratio 의 하한 과 상한 모두 정확히 k. LRU, FIFO 가 이 보장 달성.
증명. 보조정리 17.1 + 17.2. ∎
정리 17.4 (Fiat et al, 1991).
Randomized paging 의 expected competitive ratio 의 하한 은
H_k(harmonic). Marker algorithm 이2 H_k달성. 후속 결과 가 정확히H_k.
증명 개요. Yao's principle + adversary 분석. ∎
정리 17.5 (Per-request Complexity).
LRU 의 한 요청 처리
O(1)(hash + doubly linked list). MarkerO(1)expected.
증명. hash table + DLL 의 표준. ∎
(a) k-Server (1990). k server 가 metric 위 요청에 응답. Competitive ratio = 2k-1 (KP 1995).
(b) Ski Rental. eski 매일 빌릴까 살까. Optimal deterministic 2-competitive. Randomized e/(e-1) ≈ 1.58-competitive.
(c) Online Matching (Karp-Vazirani-Vazirani 1990). bipartite matching online. Ranking algorithm 의 1 - 1/e competitive.
(d) Online LP / Online Set Cover. Recent.
(e) List Update (Sleator-Tarjan 1985). 원소 access 후 어디 위치시킬까. Move-to-Front (MTF) 가 2-competitive.
ST 1985 CACM 의 7 페이지. Competitive ratio 의 형식적 정의. Amortized analysis 의 응용. Online algorithm 분야의 시작.
Daniel Dominic Sleator (1953~). CMU 박사 (1981). CMU 교수 (1985~). Splay tree (1985, Tarjan 과), Link-cut tree (1983).
Robert Tarjan (4장 §10 참조). Splay tree, amortized analysis 의 큰 부분.
Expert 17 — 은행 — 의 풀이.
1. Cache 관리 — LRU 또는 변형. 2. Online matching — 도착 트랜잭션을 직원 또는 워커 에 즉시 배정. 3. (추가) Bandit-style learning — 트랜잭션 분포를 학습하며 적응.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/17-bank.html
왜 이 장이 책 전체에서 특별한가. Online algorithm 은 알고리즘 분야의 한 측면 — 불완전 정보 하에서의 결정. 오프라인 알고리즘 (다른 모든 장) 과 대조. 경쟁 분석 의 정량적 framework 가 1985년 정립.
Yao's Principle 의 정밀. 1977년 Andrew Yao 의 minimax principle — deterministic algorithm 의 worst-case 하한 = randomized algorithm 의 expected lower bound (random input). Online algorithm 의 randomized lower bound 분석의 핵심 도구.
현대 응용 — Web caching, Cloud autoscaling, Algorithmic trading. Online algorithm 의 21세기 응용 — 웹 캐시 (Cloudflare, AWS CloudFront), 자동 클라우드 확장 (요청 패턴 보고 서버 늘리기/줄이기), 주식 자동 거래 (가격 변동 보며 매매). LRU/k-server 의 직접 자손.
그림 17.2ᵇ ― Yao's Principle 의 결합.
Online ALG (randomized) 의 expected lower bound:
= max_{input distribution} min_{deterministic ALG} E[ALG cost / OPT cost]
Yao 의 정리:
randomized worst-case ratio
= max over (input distribution D)
[ deterministic worst-case ratio against D ]
따라서: 하한 증명 = "*나쁜 random input distribution* 을 만들고
모든 deterministic ALG 가 그 distribution 에서 *평균적으로 c-bad*."
응용: paging randomized lower bound H_k 의 증명.
k-server lower bound 의 증명.
그림 17.2ᶜ ― k-server의 일반화.
metric space M, k 대의 server. 요청 r_t 가 M 위의 한 점.
가장 가까운 server (또는 다른 ALG의 선택)를 그 점으로 이동.
비용 = 모든 server 의 총 이동 거리.
k-Server Conjecture (Manasse-McGeoch-Sleator 1988):
모든 metric 에서 *deterministic 2k-1 competitive* 가능.
Status (2024):
- Trees, line, k≤3, special metrics: 증명됨.
- 일반 metric: *Work Function Algorithm* (Koutsoupias-Papadimitriou 1995) 가
O(2k) competitive 까지. 정확히 2k-1 은 *부분 미해결*.
"한 conjecture 가 30+년" — algorithm theory 의 깊은 미해결.
그림 17.3 ― Online vs Offline 의 풍경.
결정 시점 알고 있는 정보 알고리즘 type
─────────────────────────────────────────────────────
결정 후 전체 모든 입력 Offline (1-21장의 대부분)
결정 시 일부 1, ..., 현재까지 Online (이 장)
결정 시 확률 분포만 Stochastic Online
결정 시 없음 미정 Adversarial Online
─────────────────────────────────────────────────────
[SleatorTarjan1985]
[ManasseMcGeochSleator1990]
[FiatKarlin1991]
[BorodinElYaniv1998]
[KoutsoupiasPapadimitriou1995]
[BansalBuchbinderNaor2014]
전체 항목은 bibliography.md.
그래프 위에서 도망자와 추격자 — 누가 이기는가의 답은 그래프의 위상에 있다.
"A graph G is a cop-win graph if and only if it is dismantlable." — Nowakowski–Winkler / Quilliot, Vertex-to-Vertex Pursuit in a Graph (1983).
| 항목 | 값 |
|---|---|
| Expert № | 18 |
| 주연 | Cops and Robbers (Nowakowski–Winkler 1983, Aigner–Fromme 1984) |
| 조연 | Cop number, Dismantlable graphs, Game tree (minimax), Differential Pursuit Games (Isaacs 1965) |
| 원논문 | Nowakowski–Winkler (1983). "Vertex-to-Vertex Pursuit in a Graph." Discrete Math. 43. |
| 대표 교과서 | Bonato–Nowakowski Game of Cops and Robbers (2011) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
숲의 도망자, 경찰. 둘 다 그래프 위의 정점 으로 위치. 매 turn 마다 서로 한 칸씩 이동. 경찰이 도망자와 같은 정점 에 도달하면 체포. 경찰이 항상 이기는 그래프는 어떤 모양 일까? 이것이 Cops and Robbers 의 핵심 질문.
이 문제는 조합 게임 이론 (combinatorial game theory) 의 한 분야. 1976년 T. D. Parsons 의 Pursuit-Evasion in a Graph 가 형식화. 1978년 Alain Quilliot (프랑스) 의 박사 학위 논문이 cop-win graph 의 형식적 특성화 — dismantlable. 1983년 Nowakowski–Winkler (캐나다, 미국) 가 Discrete Mathematics 에 독립적으로 같은 결과 발표.
Dismantlable graph 의 정의 — 반복적으로 vertex 제거 가능, 각 제거 단계에서 vertex 가 어떤 다른 vertex 에 의해 dominated. 한 vertex u 가 v 에 의해 dominated 이란 — N[u] ⊆ N[v] (u 의 closed neighborhood 가 v 의 것에 포함). 직관적으로 — u 의 모든 가능한 도주처가 v 에서도 갈 수 있음. 그래프를 반복적으로 단순화 하다 한 vertex 가 되면 dismantlable.
정리 (Nowakowski–Winkler, Quilliot): 한 경찰 cop 으로 잡을 수 있는 그래프 = dismantlable.
Cop number c(G) = 경찰 몇 명 이 항상 잡을 수 있는 최소 수. 트리 → 1. Cycle (≥ 4) → 2. Complete graph K_n → 1. Petersen graph → 3. 일반 그래프의 cop number 의 상한 은 Meyniel conjecture — c(G) ≤ O(√n) — 가 현재까지 미해결. 알려진 가장 좋은 deterministic 상한은 O(n / 2^{(1-o(1)) √log n}) (Frieze-Krivelevich-Loh 2012).
Expert 18 — 도망자–숲 — 의 풀이는 그래프의 cop-win 검사 + 추적 경로 계산. 도망자가 최선 도주, 경찰이 최선 추격 의 minimax 게임 트리.
Pursuit-evasion 의 역사 는 1950~60년대 Rufus Isaacs 의 differential games 까지 거슬러. 연속 시간 의 추격–도주 게임 — 비행기 격추, 유도탄 등 군사적 응용. 1965년 Isaacs 의 Differential Games 책 — Hamilton-Jacobi 방정식 의 게임 이론적 응용.
그래프 위의 이산 변형 — 1976년 Parsons 의 Pursuit-Evasion in a Graph 가 형식화. Search number (몇 명의 검색자가 움직이는 도망자 를 잡을 수 있는가) 의 개념. 1979년 Megiddo–Hakimi–Garey–Johnson–Papadimitriou 의 NP-completeness of pursuit-evasion in a graph.
Cop and Robber 의 우아한 형식 — 1978년 Quilliot 의 박사 학위 논문 (Université Paris VI) + 1983년 Nowakowski–Winkler 의 Discrete Mathematics. 두 결과가 독립적. 학술적 동시 발견 의 한 사례.
1984년 Martin Aigner–Michael Fromme 의 Discrete Applied Mathematics 에 cop number on planar graphs — planar graph 의 cop number ≤ 3. 유명한 결과. 이후 higher genus surfaces, minor-free graphs 의 cop number 분석.
2010~20년대 Meyniel conjecture 의 진전. Random graph 의 cop number. Online learning algorithm 으로의 응용. cops and robbers 가 조합 게임 이론 의 living frontier.
Dismantlable Check 의 의사코드:
algorithm IsDismantlable(graph G):
while |V(G)| > 1:
find vertex u such that exists v ≠ u with N[u] ⊆ N[v]
if no such u: return False
remove u from G
return True
복잡도 O(V^3) — 각 dismantling step O(V^2) (모든 (u, v) 쌍 검사), V 단계.
Cop-win 검사 + winning strategy:
algorithm CopWinStrategy(G):
# Backwards induction on game state (cop pos, robber pos, whose turn).
# State (c, r, t): cop at c, robber at r, turn t (cop=0, robber=1).
for each state by decreasing "game length":
if c == r: result[state] = "cop wins"
elif cop's turn:
result[state] = "cop wins" if any move leads to "cop wins"
elif robber's turn:
result[state] = "cop wins" if all moves lead to "cop wins"
return strategy table (for each (c, r), the best move).
복잡도 O(V^2 · E) per turn, total over game length = O(V^3 · E) or so.
작은 예시 — 4-cycle C_4 = (a-b-c-d-a).
Dismantling test:
N[a] = {a, b, d}. N[b] = {a, b, c}. N[c] = {b, c, d}. N[d] = {a, c, d}.
N[a] ⊆ N[b]? {a,b,d} ⊆ {a,b,c}? No (d 빠짐).
N[a] ⊆ N[c]? {a,b,d} ⊆ {b,c,d}? No (a 빠짐).
N[a] ⊆ N[d]? {a,b,d} ⊆ {a,c,d}? No (b 빠짐).
... 모든 (u, v) 에서 dominance 없음.
→ C_4 는 dismantlable 아님. → cop-win 아님.
실제로 C_4 에서 cop 1 명: 도망자가 cop 의 *반대편* 으로 항상 이동. 잡히지 않음.
2 명 cop 으로는 가능 (한 cop 이 cycle 의 한 쪽, 다른 한 쪽).
그림 18.1 ― Cop-win vs Cop-lose 의 예시.
Cop-win (dismantlable): Cop-lose (non-dismantlable):
Tree: Cycle C_n (n ≥ 4):
a a───b
/ \ │ │
b c d───c
/ \ \
d e f
Dismantling: N[a] = {a, b, d} ⊄ N[anywhere else]
d dominated by b (N[d]={b,d} ⊆ N[b]={a,b,d,e}).
e dominated by b. f dominated by c. 다 제거.
남은 a-b-c. b dominated by a (또는 c). 제거.
결국 1 vertex. ✓ dismantlable.
Cop number:
Tree: 1. Cycle (n ≥ 4): 2.
그림 18.1ᵇ ― Dismantling 의 단계적 시각화.
원래 그래프 (cop-win 후보):
a─────b
│\ /│
│ \ / │
│ x │ ← x 가 a, b, c, d 모두에 인접
│ / \ │
│/ \│
d─────c
Dismantling:
step 1: N[a] = {a, b, d, x}. N[x] = {a, b, c, d, x}. N[a] ⊆ N[x]. ✓ a 제거.
step 2: 비슷하게 b, c, d 차례로 x 에 dominated. 제거.
step 3: x 만 남음. ✓ dismantlable. cop-win.
Cop strategy: cop 이 x 로 이동. robber 는 어디로 가든 잡힘.
그림 18.2 ― Cop number 의 예시들.
그래프 Cop number
──────────────────────────────────────────────
Path P_n 1
Tree 1
Complete graph K_n 1
Cycle C_n (n ≥ 4) 2
K_{n,m} (complete bipartite) 2 (n, m ≥ 2)
Petersen graph 3
Planar graphs ≤ 3 (Aigner-Fromme 1984)
Random graph G(n, 1/2) Θ(log n)
Hypercube Q_n ⌈(n+1)/2⌉
──────────────────────────────────────────────
Graph game. Graph G = (V, E). Cops c_1, ..., c_k. Robber r. Turns alternate (cops move first). 각 turn 에 한 vertex 이동 (또는 제자리). 모든 cop 이 한 번에 결정 후 동시 이동, robber 도 마찬가지. Catch = robber 와 어떤 cop 이 같은 vertex.
Cop number c(G). 항상 cop 이 잡을 수 있는 cop 수의 최소. Robber 의 perfect play 가정.
Dominated vertex. u 가 v 에 dominated ⟺ N[u] ⊆ N[v] (closed neighborhoods).
Dismantlable. 반복 dominated vertex 제거로 한 vertex 가 됨.
보조정리 18.1 (Dominated Vertex Reduction).
Dominated vertex
u를 제거한G - u의 cop number 는G와 같음.
증명. (≤) G - u 의 cop strategy 를 G 에서도 사용 — robber 가 u 로 가면, cop 이 u 의 dominator v 로 가 잡음. (≥) 자명. ∎
이 보조정리가 dismantlable = cop-win 의 순방향.
보조정리 18.2 (Quilliot 1978, Nowakowski-Winkler 1983).
Cop-win 그래프는 dismantlable order 를 가진다.
증명 스케치. 게임 트리 의 backward induction. winning move 가 dominated vertex 의 존재 와 동등. ∎
정리 18.3 (Cop-Win Characterization, Nowakowski–Winkler 1983, Quilliot 1978).
그래프
G가 cop-win (c(G) = 1) ⟺G가 dismantlable.
증명. 보조정리 18.1 + 18.2. ∎
정리 18.4 (Aigner–Fromme 1984).
모든 planar graph
G에 대해c(G) ≤ 3.
증명 개요. Planar embedding 의 separator 정리 사용. 자세한 증명은 AF 1984 §3. ∎
Meyniel Conjecture (1985, unsolved).
모든
nvertex graph 의 cop numberc(G) ≤ O(√n).
Status: 알려진 최선 상한 n / 2^{Ω(√log n)} (Frieze 등 2012). √n 의 정확한 conjecture 는 2024년 현재 미해결. (Conjecture statement, 증명 미해결.) ∎
정리 18.5 (Time).
Dismantlable 검사
O(V^3). Cop-win strategy 계산O(V^3).
증명. 매 dismantling step = O(V^2). V 단계. ∎
Cop number 계산 자체의 복잡도 — c(G) ≤ k 인지 결정은 EXPTIME-complete (게임 트리 크기 지수). 그러나 fixed k 면 다항.
(a) Search Number. invisible robber, 검색자가 잡기. Tree 의 search number = pathwidth + 1.
(b) k-Cops Game. k 명 cop 이 잡는 게임.
(c) Lazy Cops. Cop 이 가끔만 이동.
(d) Fully Active Cops and Robber. 모두 반드시 이동.
(e) Continuous Pursuit-Evasion. Isaacs 1965 의 differential games.
(f) Online Pursuit. Robber 가 정보를 점진적으로 만 알려줌.
NW 1983 Discrete Mathematics 의 4 페이지. 정의 + 핵심 정리 + 증명.
Richard Nowakowski (1948~). 캐나다 Dalhousie University. Combinatorial game theory 의 거장. Bonato–Nowakowski 2011 책의 공저자.
Peter Winkler (1946~). Dartmouth College. 조합론, 그래프 이론 의 거장. Winkler's puzzles 시리즈.
Alain Quilliot. 프랑스. Paris VI 박사. Combinatorial game theory 의 개척자.
Martin Aigner, Michael Fromme. 독일 Berlin. Cops on planar.
Rufus Isaacs (1914–1981). 미국. RAND Corporation. Differential games 의 창시자.
Expert 18 — 도망자–숲 — 의 풀이.
1. 그래프 모델링 — 숲의 격자 vertices, 인접 이동 가능한 간선. 2. Dismantlable 검사 — cop 1 명으로 잡힐 가능 여부. 3. Cop number 추정 — 격자는 보통 2-3. 4. Minimax game tree — 제한된 depth 로 경로 결정. Alpha-Beta pruning 으로 가지치기. 5. Heuristic — 직선 거리 + 각도 로 cop 결정.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/18-fugitive-forest.html
왜 이 장이 책 전체에서 특별한가. 조합 게임 이론 의 알고리즘적 응용. 다른 장의 최적화 와 다른 — 적대적 환경 에서의 결정. 17장 (Online) 도 비슷한 불완전 정보 지만 18장은 상대가 적극적 도주. 알고리즘 분야의 게임 이론적 측면.
그림 18.3 ― 게임 이론 알고리즘 가족.
분야 예시 알고리즘
─────────────────────────────────────────────────
Combinatorial game theory Cops-Robbers, Nim
Differential games Isaacs's HJB equation
Sequential decision MDP, Bellman equation
Adversarial search Minimax, Alpha-Beta
Stochastic games Shapley iteration
Mechanism design Auction theory, VCG
─────────────────────────────────────────────────
현대 응용 — 사이버 보안, 자율 주행. Pursuit-evasion 의 21세기 응용 — 네트워크 침입자 추적, 자율 주행 차량의 회피 동작, 비디오 게임의 AI 경찰, 드론 추격. 한 그래프 게임 의 형식 이론 이 수많은 분야의 도구.
그림 18.3ᵇ ― Minimax 게임 트리.
Cops-Robbers 의 minimax tree:
root (cop's turn)
│
┌──────────┼──────────┐
▼ ▼ ▼
move1 move2 move3
(robber's turn)
│ │ │
┌─┼─┐ ┌─┼─┐ ┌─┼─┐
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
(cop 의 turn 다시 ...)
Alpha-Beta pruning:
- cop 는 *max* 선택 (잡을 가능성 최대)
- robber 는 *min* 선택 (도주 가능성 최대 = cop 의 잡힘 최소)
- 가지를 *cut* 한다 (이미 알려진 답보다 나쁘면).
복잡도: 전체 트리 O(b^d). Alpha-Beta 평균 O(b^{d/2}).
그림 18.4 ― Cop number 의 큰 그래프 클래스별.
Graph class Cop number bound
──────────────────────────────────────────────
Tree 1
Outerplanar 2
Planar ≤ 3 (Aigner-Fromme 1984)
Genus g surface ≤ 3 + ⌊(3g+1)/2⌋ (Schroeder 2001)
k-treewidth ≤ k + 1
Cartesian product c(G □ H) ≤ c(G) + c(H)
Random G(n, p) Θ(√n) (some p)
Hypercube Q_n (n+1)/2 (대략)
──────────────────────────────────────────────
[NowakowskiWinkler1983]
[AignerFromme1984]
[BonatoNowakowski2011]
[Quilliot1978]
[ParsonsLogan1976]
[Isaacs1965]
[Petrosyan1993]
전체 항목은 bibliography.md.
k개의 중심을 찾고, 점들을 가장 가까운 중심에 묶고, 중심을 다시 무게중심으로 옮긴다 — 더 이상 옮길 게 없을 때까지.
"The proof of convergence is straightforward... the algorithm produces a sequence of solutions in which the total within-class variance is monotonically non-increasing." — Stuart P. Lloyd, Least Squares Quantization in PCM (1957 / 1982).
| 항목 | 값 |
|---|---|
| Expert № | 19 |
| 주연 | Lloyd's k-means (1957) |
| 조연 | MacQueen (1967), k-means++ (Arthur–Vassilvitskii 2007), Bregman k-means, mini-batch (Sculley 2010) |
| 원논문 | Lloyd (1982). "Least Squares Quantization in PCM." IEEE Trans. Inf. Theory IT-28. |
| 대표 교과서 | Hastie–Tibshirani–Friedman The Elements of Statistical Learning (2009) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
도시의 쓰레기통 배치. n 명의 주민, 각자 위치 p_i ∈ ℝ². 시는 k 개의 쓰레기통 을 어디에 둘지 결정. 주민은 가장 가까운 쓰레기통 으로 쓰레기 버림. 총 이동 거리 의 합 최소화. 이것이 k-means clustering 의 원형. 또는 Vehicle Routing 의 cluster-first then route 단계.
K-means 의 수학적 정식화 — cost(C_1, ..., C_k) = Σ_i min_j ||p_i - C_j||². NP-hard 일반적. 그러나 Lloyd's algorithm 의 반복 휴리스틱 이 실용에서 매우 좋음.
알고리즘 — 두 단계 반복. Assignment: 각 점 p_i 를 가장 가까운 중심에 할당. Update: 각 클러스터의 중심 을 그 클러스터 점들의 무게중심 으로 옮김. 두 단계가 cost 를 단조 감소 시킴 → 종료 보장.
Lloyd's algorithm 은 Bell Labs 의 Stuart Lloyd 가 1957년 PCM signal quantization 을 위해 내부 메모로 작성. 25년 후 1982년 IEEE Transactions on Information Theory 에 공식 발표 됨. 그 동안 1965년 Forgy 의 독립적 발표, 1967년 MacQueen 의 batch variant 로 k-means 라는 이름 도입.
수렴은 보장 되지만 전역 최적은 아님. 시작 초기 중심 에 따라 다른 국소 최적. 2007년 Arthur–Vassilvitskii 의 k-means++ 가 확률적 초기화 로 O(log k)-approximation 보장.
Expert 19 — 쓰레기통 — 의 풀이는 Lloyd's algorithm 의 직접 응용. 추가 — 일부 위치 제약 (도로변만, 인구밀도 가중 등).
1957년 Stuart P. Lloyd (Bell Labs) 가 Least Squares Quantization in PCM 이라는 내부 메모 작성. Pulse Code Modulation (PCM) — 아날로그 신호를 이산 레벨 로 양자화 — 의 최소 평균 제곱 오차 양자화. 메모 자체는 25년 동안 비공개. 그러나 Bell Labs 의 일부 사람들 사이에 알려진 알고리즘.
1965년 E. W. Forgy 의 Cluster Analysis of Multivariate Data — 생물학자/통계학자 가 Lloyd 의 알고리즘과 동일한 아이디어 발표. 독립 발견. 알고리즘 자체는 Lloyd–Forgy.
1967년 J. MacQueen (UCLA) 의 Berkeley Symposium 발표 — k-means 라는 이름 을 처음 사용. batch 변형이 아닌 online 변형 (점 하나씩 처리). 그러나 오늘날 k-means 라 하면 Lloyd's batch 알고리즘.
1982년 마침내 Lloyd 의 1957 메모 가 IEEE Trans. Info Theory 28권에 공식 발표. 25년의 침묵 의 끝. 발표 후 학술적 인정.
1990~2000년대 데이터 마이닝, 기계학습 의 부상으로 k-means 의 황금기. 수많은 변형 — fuzzy c-means, spectral clustering, DBSCAN, Mean Shift. 그러나 Lloyd's k-means 의 단순함과 실용성 으로 여전히 표준.
2007년 David Arthur 와 Sergei Vassilvitskii (Stanford) 의 SODA 학술대회 발표 — k-means++. 초기 중심 선택 의 영리한 확률적 방법. O(log k)-approximation 의 첫 보장. 이후 kmeans++ 가 모든 라이브러리의 기본 옵션. scikit-learn, R 의 kmeans() 등.
2010년 D. Sculley (Google) 의 Web-scale k-means — mini-batch 변형. 빅데이터 시대의 표준.
Lloyd's k-means 의 의사코드.
algorithm KMeans(points P, k):
# 초기화 (k-means++ 또는 random)
centers = initialize_centers(P, k)
while not converged:
# Assignment step
for each p in P:
assign p to nearest center
# Update step
for each cluster j:
C_j = mean of points assigned to j
check convergence (centers 변화량 작음)
return centers, assignments
복잡도: 한 iteration O(n k d) (n 점, k 중심, d 차원). 반복 수는 경험적으로 O(log n) ~ O(n). Worst-case 는 지수 (Vattani 2009).
k-means++ 의 초기화:
algorithm KMeansPlusPlusInit(P, k):
centers = [random point from P]
for i in 2 to k:
# Sample next center with probability ∝ d²(p, nearest center)
weights = [d²(p, nearest of centers) for p in P]
next = weighted random choice from P with weights
centers.append(next)
return centers
복잡도 O(n k d).
그림 19.1 ― Lloyd's 의 단계.
초기 (random): Assignment: Update:
● ● ● ● ●─●─●─● ●━●─●─●
● ● ● ● → ●─●─*─● → ●─*━●─●
● * ● ● (중심 *) ● ●─●─● *━●─●─●
● ● ● ● ● *─●─● ●─●─●─●
(각 점이 가까운 * 에) (각 *가 cluster 무게중심으로)
다음 iteration: assignment 다시 → update 다시 → ... 수렴.
그림 19.1ᵇ ― k-means++ 의 초기화 시각화.
초기 점: P = {p1, ..., p10} ⊂ ℝ²
step 1: center[0] = random point. 예 p3.
step 2: 각 점 p의 d² = ||p - p3||² 계산.
weight ∝ d². 가장 멀리 있는 점이 *높은 확률*.
sample 1 next center. 예 p9 (가장 멈).
step 3: 각 점 p의 d² = min(||p - p3||², ||p - p9||²).
sample 1 next center. 예 p5.
... k번 반복.
효과: 중심들이 *spread out*. random 초기보다 *훨씬 좋음*.
결과: Lloyd's 가 *좋은 local minimum* 으로 수렴.
그림 19.2 ― Lloyd's 의 수렴 행동.
cost (within-cluster variance)
┃
┃┃
┃ ╲
┃ ╲
┃ ╲
┃ ╲
┃ ╲╲
┃ ╲╲╲
┃ ╲╲╲╲╲
┃ ╲╲╲╲╲╲╲╲╲ ← 수렴 (local minimum)
┗━━━━━━━━━━━━━━━━━━━━━━━━ iteration
매 iteration: cost 단조 비증가. 유한 단계 후 수렴 (변화 없음).
Input. Points P = {p_1, …, p_n} ⊂ ℝ^d. Number of clusters k.
Centers. C = (c_1, …, c_k) ∈ ℝ^{k × d}.
Assignment. σ : P → [k], σ(p) = argmin_j ||p - c_j||².
Cost. Φ(C, σ) = Σ_p ||p - c_{σ(p)}||².
OPT. Φ^* = min_C Σ_p min_j ||p - c_j||². NP-hard 일반적.
보조정리 19.1 (Best Center is Mean).
어떤 부분집합
S ⊆ ℝ^d와 그 최적 단일 중심c^에 대해,c^ = mean(S) = (1/|S|) Σ_{p ∈ S} p. 이때 최소 비용Σ_{p ∈ S} ||p - c^*||².
증명. f(c) = Σ ||p - c||² 를 c 에 대해 미분. df/dc = -2 Σ (p - c) = 0 → c = mean(S). 이차함수의 minimum. ∎
이 보조정리가 update step 의 정당화. Mean = optimal.
보조정리 19.2 (Monotonic Decrease).
Lloyd's algorithm 의 매 iteration 마다
Φ가 비증가. 즉Φ(C^{t+1}, σ^{t+1}) ≤ Φ(C^t, σ^t).
증명. 두 단계 각자.
(Assignment) σ^{t+1}(p) = argmin_j ||p - c_j^t||². 따라서 Φ(C^t, σ^{t+1}) ≤ Φ(C^t, σ^t).
(Update) c_j^{t+1} = mean of cluster j. 보조정리 19.1 에 의해 Φ(C^{t+1}, σ^{t+1}) ≤ Φ(C^t, σ^{t+1}).
합쳐 Φ(C^{t+1}, σ^{t+1}) ≤ Φ(C^t, σ^t). ∎
정리 19.3 (Lloyd's Convergence).
Lloyd's 알고리즘은 유한 단계 안에 종료한다 (수렴).
증명. Φ 는 유한 값들의 집합 (각 점의 cluster 할당 = k^n 가지, 각 할당의 unique optimal center 가 정해짐). 비증가 + 유한 가능한 값 → 유한 단계 수렴. ∎
증명이 깨지는 가정. 비유한 가능값 — 실수 좌표 데이터에서 수치 오차 로 수렴 안 함 가능. 실용에서는 변화량 < ε 으로 종료.
관찰 19.4 (Not Global Optimum).
Lloyd's 가 local minimum 에 수렴할 수 있으나 global 보장 없음.
정리 19.5 (Arthur–Vassilvitskii 2007: k-means++).
k-means++ 초기화 + Lloyd's 의 expected cost
≤ 8 (ln k + 2) · OPT.
증명 스케치. AV 2007 의 정밀한 probabilistic analysis. D²-weighted sampling 의 성질. ∎
정리 19.6 (Per-iteration Time).
한 iteration
O(n k d)(Euclidean distance 계산).
증명. Assignment = n × k × d. Update = n × d (mean). 합 O(nkd). ∎
정리 19.7 (Iteration Count).
Worst-case 반복 수
exp(n)(Vattani 2009). 실용O(log n) ~ O(n).
증명 (Vattani 2009). 정밀하게 구성된 데이터셋 + 시작 중심. ∎
Smoothed Analysis (Arthur–Manthey–Roeglin 2009). worst-case 입력 + 작은 잡음 의 경우 polynomial smoothed time.
(a) k-means++. §7 정리 19.5.
(b) Mini-Batch k-means (Sculley 2010). 전체 데이터 대신 미니 배치. 빅데이터.
(c) Fuzzy c-means. soft assignment — 각 점이 모든 클러스터에 확률 할당.
(d) Kernel k-means. non-linear 분리 가능. kernel trick.
(e) Bregman k-means. Euclidean 대신 Bregman divergence. KL, Itakura-Saito 등.
(f) Spectral Clustering (Ng-Jordan-Weiss 2001). 그래프 Laplacian eigenvectors 의 k-means.
(g) DBSCAN (Ester et al 1996). density-based clustering. k 없이.
(h) Mean Shift (Comaniciu-Meer 2002). kernel-based mode seeking.
(i) EM for Gaussian Mixture. k-means 의 확률적 일반화.
Lloyd 1982 (= 1957 internal) IEEE Trans. Info Theory 의 9 페이지. PCM 의 양자화 응용. EM-like 반복.
Stuart Pemberton Lloyd (1923–2003). Bell Labs (1949~). Information theory 의 거장. 25년 동안 메모 비공개. 겸손한 발견자 의 사례.
J. MacQueen. UCLA. k-means 이름의 명명자.
David Arthur, Sergei Vassilvitskii. Stanford. Algorithms theory. AV 2007 의 공저자. Vassilvitskii 는 후일 Google.
Expert 19 — 쓰레기통 — 의 풀이.
1. k-means++ 초기화 — 영리한 초기 중심. 2. Lloyd's iterations — 수렴까지. 3. Multiple runs — 다른 초기화로 수번 실행, 최선 선택. 4. (추가) 제약 처리 — 도로변만, 인구밀도 가중.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/19-trash-bins.html
왜 이 장이 책 전체에서 특별한가. K-means 는 기계 학습의 가장 단순한 알고리즘. 비지도 학습 의 한 출발점. 25년 동안 묻혀 있던 알고리즘 의 부활. 8장 (SA) 의 확률적 변형 가능 (k-means 에 SA 도입).
그림 19.3 ― 알고리즘 가족.
비지도 학습 / 클러스터링:
Lloyd 1957 (k-means)
│
┌──────────────┼──────────────┐
▼ ▼ ▼
MacQueen 1967 Forgy 1965 Linde-Buzo-Gray 1980
batch 변형 독립 발견 quantization 일반화
│
▼
k-means++ Mini-batch Fuzzy c-means
(AV 2007) (Sculley 2010) (Bezdek 1981)
│ │ │
▼ ▼ ▼
Spectral DBSCAN Mean Shift
(NJW 2001) (Ester 1996) (CM 2002)
현대 응용 — Image segmentation, NLP word embedding, Genomics. K-means 의 21세기 응용 — 영상 분할 (픽셀의 색 클러스터), NLP word embedding (Word2Vec, BERT 의 fine-tuning), 유전자 발현 데이터 그루핑, 고객 세그멘트, 추천 시스템. 한 단순 알고리즘이 수많은 분야의 첫 번째 도구.
다음 장으로 가는 다리. 20장 (Particle Filter) 도 반복 + 확률 의 패러다임. K-means 의 결정적 와 PF 의 확률적 의 기독한 대칭. 둘 다 EM 알고리즘 의 자손. 한 책의 연결성.
그림 19.4 ― EM-style 알고리즘의 가족.
알고리즘 / 모델 E-step M-step
──────────────────────────────────────────────────────────
Lloyd's k-means hard assignment mean update
Soft k-means / fuzzy c-means soft probabilities weighted mean
GMM (EM 알고리즘) posterior P(z|x,θ) MLE update
HMM Baum-Welch forward-backward MLE update
PCA via EM principal components matrix update
──────────────────────────────────────────────────────────
모든 EM-style: "expected likelihood / cost 가 monotone 증가 또는 감소".
수렴 보장 + local optimum.
그림 19.5 ― k-means 의 한계.
k-means 가 *잘 작동* 하는 경우:
1. cluster 가 *대략 spherical*.
2. cluster 가 *대략 같은 크기*.
3. 차원 d 가 *너무 크지 않음* (curse of dimensionality).
k-means 가 *잘못* 하는 경우:
1. cluster 가 *non-convex* (banana shape). ← DBSCAN, Spectral 권장.
2. cluster 의 *크기 매우 다름*. ← GMM 권장.
3. cluster 의 *밀도 다름*. ← DBSCAN 권장.
4. d >> 100. ← dimensionality reduction (PCA, t-SNE) 먼저.
"한 도구가 모든 문제에 맞지 않음" — clustering 의 *플랫폼 의식*.
[Lloyd1982]
[MacQueen1967]
[ArthurVassilvitskii2007]
[KanungoMountNetanyahuPiatkoSilvermanWu2002]
[OstrovskyRabaniSchulmanSwamy2012]
[Bregman1967]
[Sculley2010]
전체 항목은 bibliography.md.
수천 개의 작은 추측이 한꺼번에 — 진실의 분포를 점들로 표현한다.
"We propose a new approach to Bayesian filtering problems with nonlinear/non-Gaussian state evolution and observation models, using a Monte Carlo simulation of the optimal recursive filter." — Neil Gordon, David Salmond, Adrian Smith, Novel Approach to Nonlinear/Non-Gaussian Bayesian State Estimation (1993).
| 항목 | 값 |
|---|---|
| Expert № | 20 |
| 주연 | Particle Filter / Sequential Monte Carlo (Gordon–Salmond–Smith, 1993) |
| 조연 | Kalman Filter (1960), Extended Kalman (EKF), Rao-Blackwellized PF, Auxiliary PF |
| 원논문 | Gordon–Salmond–Smith (1993). "Novel Approach to Nonlinear/Non-Gaussian Bayesian State Estimation." IEE Proc. F. |
| 대표 교과서 | Thrun–Burgard–Fox Probabilistic Robotics (2005), Doucet et al. (2001) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
자율 주행 로봇. 자신의 위치 (x, y, θ) 를 모름. 센서 — 거리 측정 (LiDAR), 카메라, GPS — 가 부정확한 데이터 를 시간에 따라 제공. 미리 알고 있는 지도 와 센서 데이터 를 결합해 현재 위치의 확률 분포 를 추정. 시간 진행에 따른 갱신. 이것이 robot localization.
이 문제의 수학적 정식화 는 Bayes Filter. 상태 x_t (위치) 가 Markov chain. 관측 z_t (센서 데이터) 가 현재 상태에 의존. 두 분포 — transition p(x_t | x_{t-1}) 와 observation p(z_t | x_t) — 를 재귀적 으로 결합:
p(x_t | z_{1:t}) ∝ p(z_t | x_t) · ∫ p(x_t | x_{t-1}) · p(x_{t-1} | z_{1:t-1}) dx_{t-1}
이 Bayesian recursion 의 해석적 풀이 는 Gaussian + linear 경우 Kalman Filter (Kalman 1960). 비선형 + 비Gaussian 경우 — 해석적 풀이 불가능. 어떻게?
Particle Filter 의 답 — 분포를 샘플 (particles)* 로 근사. 수천 개의 가설 위치* 를 동시에 유지. 각 입자는 가중치 가 있고, 시간이 진행하면서 입자들이 움직이고, 다시 가중치 매겨지고, 재표본 됨. 이 Sequential Monte Carlo (SMC) 방법이 1993년 Gordon–Salmond–Smith 의 발견. 비선형 비Gaussian Bayes filter 의 첫 실용적 알고리즘.
알고리즘 한 사이클의 세 단계. Predict: 각 particle 을 transition model 로 전진. Update: 각 particle 의 현재 관측에 대한 likelihood 를 가중치 로. Resample: 가중치에 따라 재표본 (높은 가중치는 여러 번 복사, 낮은 가중치는 제거).
이 단순한 사이클이 모든 비선형 비Gaussian Bayes filtering 의 표준. 21세기 자율 주행, SLAM (Simultaneous Localization and Mapping), target tracking, biological signal processing, 경제학 의 시계열 분석 의 공통 도구.
Expert 20 — 어디인가 — 의 풀이는 Particle Filter 의 직접 응용. 로봇의 상태 공간 위에 수천 개 particle 분포. 매 step 의 센서 데이터 로 가중치 갱신, 재표본.
1960년 Rudolf Kalman (Hungarian-American 엔지니어, Stanford 박사) 가 Journal of Basic Engineering 에 Kalman Filter 발표. Linear Gaussian Bayes filter 의 해석적 풀이. Apollo 우주선 의 항법 의 공식 알고리즘 — 유명한 응용 사례. 이후 60년간 공학의 표준 자리.
그러나 — 비선형 비Gaussian 시스템 (로봇, 추적, 금융) 에서는 Kalman 직접 적용 불가능. Extended Kalman Filter (EKF, 1960년대) 는 linearization — 근사적, 큰 비선형성 에서 발산 가능. Unscented Kalman Filter (UKF, 1997) 도 비슷한 근사.
1993년 Neil Gordon, David Salmond, Adrian Smith (영국 DERA, Defense Evaluation and Research Agency) 가 IEE Proceedings F 에 Novel Approach 발표. 7 페이지짜리. Bootstrap filter 또는 Sequential Importance Resampling (SIR) 이라 불리는 Particle Filter 의 첫 형태. radar tracking 의 응용. 지수적 상태 공간 의 필터링 의 돌파구.
Particle Filter 의 이론적 기반 은 1960~70년대 Sequential Monte Carlo 의 통계학 community. Importance Sampling, resampling, Markov Chain Monte Carlo 의 통합. 그러나 알고리즘적 형식화 는 1993년 GSS.
발표 후 10년간 수천 편의 후속 논문. EKF의 한계 를 PF 가 보완. 2001년 Doucet, de Freitas, Gordon 의 Sequential Monte Carlo Methods in Practice 책 — 분야의 표준 교과서. 2005년 Thrun–Burgard–Fox 의 Probabilistic Robotics — 로봇 분야의 표준.
Auxiliary Particle Filter (Pitt-Shephard 1999), Rao-Blackwellized PF (특정 변수의 해석적 적분), Sequential Monte Carlo Samplers (Del Moral 2004) — 2000년대 의 정밀화.
2010년대 AI의 부상 으로 deep learning 과의 결합. neural particle filter, deep state-space model (Variational Inference 와의 통합). 그러나 고전 PF 는 여전히 실시간 로보틱스, 자율 주행 의 표준.
Particle Filter (Bootstrap Filter / SIR) 의 의사코드:
algorithm ParticleFilter(N particles):
# 초기화: prior 에서 N particle sampling
particles = [sample x from p(x_0)] × N
weights = [1/N] × N
for each time step t:
# 1. Predict: each particle 을 transition model 로 propagate
for i in 1 to N:
particles[i] = sample from p(x_t | particles[i])
# 2. Update: 현재 관측에 대한 likelihood 로 가중치
for i in 1 to N:
weights[i] = p(z_t | particles[i])
normalize weights so Σ = 1
# 3. Resample (optional, 매번 또는 effective sample size 작을 때)
if ESS < N/2:
indices = random sample N times with prob ∝ weights
particles = [particles[indices[i]] for i in 1 to N]
weights = [1/N] × N
# 추정 (평균, 최대 likelihood 등)
estimate = Σ weights[i] · particles[i]
return estimates
복잡도: 한 step O(N · cost(transition + likelihood)). 보통 N = 100 ~ 100,000.
그림 20.1 ― Particle Filter 의 사이클.
Predict: Update:
particles t-1: ● ● ● ● ● ● particles t (with weights):
↓ ●(w=0.1) ●(w=0.3) ●(w=0.05)
● ● ● ● ● ● 관측 z_t ↓
● ● ● ● ● ● (likelihood)
(전진) ●(w=0.5) ●(w=0.02) ●(w=0.03)
Resample:
가중치 큰 particles 가 복사:
●(0.5)→●●●, ●(0.3)→●●, ●(0.1)→●
●(0.05~0.02)→ 사라짐
결과: 새 N particles, all weight = 1/N. 다음 time step 으로.
그림 20.1ᵇ ― Particle 의 시간 진행.
t=0: ● ● ● ● (uniform prior, 4 particles)
● ● ● ● ← spread out over state space
● ● ● ●
sensor reading z_1: "거리 ~5m"
t=1 (after update + resample):
●●●● (cluster forming, weights concentrated)
●●
●
sensor reading z_2: "방향 east"
t=2: ●●●● (further concentrated)
●●●●●
●●●●
t=10: ●●●●●●●● ← *converged* near true location.
●●●●●●●●
가정 Kalman Particle Filter
──────────────────────────────────────────────────────────────────
Linear dynamics ✓ ✓
Nonlinear dynamics ✗ (EKF 근사) ✓
Gaussian noise ✓ ✓
Non-Gaussian noise ✗ ✓
Multi-modal posterior ✗ (단일 평균) ✓
고차원 state ✓ (uniform) ⚠️ (curse of dim)
계산 비용 O(d²) per step O(N · d) per step
──────────────────────────────────────────────────────────────────
State. x_t ∈ ℝ^d, time t = 0, 1, 2, ….
Markov dynamics. p(x_t | x_{t-1}).
Observation. z_t ∈ ℝ^m, p(z_t | x_t).
Posterior. p(x_t | z_{1:t}).
Particles. {x_t^{(i)}, w_t^{(i)}}_{i=1}^N representing approximation p(x_t | z_{1:t}) ≈ Σ w^{(i)} δ(x_t - x_t^{(i)}).
보조정리 20.1 (Bayes Filter Recursion).
p(x_t | z_{1:t}) ∝ p(z_t | x_t) · ∫ p(x_t | x_{t-1}) · p(x_{t-1} | z_{1:t-1}) dx_{t-1}.
증명. Bayes 정리 + Markov 가정.
p(x_t | z_{1:t}) ∝ p(z_t | x_t, z_{1:t-1}) · p(x_t | z_{1:t-1}) (Bayes) = p(z_t | x_t) · p(x_t | z_{1:t-1}) (Markov: z_t 는 x_t 에만 의존) = p(z_t | x_t) · ∫ p(x_t | x_{t-1}) · p(x_{t-1} | z_{1:t-1}) dx_{t-1} (chain rule). ∎
보조정리 20.2 (Importance Sampling Consistency).
Particles
{x^{(i)}, w^{(i)}}가 target distributionπ(x)의 importance sampling 으로 생성되면, expectation 추정E[f(x)] ≈ (1/Σw) · Σ w^{(i)} f(x^{(i)})가 N → ∞ 에서 consistent.
증명 스케치. Strong law of large numbers 의 weighted 버전. ∎
보조정리 20.3 (Resampling Consistency).
Resampling (가중치 ∝) 후 uniform weights 의 particles 도 같은 분포를 표현.
증명. multinomial resampling 의 정의. 평균적으로 입자 i 가 N · w^{(i)} 번 복사됨. ∎
정리 20.4 (Crisan–Doucet 2002: Convergence).
Particle Filter 의 추정
(1/Σw) · Σ w^{(i)} f(x^{(i)})가 N → ∞ 에서 true posterior expectation 으로 수렴 (in mean square).
증명 개요. SMC 의 표준 수렴 결과. 각 step 의 importance sampling + resampling 의 변동 이 O(1/√N). 시간 step 에 따라 오차가 누적되지만 bounded (조건 부합 시). 자세한 증명은 Crisan–Doucet 2002 또는 Del Moral 2004. ∎
증명이 깨지는 가정. 높은 차원 — curse of dimensionality. Likelihood 가 매우 좁음 — particle degeneracy (대부분 weight 0).
정리 20.5 (Time per Step).
한 time step 의 시간
O(N · (C_transition + C_likelihood)).
증명. N particles 각자 transition + likelihood 평가. Resampling O(N). ∎
Variance Analysis. 추정 오차의 분산 ≈ Var(target) / N. N 을 크게 할수록 정확해짐 — Monte Carlo 의 √N 수렴.
(a) Kalman Filter (1960). Linear Gaussian. O(d²) per step. 정확.
(b) Extended Kalman Filter (EKF). Nonlinear을 linearization 으로 근사.
(c) Unscented Kalman Filter (UKF, Julier-Uhlmann 1997). Sigma points 로 nonlinear.
(d) Auxiliary PF (Pitt-Shephard 1999). Lookahead 로 효율 향상.
(e) Rao-Blackwellized PF. 일부 변수 는 해석적 적분.
(f) MCMC. Metropolis-Hastings — 8장의 그것. 시계열 아닌 posterior sampling.
(g) Variational Inference. deterministic approximation 의 posterior. deep learning 과의 결합.
GSS 1993 IEE Proc. F 의 7 페이지. Bootstrap filter 의 첫 형식적 발표. radar tracking 의 응용.
Neil Gordon (1967~). DERA (영국 국방 연구소). 후일 GE Aviation. radar signal processing 의 거장.
Adrian Smith (1946~). 영국 통계학자. Royal Society fellow, 후일 Alan Turing Institute 의 director. Bayesian statistics 의 거장.
Rudolf E. Kalman (1930–2016). 헝가리 출생, 미국 이주. Stanford 박사. Kalman Filter 의 발명자. 2009 National Medal of Science.
Expert 20 — 어디인가 — 의 풀이.
1. State 정의 — 로봇의 (x, y, θ). 2. Map + Sensors — 미리 알려진 지도 + LiDAR/카메라 데이터. 3. Particle Filter 실행 — N=1000~10000 particles. 매 step predict/update/resample. 4. Output — particles 의 평균 또는 최대 likelihood 위치.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/20-where-am-i.html
왜 이 장이 책 전체에서 특별한가. PF 는 물리학 (Monte Carlo simulation) + 통계학 (Bayesian) + 컴퓨터 과학 (sampling algorithms) 의 3중 결합. 8장 (SA) 도 Monte Carlo. 19장 (k-means) 도 반복 추정. 모두 수치적 계산 의 우아한 결합.
그림 20.3 ― Bayes Filter 가족.
Bayes Filter (recursive)
│
▼ Linear Gaussian
Kalman Filter (1960)
│
├──→ EKF (linearization)
├──→ UKF (sigma points)
└──→ Particle Filter (1993)
│
├──→ Bootstrap (GSS 1993)
├──→ Auxiliary (Pitt-Shephard 1999)
├──→ Rao-Blackwellized
└──→ SMC Samplers (Del Moral 2004)
현대 응용 — 자율 주행, AR/VR, SLAM, Spacecraft tracking, Financial filtering. PF 의 21세기 응용 — 자율 차의 위치 추정, AR/VR 의 인사이드 트래킹, SLAM (Simultaneous Localization and Mapping), 우주선 궤도 추정, 금융 시계열 신호 필터링, 생물학 신호 분석. 한 알고리즘 분야의 놀라운 확장.
다음 (마지막 21) 장으로 가는 다리. 21장 (Closest Pair) 은 완전 결정적 분할정복. PF 의 확률적 와 정반대 끝. 그러나 두 알고리즘 모두 — 기하학적 문제 의 현명한 분해. 한 책의 순환적 마감.
그림 20.4 ― SMC 의 일반 framework.
Sequential Monte Carlo Sampling 의 일반:
Goal: 매 step t 의 target π_t (예 — posterior p(x_t | z_{1:t}))
에서 sample 을 얻기.
Method:
1. Importance Sampling: π_{t-1} 의 sample 을 *proposal* 로 사용.
2. Reweight: π_t / proposal 의 ratio.
3. Resample if effective sample size 작음.
4. (Optional) MCMC kernel apply.
Particle Filter = SMC 의 한 사례 (sequence of posteriors).
다른 SMC 응용: Rare event simulation, Bayesian model comparison,
Phylogenetic inference, MCMC chains 의 hot start.
그림 20.4ᵇ ― Particle Degeneracy 의 그림.
초기 (uniform): 몇 step 후 (degenerated):
●(0.1) ●(0.1) ●(0.1) ●(0.1) ●(0.95) ●(0.005) ●(0.005) ●(0.005)
●(0.1) ●(0.1) ●(0.1) ●(0.1) ●(0.005) ●(0.005) ●(0.005) ●(0.005)
●(0.1) ●(0.1) ●(0.1) ●(0.1) ●(0.005) ●(0.005) ●(0.005) ●(0.005)
문제: 하나의 particle 이 weight 거의 다 가짐.
다른 particles 는 거의 *기여 없음*.
ESS (Effective Sample Size) 매우 작음.
분포 추정의 *variance 폭증*.
해결: Resampling — 매번 또는 ESS < N/2 일 때.
Better proposal — auxiliary PF, importance distribution.
Better likelihood — domain knowledge.
그림 20.5 ― Particle Filter 의 응용 차림표.
응용 분야 사용 형태
───────────────────────────────────────────────────
Robot localization 본 장의 사례
SLAM (정보+지도 동시) FastSLAM (Montemerlo 2002)
Multi-target tracking PHD filter (Mahler 2003)
Computer vision (object track) condensation algorithm (1998)
Financial volatility stochastic volatility models
Biological signal neural spike sorting
Speech recognition (HMM) particle smoother
Spacecraft autonomous nav navigation Particle Filter
───────────────────────────────────────────────────
[GordonSalmondSmith1993]
[Kalman1960]
[Doucet2001]
[ThrunBurgardFox2005]
[DelMoral2004]
[CrisanDoucet2002]
전체 항목은 bibliography.md.
평면 위의 n개 점에서 가장 가까운 두 점 — 한 번에 보면 n², 둘로 자르면 n log n.
"The closest-pair problem appears to require Ω(n²) work, but a divide-and-conquer approach yields O(n log n)." — Michael Shamos, Dan Hoey, Closest-Point Problems (FOCS 1975).
| 항목 | 값 |
|---|---|
| Expert № | 21 |
| 주연 | Closest Pair via Divide and Conquer (Shamos–Hoey, 1975) |
| 조연 | Rabin's randomized O(n) (1976), KD-tree (Bentley 1975), Voronoi (Fortune 1987), Khuller–Matias (1995) |
| 원논문 | Shamos–Hoey (1975). "Closest-Point Problems." FOCS. |
| 대표 교과서 | CLRS Ch. 33.4, de Berg et al. (2008), Preparata–Shamos (1985) |
| 분량 체크 | ⬜ Light ⬜ Deep ⬜ Origin |
평면 위의 n 개 점. 가장 가까운 두 점 의 거리 (또는 좌표) 를 구하라. 응용 — 유사한 객체 검출 (이미지 매칭), 충돌 검사 (게임, 시뮬레이션), 과학 분야 (별 시리즈의 가장 가까운 별), 클러스터링 의 시작. 단순 알고리즘 — 모든 쌍 비교 — O(n²). n=1만 이면 1억 비교 — 너무 느림.
이 자리에 Shamos–Hoey 1975 의 분할 정복. Closest-Point Problems — Computational Geometry 분야 의 첫 큰 결과 중 하나 (9장 §10 의 Shamos 참조). 알고리즘은 영리한 분해. 점들을 x 좌표 중간 으로 두 절반 으로 나눔. 각 절반 의 closest pair 를 재귀적 으로 구함. 경계선 근처 에서 cross-pair 도 검사. 합쳐 O(n log n).
핵심 통찰 — 경계선 양쪽 각 strip 의 폭 δ 에서 cross-pair 후보 는 각 점 마다 최대 7개 (Shamos–Hoey 의 7-candidates lemma). 상수 시간 의 strip 검사. 따라서 recursion T(n) = 2T(n/2) + O(n) → Master Theorem 으로 O(n log n).
1976년 Michael Rabin (Hebrew University, Turing Award 수상) 이 확률적 O(n) 알고리즘 — randomized sieve. 기하 hashing 사용. 2-Approx 가 아니라 exact. 평균 O(n) (Las Vegas — 항상 옳고, 평균 빠름).
1985년 Khuller–Matias 의 Simple Randomized Sieve — Rabin 의 단순화. O(n) expected 이지만 더 교육적.
Expert 21 — 사각형 — 의 풀이는 Shamos–Hoey 의 직접 응용. 정사각형 안 점들의 closest pair. 표준 분할 정복.
1975년 카네기 멜런 대학교 (CMU). Michael Shamos 와 Dan Hoey (9장 §10 참조) 가 Foundations of Computer Science 학술대회에서 Closest-Point Problems 발표. 12 페이지. 분할 정복 + strip lemma.
이전까지 알려진 best — O(n log n) naive D&C (모든 cross-pair 비교) 또는 O(n²). Shamos–Hoey 의 7-candidates lemma 가 strip 의 cross-pair 검사를 O(n) 으로 줄여 전체 O(n log n). 알고리즘 분석의 한 우아한 결과.
1976년 Michael Rabin — 후일 1976 Turing Award — 의 Probabilistic Algorithms 강의록에 closest pair 의 O(n) randomized. Mathematical Statistics Lectures. 평균 O(n) 이지만 implementation 복잡. 1985년 Khuller–Matias 가 교육적 단순화.
1979년 Steven Fortune 의 Voronoi diagram 의 closest pair 응용 — Voronoi 의 edges 중 가장 짧은 것. O(n log n) (Voronoi 구성).
2010~20년대 고차원 closest pair. Locality-sensitive hashing (LSH, Indyk-Motwani 1998) 의 응용. Approximate Nearest Neighbor (ANN) 의 자리. 2차원에서는 O(n log n) 결정적, 고차원은 approximation 의 영역.
Shamos–Hoey 의 의사코드:
algorithm ClosestPair(points P):
if |P| <= 3:
return min distance by brute force
sort P by x coordinate. (또는 미리 정렬, 재사용)
mid = median x
left = points with x <= mid
right = points with x > mid
delta_L = ClosestPair(left)
delta_R = ClosestPair(right)
delta = min(delta_L, delta_R)
# Strip 검사: |x - mid| < delta 인 점들
strip = [p for p in P if abs(p.x - mid) < delta]
sort strip by y coordinate
for i in range(len(strip)):
# 7-candidates lemma: 다음 7개만 검사
for j in range(i+1, min(i+8, len(strip))):
d = distance(strip[i], strip[j])
if d < delta: delta = d
return delta
복잡도: T(n) = 2T(n/2) + O(n log n) (strip y-sort). Master theorem → O(n log² n). 미리 y-sorted lists 를 유지 하면 O(n) strip-sort → 총 O(n log n).
작은 예시 — 6 점:
p1(1,1), p2(2,5), p3(3,3), p4(5,2), p5(6,6), p6(8,4).
x-sort: p1, p2, p3, p4, p5, p6.
mid = (p3.x + p4.x)/2 = 4.
left = {p1, p2, p3}. right = {p4, p5, p6}.
recursive:
left: closest = d(p1, p3) = √(2²+2²) = 2√2 ≈ 2.83.
또는 d(p2, p3) = √(1+4) = √5 ≈ 2.24. 더 작음.
delta_L = √5.
right: d(p4, p6) = √(9+4) = √13 ≈ 3.6.
d(p4, p5) = √(1+16) = √17 ≈ 4.12.
d(p5, p6) = √(4+4) = 2√2 ≈ 2.83.
delta_R = 2√2.
delta = min(√5, 2√2) = √5 ≈ 2.24.
Strip: 점 중 x ∈ [4 - 2.24, 4 + 2.24] = [1.76, 6.24].
p2(2,5), p3(3,3), p4(5,2), p5(6,6) ⊂ strip.
y-sort: p4(5,2), p3(3,3), p2(2,5), p5(6,6).
각 점 다음 7개 검사 (여기선 3개) :
d(p4, p3) = √(4+1) = √5. 동률.
d(p4, p2) = √(9+9) = 3√2 > √5.
d(p4, p5) = √17 > √5.
d(p3, p2) = √(1+4) = √5. 동률.
d(p3, p5) = √(9+9) = 3√2.
d(p2, p5) = √(16+1) = √17.
delta 변하지 않음. 최종 √5 ≈ 2.24. (p2, p3) 가 closest.
그림 21.1 ― 분할 정복의 시각화.
전체 점:
. . . . . . . | . . . . . . . x = mid
. . . . . . . | . . . . . . . 로 나눔
. . . . . . . | . . . . . . .
재귀:
left: closest = δ_L right: closest = δ_R
δ = min(δ_L, δ_R).
Strip (폭 2δ 의 띠):
. . . | . . . . ← strip 범위
. . . . | . . . .
. . . . | . . . .
strip 내부 y-sorted 점들, 각 점에 *대해 7 개의 다음 점만* 검사.
- cross-pair distance < δ 면 *최신화*.
결과 = min(δ, strip 의 best cross-pair).
그림 21.1ᵇ ― 분할 정복 의 recursive call tree.
ClosestPair(n=16)
│
┌──────────┼──────────┐
▼ ▼
Closest(n=8) Closest(n=8)
│ │
┌────┼────┐ ┌───┼────┐
▼ ▼ ▼ ▼ ▼ ▼
Cl(4).. Cl(4).. Cl(4).. Cl(4)..
│ │
... (depth log n) ...
각 노드 work: O(strip 크기) = O(n at that level).
depth: log n.
총 work: O(n log n).
그림 21.2 ― 7-Candidates Lemma 의 직관.
strip 폭 2δ. (δ = 현재 left/right 의 closest distance.)
strip 안 두 점 (p_i, p_j) 가 *both 의 y 좌표 차* > δ 이면:
그 둘의 거리 > δ → 영향 없음.
따라서 *y 좌표 차 ≤ δ* 인 점 쌍만 검사.
y 좌표 차 ≤ δ:
양 strip side 의 δ × δ 박스 4개 안에 *4 + 3 = 7 점* 까지만 들어감
(pigeonhole + 점들 사이 거리 ≥ δ).
따라서 *각 점 i 에 대해 다음 7 개만 검사*. 총 strip 작업 = O(strip 크기) = O(n).
Points. P = {p_1, ..., p_n} ⊂ ℝ². 각 p_i = (x_i, y_i).
Distance. d(p, q) = sqrt((x_p - x_q)² + (y_p - y_q)²).
Closest Pair. (p^, q^) = argmin_{p ≠ q} d(p, q). Distance δ^* = d(p^, q^).
보조정리 21.1 (7-Candidates Lemma).
Strip of width
2δ에서, 어떤 점p의 y-거리 ≤ δ 안에 있는 다른 strip 점의 수 는 최대 7.
증명. p 의 y 좌표 y_p. y 범위 [y_p - δ, y_p] 의 strip 부분 (width 2δ × height δ) = 2δ × δ 직사각형. 이 직사각형을 4 개의 δ/2 × δ/2 격자 로 분할. 각 격자 안 점들의 상호 거리 ≤ √(δ²/4 + δ²/4) = δ/√2 < δ. 그러나 모든 점쌍이 ≥ δ (recursive call 의 가정). 따라서 각 격자에 최대 1 점. 4 격자 → 최대 4 점 (위 절반).
전체 ±δ 범위 (위/아래) 면 최대 8 점. p 자신 제외 → 7. ∎
보조정리 21.2 (Recurrence).
T(n) = 2 T(n/2) + O(n)if y-sorted lists pre-maintained, else2 T(n/2) + O(n log n).
증명. 두 절반 재귀 2T(n/2). Strip 정렬 + 검사 O(n) (y-sort merge from sub-lists) 또는 O(n log n) (re-sort). ∎
정리 21.3 (Closest Pair Correctness).
Shamos–Hoey 알고리즘은 closest pair 를 정확히 출력.
증명. (Left/Right 만에서 closest) recursive correctness. (Cross pair 검사) 보조정리 21.1 의 7 candidates 로 모든 cross pair 후보 ≤ δ 범위 안의 점들 검사. 검사 결과 모든 가능한 cross-pair 가 보임. ∎
정리 21.4 (Time).
Shamos–Hoey
O(n log n). Pre-sortO(n log n), recursionO(n log n).
증명. Master theorem 의 case 2 (T(n) = 2T(n/2) + O(n) → O(n log n)). ∎
하계. Ω(n log n) (element distinctness 환원). 따라서 비교 모델에서 최적.
정리 21.5 (Rabin 1976, randomized linear).
Closest pair 의 expected
O(n)randomized.
증명 개요. Geometric hashing — 임의 부분집합의 closest pair δ 를 추정, grid size δ 의 hash table 로 후보 추출. 자세한 분석 Rabin 1976. ∎
(a) KD-tree based. Multi-dim closest pair. Bentley 1975.
(b) Approximate nearest neighbor (ANN). 고차원. Indyk-Motwani 1998 LSH.
(c) Closest pair under different metric. L1, L∞ 거리.
(d) Dynamic closest pair. 점 추가/삭제 시 유지. O(log² n) per update (Smid 1992).
(e) Closest pair on the sphere. 지구상의 두 도시.
(f) 3D closest pair. 분할정복 + sweep plane. O(n log n).
SH 1975 FOCS 의 12 페이지. 계산 기하 의 분할 정복 의 한 대표 예. 7-candidates lemma 의 우아한 증명.
Michael Shamos (9장 §10 참조). Computational Geometry 의 창시자.
Dan Hoey (9장 §10 참조).
Michael O. Rabin (1931~). 이스라엘 출생. Hebrew University 박사 (1956). Harvard, Hebrew University. 1976 Turing Award. probabilistic algorithm, Miller-Rabin primality (1976), 오토마타 이론 의 거인.
Expert 21 — 사각형 — 의 풀이.
1. 점 입력 — 정사각형 안 n 개 점. 2. Shamos–Hoey 분할정복 O(n log n). 3. (옵션) Rabin's randomized O(n) expected. 4. (옵션) Closest pair 의 좌표 좌표 출력 — distance 외에.
자매책 deep-dive: https://srv1659437.hstgr.cloud/books/expert-algorithms/deep-dive/21-square.html
*왜 이 장이 책 전체의 마지막에 어울리는가.* Closest Pair 는 알고리즘 책의 한 보석. 분할정복의 우아한 분석, 7-candidates lemma 의 영리한 기하적 관찰, 모든 분야에 응용. 9장 (Sweep Line) 과의 대칭적 친척. 1장 (Dijkstra) 와 같이 근본적 도구. 한 책의 순환적 마감 — 가장 단순해 보이지만 깊이 우아한 결과로.
그림 21.3 ― Closest Pair 알고리즘 비교.
알고리즘 시간 실용성
──────────────────────────────────────────────────────
Brute force O(n²) small n
Shamos-Hoey D&C O(n log n) 표준
Rabin randomized O(n) expected 복잡
Khuller-Matias O(n) expected 교육적
Voronoi diagram O(n log n) via 9장
KD-tree O(n log n) average 다용도
──────────────────────────────────────────────────────
그림 21.3ᵇ ― Closest Pair 의 역사적 발견 의 의의.
알고리즘 발견 시점 복잡도 의의
─────────────────────────────────────────────────────────────
Brute force O(n²) 그 전까지의 표준
Shamos-Hoey 1975 O(n log n) *분할 정복 + 7-lemma* 의 우아함
Rabin 1976 O(n) Las Vegas *기하 hashing* 의 첫 사례
Khuller-Matias 1995 O(n) Las Vegas 단순 randomized sieve
LSH (Indyk-Motwani 1998) approx 고차원에서의 표준
─────────────────────────────────────────────────────────────
"n log n → n 의 50년" — 알고리즘 분야의 천천한 진보.
그림 21.4 ― 21문제의 한 풍경.
책의 21문제 가 다룬 알고리즘 패러다임:
결정적 그리디: 1 (Dijkstra), 3 (Greedy Exchange), 4 (UF), 12 (MST)
휴리스틱: 2 (LS), 5 (NN+Or-opt), 8 (SA), 14 (VRP)
동적 계획법: 11 (Bitmask DP), 16 (CHT)
기하 알고리즘: 9 (Sweep), 13 (Integral Image), 21 (Closest Pair) ← 본 장
흐름·매칭: 7 (MCF), 10 (Hungarian)
탐색: 6 (BFS)
확률·통계: 19 (k-means), 20 (PF)
근사: 15 (Facility Location)
온라인·게임: 17 (Online), 18 (Pursuit-Evasion)
──────────────────────────────────────────────────────
21문제의 한 결합. 책의 끝에서 — 우리는 21개 다양한 도구 를 다 보았다. 다익스트라의 그리디 옳음 부터 Particle Filter 의 확률적 추정 까지. 각 도구가 자기 자리에서 최선. 알고리즘 책의 한 도서관. 한 책을 다 읽었다면 — 알고리즘 사고 의 큰 풍경 을 손에 쥔 것.
한 책의 끝, 한 시작. 이 책 21장이 끝이지만 — 알고리즘은 항상 진화 한다. 1장의 Dijkstra (1959) 가 60+년 후 까지 진화 중 (Thorup 1999). 20장의 PF (1993) 가 2010~20년대 deep learning 과 결합. 한 책의 지식 은 현재의 단면. 내일 더 진화한다. 다음에 알고리즘 책 두 번째 판 이 쓰여지면 — 그 때까지 우리도 공부 한다.
책의 마지막 한 줄. "그리디는 빠르고, 다익스트라는 옳다. 그러나 — 알고리즘 책의 한 진실 — 모든 알고리즘이 자기 자리에서 옳다. 책의 한 도서관이 그 21개 자리 의 지도."
[ShamosHoey1975]
[Bentley1975]
[Rabin1976]
[KhullerMatias1995]
[Fortune1987]
[deBerg2008]
[PreparataShamos1985]
전체 항목은 bibliography.md.
스물한 개의 문을 지나, 한 그루의 나무가 보인다.
"프로그래밍의 어려움은 우리의 도구가 아직 어리다는 데 있다. 도구가 자라기를 기다리는 동안, 우리는 도구를 읽어야 한다." — Edsger W. Dijkstra (서문에서 다시)
이 책의 21장을 다 읽었다면, 머릿속에 한 가계도 가 자라났을 것이다. 그 가계도의 모양은 다음과 같다.
알고리즘의 한 도서관
│
┌────────────────┼────────────────┐
▼ ▼ ▼
최적성 보장 근사·휴리스틱 게임·확률
(P 시간 가능) (NP-난해 의 자리) (시간·불확실성)
│ │ │
┌────┼────┐ ┌────┼────┐ ┌───┼───┐
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
1 3,4 7,10 2,5 8,15 14 17 18 19,20
(Dij) (Gex (MCF (LS (SA (VRP (Online (Pursuit (PF
jk- (UF (Hung) (FacLoc) (Cops) (kmean)
(MST)
▲
▲
│
기하·자료구조
│
┌────┼────────┐
▼ ▼ ▼ ▼
6 9 13 21
(BFS)(Sweep (II)(CP)
11 (Bitmask DP)
16 (CHT)
12 (MST 의 한 부분)
스물한 알고리즘이 세 큰 줄기 와 기하·DP 의 가지 로 나뉜다. 한 줄기는 결정적 정확성 — 다익스트라, 매칭, MST, 흐름. 다른 줄기는 근사적 우아함 — 로컬 서치, SA, VRP, 시설 위치. 셋째 줄기는 시간과 무작위 — 온라인, 추적 게임, k-means, Particle Filter. 가지는 기하학과 자료구조 — BFS, Sweep, Integral Image, Closest Pair, Bitmask DP, CHT.
이 가계도의 각 자리 에 한 알고리즘 이 자리잡고 있다. 그 알고리즘은 Expert N번 문제 의 풀이의 부품 이지만, 동시에 60~100 년의 알고리즘 사 史 의 한 페이지이기도 하다.
서문에서 우리는 두 겹의 테마 를 약속했다 — 도구와 세계, 그리디가 끝나는 곳. 21장을 다 읽은 지금, 두 테마가 한 그림으로 모인다.
그리디가 끝나는 자리 의 풍경. 1장 (Dijkstra) 에서 우리는 그리디인데도 옳은 자리를 봤다 — 비음수 가중치 가 그리디를 보장. 3장 (Greedy Exchange) 에서 그 옳음의 일반 이론 — matroid — 을 봤다. 4장 (Union-Find) 와 12장 (MST) 가 matroid 위의 그리디 의 대표 사례. 한 줄기의 시작.
그 다음 — 그리디가 무너지는 자리. 2장 (Local Search) 의 국소 최적 함정. 5장 (NN+Or-opt) 의 log n 보장의 한계. 8장 (SA) 의 온도 메커니즘으로 함정 탈출. 14장 (VRP) 와 15장 (FacLoc) 의 근사 보장의 정량성. 11장 (Bitmask DP) 의 NP-난해 의 정확한 알고리즘.
그 사이 — 그리디가 단순하지 않은 자리. 7장 (MCF) 의 흐름과 듀얼. 10장 (Hungarian) 의 듀얼 변형. 6장 (BFS) 의 기하학적 단순성. 13장 (Integral Image) 의 전처리 트릭. 9장 (Sweep) 의 차원 축소. 16장 (CHT) 의 DP 최적화. 21장 (Closest Pair) 의 분할 정복.
그리고 마지막 — 시간과 무작위 의 자리. 17장 (Online) 의 불완전 정보. 18장 (Pursuit-Evasion) 의 적대적 환경. 19장 (k-means) 의 반복 추정. 20장 (PF) 의 확률적 필터링.
이 네 가지 자리 — 그리디 옳음, 그리디 무너짐, 그리디 우회, 시간·무작위 — 가 알고리즘 의 전체 풍경. 한 책의 21문제가 그 풍경의 대표적 사례 들이다.
이 책의 비목표 (서문 §5) 외에도, 분량의 한계로 깊이 다루지 못한 분야들 이 있다.
Suffix Automata / Suffix Tree — 문자열 알고리즘. Ukkonen 1995 의 online suffix tree. 이 책의 21문제에 직접 필요하지 않아 빠짐.
Persistent Data Structures — 4장의 Union-Find 의 시간 여행 가능 버전. Conchon-Filliâtre 2007. 한 문장으로 언급만.
Approximation Algorithms 의 깊은 자리 — 15장 (FacLoc) 외 PCP theorem, Hardness of Approximation, Unique Games Conjecture. 한 분야 전체 가 빠짐.
LP Duality 의 정밀한 사용 — 7장, 10장에서 언급 만. 완전한 polyhedral combinatorics 는 Schrijver 의 책 3권을 따로 보아야.
Computational Topology — Persistent Homology, Mapper. 위상수학과 알고리즘 의 현대 분야.
Quantum Algorithms — 8장에서 Quantum Annealing 언급. Shor, Grover 같은 진정한 양자 알고리즘 은 별도 분야.
Deep Learning Theory — 19장의 k-means 가 최단 EM-style. 그러나 backpropagation, transformers, attention 의 현대 deep learning 은 알고리즘 책 의 영역을 벗어남.
이 모든 빠진 분야 가 각자 한 권의 책 을 가질 만한 큰 풍경. 21문제로는 모두 다룰 수 없다. 그러나 한 풍경의 한 단면 으로 충분.
이 책 을 다 읽은 독자가 다음에 갈 곳 은 어디인가?
*Donald Knuth의 The Art of Computer Programming*** (1962~ , 7 volumes 중 4까지 출간). 알고리즘의 성경. 이 책의 모든 알고리즘 의 정밀한 분석. 고전을 알고 싶다면 TAOCP.
*Cormen-Leiserson-Rivest-Stein (CLRS) — Introduction to Algorithms*** (4th ed., 2022). 알고리즘 학부 표준 교과서. 체계적 + 정밀. 이 책의 다른 측면 의 보완.
*Sedgewick-Wayne — Algorithms*** (4th ed., 2011). 실용적 + Java 구현. 코드 와 알고리즘 의 결합.
*Vazirani — Approximation Algorithms*** (2001). 15장의 깊이.
*Motwani-Raghavan — Randomized Algorithms*** (1995). 8장, 19장, 20장의 깊이.
*Williamson-Shmoys — The Design of Approximation Algorithms*** (2011). 15장의 현대 표준.
*Thrun-Burgard-Fox — Probabilistic Robotics*** (2005). 20장의 깊이.
*Toth-Vigo — The Vehicle Routing Problem*** (2014). 14장의 깊이.
*de Berg et al. — Computational Geometry*** (3rd ed., 2008). 9장, 13장, 21장의 깊이.
*Bonato-Nowakowski — The Game of Cops and Robbers on Graphs*** (2011). 18장의 깊이.
*Borodin-El-Yaniv — Online Computation*** (1998). 17장의 깊이.
이 10권의 책 이 현재 알고리즘 분야의 표준. 21문제로 입문 한 후 각 분야의 깊은 자리 로 가기에 적절.
이 책의 21문제는 Expert 알고리즘 대회 문제 에서 왔다. 대회 문제 가 알고리즘 책의 출발점 이라는 사실이 흥미롭다. 왜냐하면 — 대회 문제는 실용적 동기 + 학술적 깊이 의 교차점 이기 때문.
실용적 동기 — 로봇청소기 (1장), 안테나 (2장), 물류 (3장), IoT (4장), 택시 (5장), 바이러스 (6장), 교통 (7장), 우주선 (8장), 드론 (9장), … — 모두 현실 응용 의 간결한 추출. 한 문제가 수십 분야의 응용 을 대표.
학술적 깊이 — 각 문제의 풀이가 알고리즘 사 史 의 한 페이지. 다익스트라 (1959), Union-Find (Tarjan 1975), Hungarian (Kuhn 1955 / König-Egerváry 1931), Particle Filter (1993). 각자 한 시대의 정점.
대회 문제 가 이 두 측면을 동시에 가지는 것은 — 출제자들이 실용적 동기 를 학술적 도구 로 번역 했기 때문. 출제자가 알고리즘 사 史 의 한 정점 을 교묘한 응용 으로 포장. 풀이를 한 사람은 그 도구를 사용 하면서 그 시대를 만짐.
이 책의 21장 은 그 21번의 만짐 의 언어화. 풀이는 자매책 expert-algorithms 에 있다. 이 책은 그 풀이가 왜 옳은가 의 답 — 그리고 그 답의 역사적 발전 — 을 언어로 풀어 쓴다.
서문에서 우리는 한 줄로 약속했다:
"한 장 한 장이 독립적으로 가치를 가진 글이다. 21장 중 어느 한 장만 떼어 읽어도, 그 알고리즘 하나에 대해 다른 어떤 한국어 자료보다 더 깊이 알고 일어난다. 그 21개가 모이면, 그것은 900쪽 안팎의 단행본이 된다."
이 약속이 지켜졌는가 — 그 답은 독자의 손에 있다. 이 책의 21장 중 하나를 떼어 친구에게 보여줄 때, 그 친구가 그 알고리즘 하나에 대해 새로운 것을 배웠다 고 말하면 — 약속이 지켜진 것.
그리고 — 공저자 의 약속. 이 책을 만든 사람 (kiyaaa) 의 알고리즘 학습의 자취 가 이 책이다. 21번의 풀이 가 21번의 학습. 그 학습의 언어화 가 한 책. 다음에 알고리즘 책 두 번째 권 이 쓰일 때, 그 책의 출발은 21문제 다음의 무언가.
알고리즘 책의 한 진실 — 모든 알고리즘이 자기 자리에서 옳다. 다익스트라는 그리디 가 옳은 자리. Local Search 는 국소 최적 만 보장하는 자리. Particle Filter 는 확률적 추정의 자리.
어떤 자리에서나 — 옳음의 정도 가 있다. 옳음 의 정도 가 알고리즘의 성격. 완전 옳음 (1, 3, 4, 7, 10, 11, 12) 부터 근사 옳음 (5, 14, 15) 까지, 확률적 옳음 (8, 19, 20) 부터 경쟁적 옳음 (17, 18) 까지.
이 옳음의 풍경 이 21문제 의 공통 지도. 한 책의 도서관이 이 지도 위의 21 자리. 다음에 새 문제 가 오면 — 이 지도 위의 어딘가 에 자리잡을 것. 우리는 그 자리를 이 책의 한 장 으로 연결 할 수 있다.
알고리즘 책의 마지막 한 줄 의 약속.
그리디는 빠르고, 다익스트라는 옳다. 그리고 가끔, 둘은 같다. 그러나 — 모든 알고리즘 이 자기 자리에서 옳다. 21문제 가 그 자리들의 한 지도다.
마지막 한 줄 의 한 줄.
책이 끝났다. 알고리즘은 계속 산다.
— kiyaaa, 2026년 5월. 한 책의 작성자.
| № | 문제 | 알고리즘 | 한 줄의 마법 |
|---|---|---|---|
| 1 | 로봇청소기 | Dijkstra | 비음수 가중치 가정이 그리디를 보장. |
| 2 | 안테나 | Local Search | 국소 최적 만이라도, 체계적으로. |
| 3 | 물류 | Greedy Exchange | Matroid 위의 그리디 = OPT. |
| 4 | IoT | Union-Find | α(n) 은 4 이하, 사실상 상수. |
| 5 | 택시 | NN + Or-opt | log n 보장 + 실용 우수. |
| 6 | 바이러스 | BFS | 큐가 단조 증가, 정점이 한 번. |
| 7 | 교통 | Min-Cost Flow | LP duality 의 조합론적 사례. |
| 8 | 우주선 | Simulated Annealing | 식어가며 분지에 자리잡음. |
| 9 | 드론 | Sweep Line | 2D → 1D 의 차원 축소. |
| 10 | 원변환 | Hungarian | 듀얼 가격 조정의 우아함. |
| 11 | 단백질 | Bitmask DP | n² · 2^n 이 n! 보다 훨씬 작다. |
| 12 | 도로 | MST | Cut property 의 그리디 정당화. |
| 13 | 칩 | Integral Image | 한 줄의 점화식 → O(1) 사각형 합. |
| 14 | 배달원 | VRP Savings | 합치는 절약 큰 순. |
| 15 | 대피소 | Facility Location | LP rounding 의 패러다임. |
| 16 | TV화질 | Convex Hull Trick | 직선의 lower envelope 의 영리한 자료구조. |
| 17 | 은행 | Online Algorithm | 미래 모르고도 OPT 의 c 배 이내. |
| 18 | 도망자–숲 | Cops and Robbers | Dismantlable = cop-win. |
| 19 | 쓰레기통 | Lloyd's k-means | 반복 + 무게중심. |
| 20 | 어디인가? | Particle Filter | 수천 추측의 합주. |
| 21 | 사각형 | Closest Pair | 7 candidates lemma 의 분할 정복. |
— 끝.
[AartsKorst1989] [AartsLenstra2003] [AhujaMagnantiOrlin1993] [AignerFromme1984] [Andrew1979] A. M. Andrew. "Another Efficient Algorithm for Convex Hulls in Two [ApplegateBixbyChvatalCook2006] [ArthurVassilvitskii2007] [BansalBuchbinderNaor2014] [Bellman1957] Richard Bellman. Dynamic Programming. Princeton University Press, 1957. [Bellman1958] Richard Bellman. "On a routing problem." [Bellman1962] Richard Bellman. "Dynamic Programming Treatment of the Travelling [Bentley1975] Jon L. Bentley. "Multidimensional Binary Search Trees Used for [Bentley1978] Jon Louis Bentley. "Decomposable Searching Problems." [BentleyOttmann1979] [BentleySaxe1980] [BjorklundHusfeldt2008] [BoissonnatYvinec1998] [BonatoNowakowski2011] [BorodinElYaniv1998] [Boruvka1926] Otakar Borůvka. "O jistém problému minimálním." Práce moravské [Bregman1967] L. M. Bregman. "The Relaxation Method of Finding the Common Point of [BurkardDellAmicoMartello2012] [CLRS2022] Ch. 20.2 "Breadth-First Search." [CLRS2022] Ch. 24 "Maximum Flow", §24.4 "Min-Cost Flow Extension". [CLRS2022] Cormen et al. Introduction to Algorithms (4th ed.). MIT Press, 2022. [CLRS2022] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. [CernyV1985] Vladimír Černý. "Thermodynamical Approach to the Traveling Salesman [ChandraKarloffTovey1999] [CharikarGuhaTardosShmoys2002] [Chazelle2000] Bernard Chazelle. "A Minimum Spanning Tree Algorithm with [ChenChan2011] Hung-Yi Chen, Timothy M. Chan. "On the Tradeoff Between Sorting and [Christofides1976] [ClarkeWright1964] G. Clarke, J. W. Wright. "Scheduling of Vehicles from a Central [CormenLeisersonRivestStein2022] [CrisanDoucet2002] [Crow1984] Franklin C. Crow. "Summed-Area Tables for Texture Mapping." [Dantzig1963] George B. Dantzig. Linear Programming and Extensions. [DantzigRamser1959] G. B. Dantzig, J. H. Ramser. "The Truck Dispatching Problem." [DelMoral2004] Pierre Del Moral. Feynman-Kac Formulae: Genealogical and Interacting [Dial1969] Robert B. Dial. "Algorithm 360: Shortest-Path Forest with Topological [Dijkstra1959] Edsger W. Dijkstra. "A Note on Two Problems in Connexion with Graphs." [Dijkstra2010] Philip L. Frana. "An Interview with Edsger W. Dijkstra." [Doucet2001] Arnaud Doucet, Nando de Freitas, Neil Gordon (eds). Sequential Monte [DueckScheuer1990] [Edmonds1965] Jack Edmonds. "Paths, Trees, and Flowers." [Edmonds1971] Jack Edmonds. "Matroids and the Greedy Algorithm." [EdmondsKarp1972] [Egervary1931] Jenő Egerváry. "On Combinatorial Properties of Matrices." [FiatKarlin1991] [Ford1956] Lester R. Ford. "Network flow theory." RAND Paper P-923 (1956). [FordFulkerson1956] [Fortune1987] Steven Fortune. "A Sweepline Algorithm for Voronoi Diagrams." [Fortune1987] Steven Fortune. "A Sweepline Algorithm for Voronoi Diagrams." [FredmanTarjan1987] [FreemanAdelson1991] [GalilGiancarlo1989] [GallerFischer1964] [GareyJohnson1979] [GemanGeman1984] [Gendreau2007] Michel Gendreau et al. "Handbook of Metaheuristics." [Glauber1963] Roy J. Glauber. "Time-Dependent Statistics of the Ising Model." [Glover1986] Fred Glover. "Future Paths for Integer Programming and Links to [GoldbergTarjan1989] [GordonSalmondSmith1993] [Graham1972] Ronald L. Graham. "An Efficient Algorithm for Determining the Convex [GrahamHell1985] [HartNilssonRaphael1968] [Hastings1970] W. K. Hastings. "Monte Carlo Sampling Methods Using Markov Chains [Heckbert1986] Paul S. Heckbert. "Survey of Texture Mapping." [HeldKarp1962] Michael Held, Richard M. Karp. "A Dynamic Programming Approach to [HeldKarp1971] Michael Held, Richard M. Karp. "The Traveling-Salesman Problem and [Hochbaum1982] Dorit S. Hochbaum. "Heuristics for the Fixed Cost Median Problem." [HopcroftKarp1973] [HopcroftUllman1973] [Huffman1952] David A. Huffman. "A Method for the Construction of Minimum-Redundancy [Isaacs1965] Rufus Isaacs. Differential Games: A Mathematical Theory with [JainVazirani2001] [Jarnik1930] Vojtěch Jarník. "O jistém problému minimálním." Práce moravské [JohnsonPapadimitriouYannakakis1988] [Kalman1960] Rudolf E. Kalman. "A New Approach to Linear Filtering and Prediction [KanungoMountNetanyahuPiatkoSilvermanWu2002] [KargerKleinTarjan1995] [KarlinKleinOveisGharan2021] [Karp1977] Richard M. Karp. "Probabilistic Analysis of Partitioning Algorithms [Karp1979] Richard M. Karp. "A Patching Algorithm for the Nonsymmetric Traveling [KhullerMatias1995] [KirkpatrickGelattVecchi1983] [Klein1967] Morton Klein. "A Primal Method for Minimal Cost Flows with Applications [KleinbergTardos2005] [Konig1931] Dénes Kőnig. "Graphs and Matrices." Matematikai és Fizikai Lapok 38 [KoutsoupiasPapadimitriou1995] [Kruskal1956] Joseph B. Kruskal. "On the Shortest Spanning Subtree of a Graph and [Kuhn1955] Harold W. Kuhn. "The Hungarian Method for the Assignment Problem." [Lee1961] C. Y. Lee. "An Algorithm for Path Connections and Its Applications." [Lin1965] Shen Lin. "Computer Solutions of the Traveling Salesman Problem." [LinKernighan1973] [LinVitter1992] Jyh-Han Lin, Jeffrey Scott Vitter. "ε-approximations with Minimum [Lloyd1982] Stuart P. Lloyd. "Least Squares Quantization in PCM." [MacQueen1967] J. MacQueen. "Some Methods for Classification and Analysis of [ManasseMcGeochSleator1990] [MetropolisRosenbluthTeller1953] [MeyerSanders2003] [MladenovicHansen1997] [Moore1959] Edward F. Moore. "The Shortest Path Through a Maze." [Munkres1957] James Munkres. "Algorithms for the Assignment and Transportation [NewmanBarabasiWatts2006] [NowakowskiWinkler1983] [Or1976] Ilhan Or. "Traveling Salesman-Type Combinatorial Problems and Their [Orlin2013] James B. Orlin. "Max Flows in O(nm) Time, or Better." [OstrovskyRabaniSchulmanSwamy2012] [Oxley2011] James Oxley. Matroid Theory (2nd ed.). Oxford University Press, 2011. [PapadimitriouSteiglitz1982] [ParsonsLogan1976] [Petrosyan1993] Leon A. Petrosyan. Differential Games of Pursuit. World Scientific, 1993. [Pohl1971] Ira Pohl. "Bi-directional Search." Machine Intelligence 6 (1971): 127–140. [PreparataShamos1985] [Prim1957] Robert C. Prim. "Shortest Connection Networks and Some Generalizations." [Quilliot1978] Alain Quilliot. "Discrete Pursuit Games." [Rabin1976] Michael O. Rabin. "Probabilistic Algorithms." [RosenkrantzStearnsLewis1977] [Sculley2010] D. Sculley. "Web-Scale K-Means Clustering." [SedgewickWayne2011] [ShamosHoey1975] [ShamosHoey1976] Michael I. Shamos, Dan Hoey. "Geometric Intersection Problems." [Shanbhag2010] Arjun Shanbhag et al. "Fast Integral Image Computation." [ShmoysTardosAardal1997] [SleatorTarjan1985] [Tarjan1975] Robert E. Tarjan. "Efficiency of a Good But Not Linear Set Union [Tarjan1979] Robert E. Tarjan. "Applications of Path Compression on Balanced [Tarjan1983] Robert E. Tarjan. Data Structures and Network Algorithms. [TarjanVanLeeuwen1984] [Thorup1999] Mikkel Thorup. "Undirected single-source shortest paths with positive [ThrunBurgardFox2005] [Tomizawa1971] N. Tomizawa. "On Some Techniques Useful for Solution of Transportation [TothVigo2002] Paolo Toth, Daniele Vigo (eds.). The Vehicle Routing Problem. [Toussaint1983] Godfried T. Toussaint. "Solving Geometric Problems with the Rotating [Vazirani2001] Vijay V. Vazirani. Approximation Algorithms. Springer, 2001. [Vidal2022] Thibaut Vidal et al. "A Concise Guide to Existing and Emerging [ViolaJones2001] [Welsh1976] D. J. A. Welsh. Matroid Theory. Academic Press, 1976. [Whitney1935] Hassler Whitney. "On the Abstract Properties of Linear Dependence." [WilliamsonShmoys2011] [Woeginger2003] Gerhard J. Woeginger. "Exact Algorithms for NP-Hard Problems: A Survey." [WrenHolliday1972] Anthony Wren, A. Holliday. "Computer Scheduling of Vehicles from One [deBerg2008] Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars. [deBerg2008] Mark de Berg et al. Computational Geometry: Algorithms and Applications