욕심쟁이 알고리즘(Greedy algorithm)
매 순간 가장 좋아 보이는 선택을 하고 되돌아보지 않는 방법. 우리가 쓰는 동전의 거스름돈이나 최소 신장 트리(minimum spanning tree)처럼 정확한 경우도 있고, 크게 틀리는 경우도 있다.
욕심쟁이 알고리즘은 답을 한 조각씩 쌓아 가면서, 매번 지금 당장 가장 좋아 보이는 조각을 고르고 다시는 되돌아보지 않습니다. 멀리 내다보지 않으니 빠르고 간단합니다. 문제는 그렇게 모은 답이 정말 가장 좋은 답이냐는 것인데, 문제에 따라 늘 그렇기도 하고 크게 틀리기도 합니다.
거스름돈이 전형적인 예입니다. 남은 금액을 넘지 않는 가장 큰 동전부터 냅니다. 동전
1, 5, 10, 50처럼 우리가 쓰는 동전 체계에서는 욕심쟁이가 늘 가장 적은 개수를 냅니다. 그러나 1, 3, 4원짜리만 있으면 6원을 4 + 1 + 1로 세 개 내는데, 3 + 3 두 개면 충분합니다. 큰 동전을 먼저 쓴 선택이 나중의 가능성을 막아 버린 것입니다. 이럴 때는 1원부터 차례로 모든 금액의 최소 개수를 표에 채우는 동적 계획법(dynamic programming)으로 정확한 답을 구합니다. 아래 줄이 그렇게 구한 답입니다.
욕심쟁이가 옳다는 것은 보통 바꿔치기로 증명합니다. 가장 좋은 답이 욕심쟁이의 첫 선택과 다르다면, 그 부분을 욕심쟁이의 선택으로 바꿔도 나빠지지 않음을 보이는 것입니다. 이렇게 증명되는 대표적인 예가 순환을 만들지 않는 한 가장 짧은 변부터 고르는 크러스컬의 최소 신장 트리, 가장 드문 두 기호부터 묶는 허프만 부호(Huffman coding), 가장 가까운 점부터 확정하는 다익스트라 알고리즘(에츠허르 데이크스트라)의 최단 경로(shortest path)입니다. 다익스트라 알고리즘(Dijkstra's algorithm)은 변의 길이가 음수가 아닐 때만 옳습니다. 음수 변이 있으면 이미 확정한 점에 나중에 더 짧은 길이 생길 수 있기 때문입니다. 회의실 하나에 겹치지 않게 가장 많은 회의를 넣는 문제에서도 '가장 일찍 끝나는 회의부터'라는 욕심이 정답을 줍니다.
반면 여러 도시를 한 번씩 도는 가장 짧은 길을 '가장 가까운 도시부터' 고르는 방법은 최적보다 훨씬 긴 길을 내기도 하고, 나라마다 차례로 이웃과 겹치지 않는 가장 앞 번호의 색을 칠하는 방법은 순서에 따라 4색 정리(four color theorem)가 보장하는 네 가지보다 많은 색을 쓰기도 합니다. 이런 실패는 언덕을 오를 때 늘 가장 가파른 쪽으로만 가다가 가까운 봉우리(국소 최적)에 갇히는 것과 닮았습니다. 연속적인 최적화(optimization)에서 경사 하강법(gradient descent)이 빠지는 함정도 같은 모양입니다.
이어지는 곳. 1, b, b², …처럼 진법(positional notation)의 자릿값으로 된 동전이라면 욕심쟁이가 언제나 최적이고, 그 답은 금액을 b진법으로 쓴 각 자리의 숫자입니다. 수에서 정수(integer) 부분을 최대한 떼어 내고 나머지를 뒤집기를 되풀이하는 연분수(continued fraction) 전개도 욕심쟁이 과정입니다. 욕심쟁이가 언제 옳은지는 매트로이드(matroid)라는 구조로 깔끔하게 설명됩니다. 매트로이드는 '독립(independence)'이라 부르는 부분집합(subset)들의 모임으로, 독립인 집합(set)의 부분집합은 여전히 독립이고, 작은 독립 집합은 더 큰 독립 집합에서 원소(element) 하나를 빌려 와 독립을 유지한 채 늘릴 수 있다는 두 규칙을 지킵니다. 원소마다 양수 무게가 있을 때 무게의 합이 가장 큰 독립 집합을 찾는 문제는, 이 두 규칙이 성립하면 욕심쟁이(무거운 것부터, 독립이 깨지지 않는 한 담기)가 언제나 정확히 풉니다. 거꾸로, 첫째 규칙을 지키는 모임에서 어떤 무게를 주어도 욕심쟁이가 통한다면 그 모임은 둘째 규칙도 지킵니다. 그래프에서 순환을 만들지 않는 변들의 모임이 대표적인 매트로이드이고, 그래서 최소 신장 트리에서 욕심쟁이가 통합니다. 언어 모델(language model)이 매번 확률(probability)이 가장 큰 토큰(token) 하나를 고르는 탐욕 디코딩(greedy decoding)도 욕심쟁이라서, 확률이 가장 큰 문장을 찾는다는 보장이 없습니다(디코딩).
이 개념이 나오는 긴 글
이 개념을 언급하는 페이지
- 최적화
… 지도 위 가장 빠른 길 찾기는 최단 경로 문제입니다. 매 순간 가장 좋아 보이는 갈림길만 고르는욕심쟁이 알고리즘은 빠르지만 늘 최선의 답을 주지는 않습니다. 길이가 음수인 길이 없는 최단 경로 문제처럼, 욕심쟁이 …
- 4색 정리
… 수 없습니다. '순서대로 칠하기'는 나라를 번호 순으로 보며, 이웃이 아직 쓰지 않은 가장 앞 색을 고르는욕심쟁이 방법입니다. 빠르지만 앞의 선택을 되돌리지 않아서 다섯째 색(보라)이나 그 이상이 필요해질 때가 있습니다. 이 …
- 최단 경로
… 점들의 집합이 출발점에서 물결처럼 퍼져 나갑니다. 지금 가장 좋아 보이는 점을 골라 되돌아보지 않으니,욕심쟁이 알고리즘이 정확한 답을 주는 대표적인 경우입니다. 잠정 거리가 가장 작은 점을 빠르게 꺼내려고, 가장 작은 값을 …
- 알고리즘
… 작은 문제의 답을 표에 적어 두고 다시 쓰는 동적 계획법, 매 순간 가장 좋아 보이는 것을 고르는욕심쟁이 알고리즘, 계산 도중 동전을 던지는 무작위 알고리즘입니다. 가장 많이 연구된 과제는 목록을 크기순으로 늘어놓는 …
- 동적 계획법
… 표도 모두 동적 계획법입니다. 분할 정복과 달리 하위 문제가 겹칠 때 쓰고, 매 순간 하나만 고르는욕심쟁이 알고리즘이 틀리는 문제도 모든 작은 문제의 답을 표에 담아 바르게 풉니다. 벨먼의 '최적 경로의 뒷부분도 …
- 힙과 우선순위 큐
… 점을 힙에서 꺼냅니다. 허프만 부호는 가장 드문 두 기호를 힙에서 꺼내 묶은 뒤 다시 넣기를 되풀이하는욕심쟁이 알고리즘입니다. 최대 힙과 최소 힙을 하나씩 두면 값이 계속 들어오는 동안에도 중앙값을 곧바로 읽을 수 있고, …
- 최소 신장 트리
… 만드는 변)이면 버리고 아니면 받아들입니다. 매 순간 가장 좋아 보이는 것을 고르고 되돌아보지 않는욕심쟁이 알고리즘인데, 이 문제에서는 정확히 최적입니다. 방법: . 새 마을 점을 끌어 옮기면 트리가 바로 다시 …
- 최대 흐름 최소 절단 정리
… 아직 여유가 있는 길(증가 경로)을 찾아 그 길의 가장 좁은 여유만큼 더 보내는 것입니다. 다만 순진하게욕심쟁이로 보내기만 하면 막다른 곳에 갇힐 수 있습니다. 그래서 이미 흐르는 관은 거꾸로도 지날 수 있게 합니다. …
- 안정 매칭
… 게일–섀플리 절차는 매 순간 가장 좋은 곳에 지원하지만 보류로 결정을 미루기 때문에, 한 번 고르면 끝인욕심쟁이 알고리즘과 달리 늘 안정한 답에 닿는 알고리즘입니다.
- 허프만 부호
… 매번 가장 가벼운 둘을 묶는 것이 최적임이 따라 나옵니다. 매 순간 가장 좋아 보이는 선택을 하는욕심쟁이 알고리즘이 정확한 답을 주는 드문 예입니다. 가장 가벼운 둘을 꺼내는 데 우선순위 큐를 쓰면 글자가 k가지일 …
- 선형 계획법
… 좋은 것을 고르는 일 전반은 가장 좋은 것 고르기에서, 가능한 조합이 폭발하는 문제는 동적 계획법과욕심쟁이 알고리즘에서 이어집니다.
- 결정 트리와 랜덤 포레스트
… 가장 좋은 질문을 고르고, 정한 깊이에 이르거나 한 색만 남으면 멈춥니다. 매 순간 눈앞의 이득만 보는욕심쟁이 알고리즘이라 전체로 가장 작은 나무를 찾는다는 보장은 없습니다. 자료를 모두 맞히면서 평균 질문 수가 가장 적은 …
- 토큰화와 BPE
… 점에서 렘펠–지브 압축과 같은 생각입니다. 다만 BPE는 매 단계 가장 좋아 보이는 쌍을 고르는욕심쟁이 알고리즘이라, 같은 어휘 크기에서 토큰 수를 가장 적게 만든다는 보장은 없습니다. 새 글을 자를 때는 배운 병합을 …
- 디코딩: 온도, top-p, 빔 탐색
… 거의 다 살펴야 합니다. 그래서 보통은 빔 탐색 같은 근사에 기댑니다. 매 단계 눈앞의 최선을 고르는욕심쟁이 알고리즘이 전체 최선을 놓치는 전형적인 경우이고, 후보를 몇 개만 남기고 가지를 치는 것은 게임 트리 탐색과 …