탐욕적인 방법 (Greedy Approach)
description
Transcript of 탐욕적인 방법 (Greedy Approach)
탐욕적인 알고리즘 ? Greedy algorithm
결정을 해야 할 때마다 미래에 대한 생각 없이 그 순간에 가장 최선의 선택을 하는 알고리즘
순간 선택은 그 당시 최적 (locally optimal) 이다 . 하지만 , 최종적으로 최적 (globally optimal) 이라는 보장은
없다 . 따라서 , 탐욕적인 알고리즘은 항상 최적의 해를 주는지
검증해야 한다 .
탐욕적인 알고리즘 설계 절차
1. 선정과정 (selection procedure) 현재 상태에서 가장 좋으리라고 생각되는 (greedy) 해답을
찾아서 해답모음 (solution set) 에 포함시킨다 .
2. 적정성점검 (feasibility check) 새로 얻은 해답모음이 적절한지를 결정한다 .
3. 해답점검 (solution check) 새로 얻은 해답모음이 최적의 해인지를 결정한다 .
거스름돈 문제
문제 : 동전의 개수가 최소가 되도록 거스름 돈을 주자 . 탐욕적인 알고리즘
거스름돈을 x 라 하자 . 먼저 , 가치가 가장 높은 동전부터 x 가 초과되지 않도록 계속
내준다 . 이 과정을 가치가 높은 동전부터 내림순으로 총액이 정확히 x
가 될 때까지 계속한다 .
최적일까 ? 미국 ? 우리나라 ?
그래프 용어 복습 비방향성 그래프 (undirected graph)
G = (V,E) V 는 정점 (vertex) 의 집합 E 는 이음선 (edge) 의 집합
경로 (path) 연결된 그래프 (connected graph)
어떠한 두 정점 사이에도 경로가 존재 부분그래프 (subgraph) 가중치 포함 그래프 (weighted graph) 순환경로 (cycle) 순환적 그래프 (cyclic graph), 비순환적 그래프 (acyclic graph). 트리 (tree)
비순환적이며 , 비방향성 그래프 뿌리 있는 트리 (rooted tree)
한 정점이 뿌리로 지정된 트리
신장트리 (Spanning Tree) 연결된 , 비방향성 그래프 G 에서 순환경로를 제거하면서
연결된 부분그래프가 되도록 이음선을 제거하면 신장 트리(spanning tree) 가 된다 .
따라서 신장 트리는 G 안에 있는 모든 정점을 다 포함하면서 트리가 되는 연결된 부분그래프이다 .
최소비용 신장 트리 (Minimum Spanning Tree) 신장 트리가 되는 G 의 부분그래프 중에서 가중치가
최소가 되는 부분그래프를 최소비용 신장 트리 (minimum spanning tree) 라고 한다 .
최소의 가중치를 가진 부분그래프는 반드시 트리가 되어야 한다 . 왜냐하면 , 만약 트리가 아니라면 , 분명히 순환경로(cycle) 가 있을 것이고 , 그렇게 되면 순환경로 상의 한 이음선을 제거하면 더 작은 비용의 신장 트리가 되기 때문이다 .
최소비용 신장 트리를 구하는 무작정 알고리즘의 시간복잡도는 지수시간 이상이다 .
최소비용 신장 트리 (MST) 의 예
도로 건설 도시들을 모두 연결하면서 도로의 길이가 최소가 되도록 하는
문제
통신 (telecommunications) 전화선의 길이가 최소가 되도록 전화 케이블 망을 구성하는
문제
배관 (plumbing) 파이프의 총 길이가 최소가 되도록 연결하는 문제
탐욕적 알고리즘 : 최소비용 신장 트리
추상적 기술 F = ∅ 사례가 해결될 때까지 다음을 반복
지역적으로 최적인 간선을 선택한다 . ( 선정절차 ) 선택한 간선이 순환경로를 만드는지 검사한다 . ( 적정성 검
사 ) 만들지 않으면 F 에 추가한다 .
T = (V, F) 가 신장 트리 인지 검사한다 . ( 해답 검사 )
Prim 의 알고리즘 ( 추상적 기술 ) F = ∅ Y = {v1} 사례가 해결될 때까지 다음을 반복
V-Y 에서 가장 Y 와 가까운 정점을 선택한다 . ( 선정절차 + 적정성 검사 )
선택한 정점을 Y 에 추가하고 , 해당 간선을 F 에 추가한다 . Y = V 이면 종료한다 . ( 해답 검사 )
Prim 의 알고리즘 ( 세부적 기술 ) Prim 알고리즘의 자료구조
인접행렬 W[i][j]: Floyd 의 최단경로 알고리즘에서 사용한 행렬과 같은 행렬 (n × n 행렬 )
nearest[i]: Y 에 속한 정점 중 vi 와 가장 가까운 정점의 색인 distance[i]: vi 와 nearest[i] 를 잇는 간선의 가중치
Prim 의 알고리즘 분석
모든 경우 시간 복잡도 분석 단위 연산 : 비교 연산 입력크기 : n 분석
for(j=1; j<=n-1; j++) 문 : (n-1) 번 반복 2 개의 for(i=2; i<=n; i++) 문 : 각 (n-1) 번 반복
최적 여부의 검증 (Optimality Proof) 정의 : 비방향 그래프 G = (V, E) 가 주어졌을 때 , E 의 부분집합
F 에 MST 가 되도록 간선을 추가할 수 있으면 F 는 유망하다(promising) 고 한다 .
보조정리 : G = (V, E) 가 연결된 가중치 비방향 그래프이고 , F 가 E 의 유망한 부분집합이며 , Y 는 F 에 의해 연결되는 정점들의 집합이라 하자 . Y 와 V-Y 를 연결하는 간선 중 가중치가 최소인 간선이 e 라고 하면 , F∪{e} 는 유망한 부분집합이다 .
증명 : F 가 유망한 집합이므로 F ⊆ F' 이고 (V, F') 이 G 의 MST인 F' 이 존재한다 . 이 때 e ∈ F' 이면 F∪{e} ⊆ F' 이다 . 이것이 성립하지 않는다고 하자 . (V, F') 은 MST 이므로 e 가 F' 에 포함되지 않으면 F'∪{e} 는 순환 경로를 가지게 된다 . 따라서 Y와 V-Y 를 연결하는 또 다른 간선 e' 이 F' 에 있어야 한다 . 그러므로 F'∪{e} 에서 e' 을 제거하면 ST 가 된다 . e 의 가중치는 e' 보다는 같거나 작기 때문에 F'∪{e}-e' 은 MST 이다 . 그런데 F∪{e} ⊆ F'∪{e}-e' 이다 . 즉 , F∪{e} 는 유망하다 .
최적 여부의 검증 (Optimality Proof) 정리 : Prim 의 알고리즘은 항상 최소비용 신장 트리를
만들어 낸다 . 증명 : ( 수학적귀납법 ) 매번 반복이 수행된 후에 집합 F 가
유망하다는 것을 보이면 된다 . 출발점 : 공집합은 당연히 유망하다 . 귀납가정 : 어떤 주어진 반복이 이루어진 후 , 그때까지
선정하였던 이음선의 집합인 F 가 유망하다고 가정한다 귀납절차 : 집합 F {∪ e} 가 유망하다는 것을 보이면 된다 .
여기서 e 는 다음 단계의 반복 수행 시 선정된 이음선 이다 . 그런데 , 위의 보조정리에 의하여 F {∪ e} 은 유망하다고 할 수 있다 . 왜냐하면 이음선 e 는 Y 에 있는 어떤 정점을 V - Y에 있는 어떤 정점으로 잇는 이음선 중에서 최소의 가중치를 가지고 있기 때문이다 . Q.E.D.
Kruskal 의 알고리즘
아이디어 단계 1. 각 정점 하나만을 포함하는 n 개의 집합을 만든다 . 단계 2. 모든 간선을 가중치 값을 기준으로 오름차순으로
정렬한다 . 단계 3. 가중치가 가장 작은 것부터 검사하여 간선이 서로소
(disjoint) 인 두 집합을 연결하면 그 간선을 F 에 추가하고 , 연결된 두 집합을 하나의 집합으로 결합한다 .
단계 4. F 가 MST 가 될 때까지 단계 3 을 반복한다 .
Kruskal 의 알고리즘 분석
단위연산 : 비교 입력크기 : 정점의 수 n, 간선의 수 m
간선 정렬 시간 : Θ(mlgm) while 루프 : Θ(mlgm) V[i] 집합 초기화 시간 : Θ(n)
n < m, W(m,n) = Θ(mlgm) m 이 최악의 경우일 때 ,
최적 여부의 검증 (Optimality Proof) 과제
단일 출발점 최단경로 문제
Floyd 의 최단경로 알고리즘 모든 정점간의 최단 경로 시간복잡도 ?
Dijkstra 알고리즘 단일 출발점 최단 경로 (Single-source shortest path) Prim 의 MST 알고리즘과 유사 자료구조
W[i][j] touch[i]: Y 에 있는 정점들만을 이용하여 v1 에서 vi 로 가는
현재 최단경로 상의 마지막 간선 (v, vi) 라고 할 때 , Y 에 있는 정점 v 의 색인
length[i]: Y 에 있는 정점들만을 이용하여 v1 에서 vi 로 가는 현재 최단경로의 길이
기말 프로젝트
12/3 까지 그래프 알고리즘 구현
Floyd, Prim, Kruskal, Dijkstra, TSP 중 택 1 이 외의 주제를 하고자 할 경우 , 미리 상담 언어 사용 자유
발표 (5 분 ) 발표 슬라이드 + 프로그램 데모 적절한 사례를 선택
스케줄링
시스템 내부 시간 (time in the system) 서비스를 받기 위해 대기하는 시간 + 서비스를 받는 시간
스케줄링 문제 : 모든 사용자의 전체 시스템 내부 시간이 최소화되도록 일정을 구성하는 문제
마감시간이 있는 스케줄링 문제 서비스를 받는 시간은 작업마다 항상 같지만 각 작업마다
마감시간 ( 서비스가 반드시 시작되어야 하는 시간 ) 이 다르며 , 발생되는 이윤이 다른 경우
3 개의 작업에 소요되는 시간 5, 10, 4 [1, 2, 3]: 5+(5+10)+(5+10+4) = 39, [1, 3, 2]: 33 [2, 1, 3]: 10+(10+5)+(10+5+4) = 44, [2, 3, 1]: 43 [3, 1, 2]: 4+(4+5)+(4+5+10) = 32, [3, 2, 1]: 37
스케줄링 : 탐욕적인 알고리즘 증명
( 정리 ) 시스템 내부 시간의 총 시간이 최소가 되도록 하는 유일한 스케줄은 작업의 서비스 시간에 따라 오름차순으로 구성한 스케줄이다 .
( 증명 ) 최적의 스케줄 T 에서 ti 가 i 번째로 스케줄 된 작업의 서비스 시간이라 하자 . 이 최적의 스케줄이 서비스 시간에 따라 오름차순으로 구성되어 있지 않다고 하면 ti>ti+1 인 부분스케줄이 존재한다 . T 에서 이 두 작업의 순서만을 바꾼 스케줄을 T' 이라 하면 다음이 성립한다 .
T' = T+ti+1-ti
그런데 ti>ti+1 이므로 T'<T 이다 . 따라서 오름차순으로 구성하지 않은 스케줄은 최적의 스케줄이 될 수 없다 .
마감시간이 있는 스케줄
무작정 알고리즘의 시간복잡도 ? 이익이 가장 큰 것은 최적 스케줄에 포함되었지만 두
번째는 포함되지 않았다 . 그 이유는 작업 4 와 작업 2 의 마감시간이 같아 둘 중 하나만 포함할 수 있기 때문이다 .
마감시간이 있는 스케줄링 알고리즘
1. 이익을 기준으로 오름차순으로 작업을 정렬한다 .
2. 정렬된 순서로 작업을 선택한다 .
3. 선택한 작업이 적정성을 검사한다 . 가능한 스케줄이면 스케줄에 포함한다 .
4. 고려할 작업이 남아 있으면 단계 2 부터 다시 반복한다 .
허프만 코드 (Huffman Code) a, b, c 를 코드화 할 수 있는 방법 ?
( 고정 2 비트 코드 ) a:00 b:01 c:11 ( 길이가 변하는 코드 ) a:10 b:0 c:11
Ex) ababcbbbc 000100011101010111 1001001100011
탐욕적 방법 Vs. 동적 프로그래밍
최적화 문제를 위해 사용할 수 있는 기법
보통 탐욕적 방법이 보다 효율적
탐욕적 방법은 알고리즘의 결과가 최적인지 증명
동적 프로그래밍은 최적화 문제가 최적의 원칙에 적용되는지 검사
0-1 배낭 채우기 문제
0-1 Knapsack problem S = {item1, item2, …, itemn} wi: itemi 의 무게 pi: itemi 의 가치 W: 배낭이 수용할 수 있는 총 무게 A: S 의 부분집합으로 선택된 item 들의 집합 목표 : 를 만족하면서 가 최대가
되도록 A⊆S 를 만든다 . 0-1? itemi 는 A 에 포함되거나 포함되지 않는다 .
무작정 알고리즘 S 의 가능한 모든 부분집합을 고려한다 . 시간 복잡도 ?
동적 프로그래밍 알고리즘
P[0..n][0..W] P[0][w] = 0, P[i][0] = 0
총 계산하는 항 수 :nW 시간 복잡도 : Θ(nW) W = n! ?
개선방향 아이디어 : P[i][W] 를 계산하기 위해서 (i-1) 번째 행을 모두
계산할 필요가 없다 .
wwwiPwwwwiPpwiP
wiPi
iii
]][1[ ])][1[],][1[max(
]][[
예 ) P[3][30]
P[2][30], P[2][10] P[2][30]
P[1][30], P[1][20] P[2][10]
P[1][10], P[1][0] P[1][0] = 0, P[1][10] = 50, P[1][30] = 50, P[1][20] = 50 P[2][10] = max(50,60+0) = 60 P[2][30] = max(50, 60+50) = 110 P[3][30] = max(110, 140+60) = 200 줄어든 항 수 : 3x30=90 에서 7 로
wwwiPwwwwiPpwiP
wiPi
iii
]][1[ ])][1[],][1[max(
]][[