Algorithm.Greedy Algorithm
[Visual Studio과 C#으로 구현/최적화문제해결]
Algorithm Greedy Algorithm Coding // Week06
20211014_20615034
[ Greedy Algorithm Coding_Theory ]
Greedy Algorithm은 최적화 문제를 해결하는 알고리즘이다.
• 최적화 (optimization) 문제
- 가능한 해들 중에서 가장 좋은 (최대 또는 최소) 해를 찾는 문제
• 욕심쟁이 방법, 탐욕적 방법, 탐욕 알고리즘 등으로 불림
• 그리디 알고리즘은 (입력) 데이터 간의 관계를 고려하지 않고 수행 과정에서 ‘욕심내어’ 최소값 또는 최대값을 가진 데이터를 선택
- 이러한 선택을 ‘근시안적’인 선택이라고 말하기도 함
• 그리디 알고리즘은 일단 한 번 선택하면, 이를 절대로 번복하지 않는다.
- 즉, 선택한 데이터를 버리고 다른 것을 취하지 않는다.
• 이러한 특성 때문에 대부분의 그리디 알고리즘들은 매우 단순하며, 또한 제한적인 문제들만이 그리디 알고리즘으로 해결된다.
- 가능한 해들 중에서 가장 좋은 (최대 또는 최소) 해를 찾는 문제
• 욕심쟁이 방법, 탐욕적 방법, 탐욕 알고리즘 등으로 불림
• 그리디 알고리즘은 (입력) 데이터 간의 관계를 고려하지 않고 수행 과정에서 ‘욕심내어’ 최소값 또는 최대값을 가진 데이터를 선택
- 이러한 선택을 ‘근시안적’인 선택이라고 말하기도 함
• 그리디 알고리즘은 일단 한 번 선택하면, 이를 절대로 번복하지 않는다.
- 즉, 선택한 데이터를 버리고 다른 것을 취하지 않는다.
• 이러한 특성 때문에 대부분의 그리디 알고리즘들은 매우 단순하며, 또한 제한적인 문제들만이 그리디 알고리즘으로 해결된다.
[ 동전 거스름돈 문제 (CoinChange 알고리즘) ]
동전 거스름돈 (Coin Change) 문제를 해결하는 가장 간단하고 효율적인 방법
• 남은 액수를 초과하지 않는 조건하에 ‘욕심내어’ 가장 큰 액면의 동전을 취하는 것
• 동전 거스름돈 문제의 최소 동전 수를 찾는 그리디 알고리즘
- 단, 동전의 액면은 500원, 100원, 50원, 10원, 1원
- CoinChange
입력 : 거스름돈 액수 W
출력 : 거스름돈 액수에 대한 최소 동전 수
예) 동전 거스름돈의 예
• 760원일 경우
- 500 + 2*100 + 50 + 10
• 만일 160원짜리 동전이 있을 때, 거스름돈이 200원이라면?
- 160 + 4*10 >> 5개의 동전
- 2*100 >> 2개의 동전
• CoinChange 알고리즘은 항상 최적의 답을 주지 못함
- 따라서 실제로는 거스름돈에 대한 그리디 알고리즘이 적용되도록 동전이 발행됨
• 760원일 경우
- 500 + 2*100 + 50 + 10
• 만일 160원짜리 동전이 있을 때, 거스름돈이 200원이라면?
- 160 + 4*10 >> 5개의 동전
- 2*100 >> 2개의 동전
• CoinChange 알고리즘은 항상 최적의 답을 주지 못함
- 따라서 실제로는 거스름돈에 대한 그리디 알고리즘이 적용되도록 동전이 발행됨
[ 최소 신장 트리 (Minimum Spanning Tree) ]
주어진 가중치 그래프에서 사이클이 없이 모든 점들을 연결시 킨 트리들 중 선분들의 가중치 합이 최소인 트리
• (c)는 가중치의 합이 (b)보다 크고, (d)는 트리가 주어진 그래프의 모든 노드를 포함하고 있지 않다
주어진 그래프의 신장 트리를 찾는 방법
: 사이클이 없도록 모든 점을 연결시킨다.
그래프의 점의 수가 n
- 신장 트리에는 정확히 (n-1)개의 선분이 있다.
- 트리에 선분을 하나 추가시키면, 반드시 사이클이 만들어진다.
- 크러스컬 (Kruskal) 알고리즘
가중치가 가장 작은 선분이 사이클을 만들지 않을 때에만 ‘욕심내어’ 그 선분을 추가시킨다.
- 프림 (Prim) 알고리즘
임의의 점 하나를 선택한 후, (n-1)개의 선분을 하나씩 추가시켜 트리를 만든다.
•알고리즘의 입력은 1개의 연결요소 (connected component)로 된 가중치 그래프
[ Kruskal’s MST ]
Kruskal 최소신장트리 알고리즘
KruskalMST(G)
입력 : 가중치 그래프 G=(V,E), |V|=n , |E|=m
출력 : 최소 신장 트리
1. a에서 시작한다면, a와 연결된 에지를 찾아서 그 중 가장 작은 값을 갖는 a-d를 선택 이제 a, d가 선택되었고, Dist[] 배열을 업데이트 한다.
2. 그 다음 작은 값인 a-b를 선택 이제 a, b, d가 선택되었고 Dist[] 배열을 업데이트 한다.
=> 1, 2 과정을 버텍스 갯수만큼 반복
댓글 없음:
댓글 쓰기