- Baekjoon
- Artificial_Intelligence
- Android
- c++
- 자격증
- datastructure
- Univ._Study
- Operating_System
- Kubernetes
- 오블완
- Personal_Study
- 2023_1st_Semester
- Linux
- Database_Design
- Python
- study
- SingleProject
- 리눅스마스터2급
- pytorch
- tensorflow
- Algorithm
- 티스토리챌린지
- programmers
- codingTest
- Image_classification
- Java
- Unix_System
- cloud_computing
- C
- app
코딩 기록 저장소
[알고리즘] 그리디 알고리즘 본문
1. 전형적인 그리디 알고리즘의 구조
- 눈앞의 이익만 우선 추구하는 알고리즘을 총칭해서 그리디 알고리즘이라 함.
- 대부분의 경우 뛰어난 결과를 도출하지 못하지만 드물게 최적해를 보장하는 경우도 있음.
- 그리디 알고리즘은 최적화 문제를 대상으로 함.
- 최적해를 찾을 수 있으면 그것을 목표로 삼고, 찾기 어려운 경우에는 주어진 시간 내에 그런대로 괜찮은 해를 찾는 것을 목표로 삼음.
do {
가장 좋아 보이는 선택을 함;
} until ( 해 구성 완료 )
- 그리디 알고리즘은 하나의 온전한 해가 만들어질 때까지 눈앞에 가장 좋아보이는 선택을 반복함.
- 간선이 하나도 없는 집합에서 시작해서 간선을 하나씩 더해가면서 n-1개의 간선이 될 때까지 집합을 키워나감.
- 각 단계에서 어떤 간선을 택할지 결정하는 로직이 있어야 함.
- 이 로직이 눈앞의 이익만 추구하면 그리디 알고리즘 계열에 속하게 됨.
- 간선을 하나 더할 때마다 해당 간선이 기존에 선택된 간선들과 사이클을 이루지는 않는지 확인해야 함.
Greedy(C) // 원소들의 총 집합
{
S <- Ø;
while (C ≠ Ø and S는 아직 온전한 해가 아님) {
①x <- C에서 원소 하나 선택;
집합 C에서 x를 제거함;
②if (S에 x를 더해도 됨 ) then S <- S∪{x};
}
if ( S가 온전한 해 ) then return S;
else return "해X";
}
- ①에서 원소를 선택하는 기준이 눈앞의 이익을 우선하면 그리디 알고리즘 계열.
2. 그리디 알고리즘으로 최적해가 보장되지 않는 예
이진 트리의 최적합 경로 찾기
- 모든 노드를 보기 전에는 최적해를 보장할 수 없음.
- 그러므로 루트로부터 DFS와 같은 백트래킹 탐색을 할 수밖에 없고, 수행 시간의 상한은 트리의 총 노드 수에 비례하게 됨.
- DFS나 BFS와 같은 방식으로 모든 노드를 다 확인해보기 전에는 최적해를 보장할 수 없음.
보따리 문제
- 부피가 M인 보따리와 이 보따리에 넣으려 하는 n개의 물건이 있음.
- 물건 i의 부피는 W이고, 이것을 보따리에 넣을 경우 p의 가치가 있음.
- 물건들의 전체 부피 합이 M을 넘지 않도록 하면서 가치가 최대가 되도록 함.
- 보따리 문제에서 물건을 자를 수 있다면 이 같은 방식으로 최적해를 보장할 수 있음. ( 이 유형의 문제를 자를 수 있는 보따리 문제라 함 )
동전 바꾸기
- 최소한의 동전으로 금액을 맞추는 문제.
- 가지고 있는 동전 종류에서 큰 단위가 작은 단위의 배수 형태라면 그리디 알고리즘으로 문제가 해결됨.
- 하지만 배수가 아니라면 최적해가 보장되지 않음.
3. 그리디 알고리즘으로 최적해가 보장되는 예
최소 신장 트리
- 최소 신장 트리를 위한 프림 알고리즘, 크루스칼 알고리즘은 그리디 알고리즘으로 최적해가 보장됨.
- 어떤 시점이든지 그 시전에서 가장 적은 값을 가지고 연결되는 정점을 택하게 됨.
회의실 배정 문제
- 종료 시간이 빠른 순서로 정렬 후 회의들을 포함시킬지 체크함.
- 회의 시간이 짧은 것을 우선적으로 고려하거나, 시작시간이 빠른 회의부터 고려한다면 최적해를 보장할 수 없음.
4. 매트로이드 : 그리디 알고리즘으로 최적해가 보장되는 공간 구조
매트로이드
- 독립성이라는 성질을 만족하는 수학적 공간.
- 어떤 문제의 공간이 매트로이드를 이루면 그리디 알고리즘이 존재함.
어떤 유한 집합 S의 부분 집합들의 집합인 I (즉, I ⊆ 2^s)가 다음의 성질을 만족하면 매트로이드라 함.
① A ∈ I이고 B ⊆ A이면 B ∈ I임.
② A,B ∈ I 이고 |A| < |B| 이면, A ∪ {x} ∈ I인 x ∈ B-A가 존재함.
- ① 집합 A가 I에 속하면 A의 모든 부분 집합들 또한 I에 속함.
- ② 크기가 다른 두 집합 A, B(|A| < |B|)가 I에 속하면, B의 원소이면서 A의 원소가 아닌 것 중에 A에 더해서 I에 속하게 하는 원소가 존재함.
매트로이드의 확장과 포화
매트로이드 I ⊆ 2^s와 A∈I에서 A에 속하지 않는 어떤 원소 x ∈ S에 대하여 A ∪ {x} ∈ I이면 x가 A를 확장한다고 함. A가 더 이상 확장되지 않으면 A를 포화 집합이라 함.
매트로이드 구조이면 그리디 알고리즘으로 최적해 보장
- 매트로이드 I의 원집합 S의 원소들이 가중치를 가지면 이를 가중치 매트로이드라 함.
- 매트로이드에서 가중치 최적화 문제는 항상 최적해를 찾을 수 있음.
- 그리디 알고리즘으로 풀려는 문제가 매트로이드 구조를 가니면 최적해를 보장하게 됨.
Greedy(I,w[])
{
A = Ø;
S의 원소들을 w의 가중치 크기로 내림차순 정렬함;
for each x ∈ S (가중치 내림차 순)
if ( A ∪ {x} ∈ I ) then A <- A ∪ {x};
return A;
}
'개인 공부 > 알고리즘' 카테고리의 다른 글
[알고리즘] NP - 완비 (1) | 2023.03.07 |
---|---|
[알고리즘] 문자열 매칭 (0) | 2023.03.04 |
[알고리즘] 그래프 (0) | 2023.02.22 |
[알고리즘] 동적 프로그래밍 (0) | 2023.02.18 |
[알고리즘] 집합의 처리 (0) | 2023.02.17 |