Greedy Algorithm
What is Greedy?
탐욕 알고리즘은 최적해를 구하는 데 사용되는 근시안적인 방법
일반적으로, 머릿속에 떠오르는 생각을 검증없이 바로 구현하면 Greedy 접근이 됨
여러 경우 중 하나를 선택할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달함.
각 지점에서 이루어지는 결정은 지역적으로는 최적이지만, 그 선택들을 계속 수집하여 최종적인 해답을 만들었다고 하여, 그것이 최적이라는 보장은 없다
일단, 한번 선택된 것은 번복하지 않는다
이런 특성 때문에 대부분의 탐욕 알고리즘들은 단순함
제한적인 문제들에 적용됨
최적화 문제(optimization)
란 가능한 해들 중에서 가장 좋은 (최대 또는 최소) 해를 찾는 문제
How it works?
1. 해 선택
현재 상태에서 부분 문제의 최적 해를 구한 뒤, 이를 부분해 집합 (
Solution Set
)에 추가한다
2. 실행 가능성 검사
새로운 부분 해 집합이 실행가능한지를 확인한다
즉, 문제의 제약 조건을 위반하지 않는 지를 검사한다
3. 해 검사
새로운 부분 해 집합이 문제의 해가 되는지를 확인한다
아직 전체 문제의 해가 완성되지 않았다면 1의 해 선택부터 다시 시작한다
최적해를 반드시 구한다는 보장이 없다!
ex1) 배낭 짐싸기 (Knapsack) 문제
도둑은 부자들의 물건을 훔치기 위해 창고에 침입하였다.
도둑은 훔친 물건을 배낭에 담아 올 계획이다. 배낭은 담을수 있는 물건의 총 무게(W)가 정해져 있다.
창고에는 어러 개(n개)의 물건들이 있고 각가그이 물건에는 무게와 값이 정해져 있다.
경비원에게 발각되기 전에 배낭이 수용할 수 있는 무게를 초과하지 않으면서, 값이 최대가 되는 물건들을 담아야 한다.
예)
0-1 Knapsack에 대한 완전 검색 방법
완전 검색으로 물건들의 집합 S에 대한 모든 부분집합을 구한다.
부분집합의 총 무게가 W를 초과하는 집합들은 버리고, 나머지 집합에서 총 값이 가장 큰 집합을 선택할 수 있다
물건의 개수가 증가하면 시간 복잡도가 지수적으로 증가한다
크기 n인 부분합의 수 2^n
ex2) 회의실 배정하기 문제
Greedy Algorithm의 필수 요소
1. 탐욕적 선택 속성 (greedy choice property)
탐욕적 선택은 최적해로 갈 수 있음을 보여라
즉, 탐욕적 선택은 항상 안전하다
2. 최적 부분 구조 (optimal substructure property)
최적화 문제를 정형화하라
하나의 선택을 하면 풀어야 할 하나의 하위 문제가 남는다
3. 원문제의 최적해 == 탐욕적 선택 + 하위 문제의 최적해
임을 증명하라
원문제의 최적해 == 탐욕적 선택 + 하위 문제의 최적해
임을 증명하라
Greedy Algorithm vs Dynamic Programming
Last updated