06. dynamic programming - kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg ›...

24
1 알고리즘 알고리즘(Algorithm) (Algorithm) 알고리즘 알고리즘(Algorithm) (Algorithm) Dynamic Programming Dynamic Programming (동적 동적 프로그래밍 프로그래밍) 2010 2010년 봄학 봄학기 강원대학교 강원대학교 컴퓨터과학전공 컴퓨터과학전공 문양세 문양세 Dynamic Programming Dynamic Programming 개요 개요 (1/2) (1/2) Divide & Conquer 기법은 하향식 접근법(top-down approach)으로, 나누어진 부분들 사이에 서로 상관관계가 없는 문제를 해결하는데 적합하다. Dynamic Programming 피보나찌 알고리즘 경우 나누어진 부분들이 서로 연관이 있다. f(5)를 계산하기 위해 f(2)를 세 번 사용? , 분할정복식 방법을 적용하여 알고리즘을 설계하게 되면 같은 항을 한 번 이상 계산하는 결과를 초래하게 되므로 효율적 이지 않다 Computer Algorithms by Yang-Sae Moon Page 2 이상 계산하는 결과를 초래하게 되므로 효율적 이지 않다. 따라서, 이 경우에는 Divide & Conquer 기법은 적합하지 않다.

Upload: others

Post on 24-Jun-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

1

알고리즘알고리즘(Algorithm) (Algorithm) 알고리즘알고리즘(Algorithm) (Algorithm) Dynamic Programming Dynamic Programming

((동적동적 프로그래밍프로그래밍))

20102010년년 봄학봄학기기

강원대학교강원대학교 컴퓨터과학전공컴퓨터과학전공 문양세문양세

Dynamic Programming Dynamic Programming 개요개요 (1/2)(1/2)

Divide & Conquer 기법은

하향식 접근법(top-down approach)으로, 나누어진 부분들 사이에

서로상관관계가 없는 문제를 해결하는데 적합하다.

Dynamic Programming

피보나찌 알고리즘 경우

• 나누어진부분들이 서로 연관이있다. f(5)를 계산하기위해 f(2)를세 번사용?

• 즉, 분할정복식방법을 적용하여 알고리즘을설계하게 되면같은 항을한 번

이상계산하는 결과를 초래하게되므로 효율적이지 않다

Computer Algorithmsby Yang-Sae MoonPage 2

이상계산하는 결과를 초래하게되므로 효율적이지 않다.

• 따라서, 이경우에는 Divide & Conquer 기법은적합하지 않다.

Page 2: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

2

Dynamic Programming Dynamic Programming 개요개요 (2/2)(2/2)

Dynamic programming 기법은

상향식 해결법(bottom-up approach)을 사용하여 알고리즘을 설계

하는방법이다.

Dynamic Programming

• 이방법은 Divide & Conquer 기법과마찬가지로 문제를나눈 후에나누어진 부

분들을먼저 푼다.

• 그러나이미 풀어서 답을알고 있는부분의 결과가다시 필요한경우에는 반복하

여계산하는 대신에 이미계산된 결과를그냥 사용한다.

즉, Divide & Conquer는 위에서 시작하여 필요한 계산을 해 나가는

Computer Algorithmsby Yang-Sae MoonPage 3

q반면에, Dynamic programming은 밑에서 시작하여 결과를 저장하

면서원하는 답을 찾아 나간다.

강의강의 순서순서

이항 계수 (Binomial Coefficient)

최단 경로 문제 (Shortest Path Problem)

Dynamic Programming

최단 경로 문제 (Shortest Path Problem)

최적의 원칙 (The Principle of Optimality)

연쇄행렬곱셈 (Matrix-Chain Multiplication)

Computer Algorithmsby Yang-Sae MoonPage 4

Page 3: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

3

이항계수이항계수(Binomial Coefficient) (Binomial Coefficient) –– 정의정의

이항계수 구하는 공식

Dynamic Programming

!for 0

!( )!

n nk n

k k n k

• The binomial coefficient is the number of ways of picking k unordered outcomes from n possibilities, also known as a combination nCk.

계산량이 많은 n!이나 k!을 계산하지 않고 이항계수를 구하기 위해

서통상 다음 수식을 사용한다.

!( )!k n k nk

Computer Algorithmsby Yang-Sae MoonPage 5

서통상 다음 수식을 사용한다.

1 1if 0

1

1 if 0or

n nn k n

k kk

k k n

1 1 ( 1)! ( 1)!1 ( 1)!( )! !( 1)!

( 1)! ( )( 1)!!( )!

( 1)! ! ( 1)! !!( )! !( )!

n n n nk k k n k k n k

k n n k nk n k

k n n k n nk n k k n k

이항계수이항계수 –– Divide & Conquer Divide & Conquer 알고리즘알고리즘

문제: 이항계수를 계산한다.

입력: 음수가 아닌 정수 n과 k, 여기서 k n

출력 이항계수 결과 값

Dynamic Programming

n 출력: 이항계수 결과 값

알고리즘:

int bin(int n, int k){

if (k == 0 || n == k)

nk

1 1if 0

1

1 if 0or

n nn k n

k kk

k k n

Computer Algorithmsby Yang-Sae MoonPage 6

return 1;else

return (bin(n-1,k-1) + bin(n-1,k));}

Page 4: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

4

분할정복 알고리즘은 작성하기는 간단하지만, 효율적이지 않다.

Why? 알고리즘을 재귀 호출(recursive call)할 때 동일한(identical) 계산을 반복해서 수행하기 때문이다.

Dynamic Programming이항계수이항계수 –– Divide & Conquer Divide & Conquer 시간복잡도시간복잡도 (1/3)(1/3)

계산을 반복해서 수행하기 때문이다.

예를들면, bin(n-1,k-1)과 bin(n-1,k)는 둘 다 bin(n-2,k-1)의 결과가

필요한데, 따로 중복하여 계산된다.

을 구하기 위해서, Divide & Conquer 알고리즘이 계산하는 항

(term)의개수는 다음과 같다. (다음 페이지 증명)

nk

Computer Algorithmsby Yang-Sae MoonPage 7

이는 factorial 복잡도로서, 실제 알고리즘으로 사용할 수 없다.

2 1nk

증명: (n에 대한 수학적귀납법으로 증명)

Induction Basis: 항의 개수 n이 1일 때, 이 됨을

보이면 된다 는 k = 0이나 1 일 때 1이므로 항의 개수는 항상

Dynamic Programming이항계수이항계수 –– Divide & Conquer Divide & Conquer 시간복잡도시간복잡도 (2/3)(2/3)

2 1 2 1 1 1nk

1

보이면 된다. 는 k = 0이나 1 일 때, 1이므로 항의 개수는 항상

1이다.

Induction Hypothesis: 을 계산하기 위한 항의 개수는

이라가정한다.

Induction Step: 을 계산하기 위한 항의 개수가 임을

k

nk

2 1nk

1nk

12 1

nk

Computer Algorithmsby Yang-Sae MoonPage 8

보이면 된다.

• 알고리즘에의해서 이므로, 를계산하기위한 항의총

개수는 을계산하기 위한 총개수와 를계산하기 위한항의 총개수에,

이둘을 더하기위한 항 하나를더한 수가된다.

k k

11

n n nk k k

1nk

1n

k

nk

Page 5: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

5

(증명 계속)

• 그런데, 을계산하기 위한항의 개수는가정에 의해서 이고,

를계산하기 위한 항의개수는 가정에의해서 이다.

Dynamic Programming이항계수이항계수 –– Divide & Conquer Divide & Conquer 시간복잡도시간복잡도 (3/3)(3/3)

1n

k

nk

2 11

nk

2 1nk

• 따라서항의 총개수는 다음과 같이 로계산된다.

k

! !( 1 ) ! ( 1 ) ! ! ( ) !

! ( 1 )! ( 1 ) !

2 1 2 1 11

2 1

2 1

n nk n k k n k

n k n kk n k

n nk k

12 1

nk

Computer Algorithmsby Yang-Sae MoonPage 9

! ( 1 )! ( 1 ) !

( 1 ) !! ( 1 ) !

2 1

2 1

12 1

n nk n k

nk n k

nk

이항계수이항계수 –– Dynamic Programming Dynamic Programming 설계설계 (1/2)(1/2)

재귀관계식(recursive property)을정립

• 2차원배열 B를 만들고, 각 B[i][j]에는 값을 저장하도록 한다.

• 그러면 그 값은 다음과 같은 관계식으로 계산할 수 있다

Dynamic Programming

ij

• 그러면, 그 값은 다음과 같은 관계식으로 계산할 수 있다.

[ 1][ 1] [ 1][ ] if 0[ ][ ]

1 if 0orB i j B i j j i

B i jj j i

1 1if 0

1n n

n k nk k

Computer Algorithmsby Yang-Sae MoonPage 10

1

1 if 0or

k kk

k k n

Page 6: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

6

이항계수이항계수 –– Dynamic Programming Dynamic Programming 설계설계 (2/2)(2/2)

상향식접근법을적용

• 를 구하기 위해서, 다음과 같이 B[0][0]부터 시작하여 위에서

아래로 재귀 관계식을 적용하여 배열을 채워 나가면 된다.

Dynamic Programming

nk 아래로 재귀 관계식을 적용하여 배열을 채워 나가면 된다.

• 결국, 구하려는 값은 B[n][k]에 저장된다.

i j이므로 대각선 포함

아래쪽만 값을 구하면 된다

Computer Algorithmsby Yang-Sae MoonPage 11

아래쪽만 값을 구하면 된다.

이항계수이항계수 –– Dynamic Programming Dynamic Programming 알고리즘알고리즘

문제: 이항계수를 계산한다.

입력: 음수가 아닌 정수 n과 k, 여기서 k n

출력 이항계수 결과 값

Dynamic Programming

n 출력: 이항계수 결과 값

알고리즘:

int bin2(int n, int k){

index i, j;

int B[0..n][0..k];

f (i 0 i < i++)

nk

i

j

Computer Algorithmsby Yang-Sae MoonPage 12

for(i=0; i <= n; i++)

for(j=0; j <= minimum(i,k); j++)

if (j==0 || j==i) B[i][j] = 1;

else B[i][j] = B[i-1][j-1] + B[i-1][j];

return B[n][k];

}

Page 7: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

7

이항계수이항계수 –– Dynamic Programming Dynamic Programming 시간복잡도시간복잡도

단위연산: for-j 루프 안의 문장

입력의 크기: n, k• i = 0일 때 j-루프수행 횟수 : 1• i = 1일 때 j 루프수행 횟수 : 2

Dynamic Programming

• i = 1일 때 j-루프수행 횟수 : 2• i = 2일 때 j-루프수행 횟수 : 3• ………………..• i = k-1일때 j-루프수행 횟수 : k• i = k일때 j-루프수행 횟수 : k + 1• i = k+1일때 j-루프수행횟수 : k + 1• ………………..• i n일 때 j 루프수행횟수 k + 1

Computer Algorithmsby Yang-Sae MoonPage 13

• i = n일 때 j-루프수행횟수 : k + 1

따라서, 총 횟수는 다음과 같이 계산된다.1times

( 1)1 2 3 ( 1) ( 1) ( 1)( 1)

2(2 2)( 1)

( )2

n kk k

k k k n k k

n k knk

시간복잡도에 있어서 큰 차이를 보이며, DP가 D&C에 비해 훨씬 우

수한알고리즘임을 알 수 있다.

공간복잡도 측면에서는 언뜻 보기에 배열을 사용하는 DP가 D&C

Dynamic Programming이항계수이항계수 –– D&C vs. DPD&C vs. DP

공간복잡도 측면에서는 언뜻 보기에 배열을 사용하는 DP가 D&C

보다더 복잡한 것으로 보인다.

정말 그럴까?

DP의공간복잡도는 O(n2)이다. 이를 O(n)으로 낮출 수 있는가?

한 행의 계산이 끝나면, 그 이전에 계산한 값은 필요하지 않다.

Computer Algorithmsby Yang-Sae MoonPage 14

이 성질을 사용하면 가능하다. 알고리즘을 변경해 보세요.

Page 8: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

8

강의강의 순서순서

이항 계수 (Binomial Coefficient)

최단 경로 문제 (Shortest Path Problem)

Dynamic Programming

최단 경로 문제 (Shortest Path Problem)

최적의 원칙 (The Principle of Optimality)

연쇄행렬곱셈 (Matrix-Chain Multiplication)

Computer Algorithmsby Yang-Sae MoonPage 15

정점, 노드(vertex, node), 이음선, 에지(edge, arc)

방향그래프(directed graph)

가 치 가 치 함 래

Dynamic Programming그래프그래프 용어용어 (Shortest Path Problem (Shortest Path Problem 이전에이전에…)…)

가중치(weight), 가중치 (포함) 그래프(weighted graph)

경로(path): 노드와 노드를 잇는 일련의 노드들

• 단순경로(simple path): 같은 정점을두 번지나지 않음

순환(cycle): 한 정점에서 다시 그 정점으로 돌아오는 경로

순환그래프(cyclic graph) vs 비순환 그래프(acyclic graph)

Computer Algorithmsby Yang-Sae MoonPage 16

순환 래 ( y g p ) 비순환 래 ( y g p )

경로의 길이(length)• 가중치그래프: 경로상에 있는 가중치의합

• 일반그래프: 에지의 개수

Page 9: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

9

Dynamic Programming가중치가중치 포함포함 방향방향 그래프그래프 예제예제

v1 v2

1

v5

v1

v4

v2

v3

3

5

9

1 2

23

3

4

Computer Algorithmsby Yang-Sae MoonPage 17

4

보기 : 한 도시에서 다른 도시로 직항로가 없는 경우 가장 빨리 갈

수 있는 항로를 찾는 문제

문제: 가중치 포함 방향성 그래프에서 최단경로 찾기

Dynamic Programming최단경로최단경로 문제문제(Shortest Path Problem)(Shortest Path Problem)

문제: 가중치 포함, 방향성 그래프에서 최단경로 찾기

최단경로 찾기 문제는 최적화 문제에 속한다.

최적화 문제(optimization problem)란?

주어진 문제에 대하여 하나 이상의 많은 해답(candidate solutions)

이 존재할 때, 이 가운데에서 가장 최적인 해답(optimal solution)

Computer Algorithmsby Yang-Sae MoonPage 18

을 찾아야 하는 문제

최단경로 찾기 문제는 최적화 문제에 속한다.

Page 10: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

10

무작정 알고리즘(brute-force algorithm)

• 한 노드에서 다른 노드로의 모든 가능한 경로의 길이를 구한다.

그들 경로 중에서 최소길이를 찾는다

Dynamic Programming최단경로최단경로 찾기찾기 –– 무작정무작정 알고리즘알고리즘 (1/2)(1/2)

• 그들 경로 중에서 최소길이를 찾는다.

v5

v1 v2

3

5

1

9

1 23

Computer Algorithmsby Yang-Sae MoonPage 19

v4 v3

23

4

E.g.) v1 v3: (1) v1 v2 v3, (2) v1 v4 v3, (3) v1 v2 v4 v3

분석:

• 그래프가 n개의 노드를 가지고 있고, 모든 노드들 사이에 이음선이 존재한다고

가정하자.

Dynamic Programming최단경로최단경로 찾기찾기 –– 무작정무작정 알고리즘알고리즘 (2/2)(2/2)

• 그러면 한 노드 vi에서 어떤 정점 vj로 가는 경로들을 다 모아 보면, 그 경로들

중에서 나머지 모든 정점을 한번씩 은 꼭 거쳐서 가는 경로들도 포함되어 있는

데, 그 경로들의 수 만 우선 계산해 보자.

• vi에서 출발하여 처음 도착할 수 있는 정점의 가지 수는 n-2개(vj 제외)이고, 그

중 하나를 선택하면, 그 다음에 도착할 수 있는 정점의 가지 수는 n-3개 이고,

이렇게 계속 계산해 보면, 총 경로의 개수는 (n-2)(n-3)…1 = (n-2)!이 된다.

Computer Algorithmsby Yang-Sae MoonPage 20

이렇게 계속 계산해 보면, 총 경로의 개수는 (n 2)(n 3)…1 (n 2)!이 된다.

• 이 경로의 개수 만 보아도 지수보다 훨씬 크므로, 이 알고리즘은 절대적으로 비

효율적이다!

Page 11: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

11

그래프의 인접행렬(adjacent matrix)식 표현: W

Dynamic ProgrammingDP DP 기반기반 최단경로최단경로 –– 자료자료 구조구조 (1/2)(1/2)

[ ][ ]

i j

i j

v vW i j v v

가중치 에서 로 가는 이음선이있는 경우

에서 로 가는 이음선이없는 경우

그래프에서 최단경로 길이의 표현:

의 정점들만을 통해서 vi에서 vj로 가는최단경로의 길이

[ ][ ] 0

i jW i j v vi j

에서 로 가는 이음선이없는 경우

인경우

( ) , where 1kD k n ( )

1 2[ ][ ]: { , ,..., }kkD i j v v v

Computer Algorithmsby Yang-Sae MoonPage 21

보기:

• W: 그림 3.2에 있는 그래프의 인접행렬식 표현

• D: 각 정점들 사이의 최단 거리

Dynamic ProgrammingDP DP 기반기반 최단경로최단경로 –– 자료자료 구조구조 (2/2)(2/2)

[ ][ ] 1 2 3 4 51 0 1 1 52 9 0 3 23 0 44 2 0 35 3 0

W i j

[ ][ ] 1 2 3 4 51 0 1 3 1 42 8 0 3 2 53 10 11 0 4 74 6 7 2 0 35 3 4 6 4 0

D i j

Computer Algorithmsby Yang-Sae MoonPage 22

• 여기서, 0 k 5 일 때, D(k)[2][5]를 구해보자 p. 97의 예제 3.2

D(0)

= W이고, D(n)

= D임은 분명하다. 따라서 D를 구하기 위해서는

D(0)를 가지고 D

(n)을 구할 수 있는 방법을 고안해 내야 한다.

Page 12: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

12

1. D(k-1)

을 가지고 D(k)를 계산하는 재귀 관계식(recursive property)을 정립

Dynamic ProgrammingDP DP 기반기반 최단경로최단경로 –– 설계설계

( ) ( 1) ( 1) ( 1)[ ][ ] min( [ ][ ], [ ][ ] [ ][ ])k k k kD i j D i j D i k D k j

경우 1: {v1, v2,…, vk}의 정점들 만을 통해서 vi에서 vj로 가는 최단경로가vk를 거치지 않는 경우.보기: D(5)[1][3] = D(4)[1][3] = 3경우 2: {v1, v2,…, vk}의 정점들 만을 통해서 vi에서 vj로 가는 최단경로가vk를 거치는 경우.

1 2

경우 경우

Computer Algorithmsby Yang-Sae MoonPage 23

k를 거치는 경우

보기: D(2)[5][3] = D(1)[5][2] + D(1)[2][3] = 4 + 3 = 7보기: D(2)[5][4]

2. 상향식으로 k = 1부터 n까지 다음과 같이 상기 과정을 반복하여 해를 구한다.

D(0), D(1),……., D(n)

문제: 가중치 포함 그래프의 각 정점에서 다른 모든 정점까지의

최단거리를 계산하라.

입력: 가중치 포함 방향성 그래프 W 그래프에서의 정점의 수 n

Dynamic ProgrammingDP DP 기반기반 최단경로최단경로 –– Floyd Floyd 알고리즘알고리즘 1 (1/2)1 (1/2)

입력: 가중치 포함 방향성 그래프 W, 그래프에서의 정점의 수 n

출력: 최단거리의 길이가 포함된 배열 D

Computer Algorithmsby Yang-Sae MoonPage 24

Page 13: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

13

알고리즘

Dynamic ProgrammingDP DP 기반기반 최단경로최단경로 –– Floyd Floyd 알고리즘알고리즘 1 (2/2)1 (2/2)

void floyd(int n, const number W[][], number D[][]){

int i j k;

( ) ( 1) ( 1) ( 1)

1 2

[ ][ ] min( [ ][ ], [ ][ ] [ ][ ])k k k kD i j D i j D i k D k j 경우 경우

모든 경우를 고려한 분석

int i, j, k;D = W;for(k=1; k <= n; k++)

for(i=1; i <= n; i++)for(j=1; j <= n; j++)

D[i][j] = minimum(D[i][j], D[i][k]+D[k][j]);}

Computer Algorithmsby Yang-Sae MoonPage 25

모든 경우를 고려한 분석:

• 단위연산: for-j 루프안의 지정문

• 입력크기: 그래프에서의 정점의 수 n3 3( ) ( )T n n n n n n

문제: 가중치 포함 그래프의 각 정점에서 다른 모든 정점까지의 최

단거리를 계산하고, 각각의 최단경로를 구하라.

입력: 가중치 포함 방향성 그래프 W 그래프에서의 정점의 수 n

Dynamic ProgrammingDP DP 기반기반 최단경로최단경로 –– Floyd Floyd 알고리즘알고리즘 2 (1/4)2 (1/4)

입력: 가중치 포함 방향성 그래프 W, 그래프에서의 정점의 수 n

출력: 최단경로의 길이가 포함된 배열 D, 그리고 다음을 만족하는

배열 P

[ ][ ]P i j

vi에서 vj 까지 가는 최단경로의 중간에 놓여 있는 정점이 최소한

하나는 있는 경우 그 놓여 있는 정점 중에서 가장 큰 인덱스

최단경로의 중간에 놓여 있는 정점이 없는 경우 0

Computer Algorithmsby Yang-Sae MoonPage 26

최단경로의 중간에 놓여 있는 정점이 없는 경우 0

Page 14: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

14

알고리즘

Dynamic ProgrammingDP DP 기반기반 최단경로최단경로 –– Floyd Floyd 알고리즘알고리즘 2 (2/4)2 (2/4)

void floyd2(int n, const number W[][], number D[][], index P[][]){{

index i, j, k;for(i=1; i <= n; i++)

for(j=1; j <= n; j++)P[i][j] = 0;

D = W;for(k=1; k<= n; k++)

for(i=1; i <= n; i++)for(j=1; j<=n; j++)

if ((D[i][k] + D[k][j]) < D[i][j]) {

vi에서 vj로 가는데 vk를

지난다는 정보를 저장

Computer Algorithmsby Yang-Sae MoonPage 27

P[i][j] = k;D[i][j] = D[i][k] + D[k][j];

}}

D[i][j] = minimum(D[i][j], D[i][k]+D[k][j]);

그림 3-2의 예를 가지고 (D와) P를 구해 보시오.

Dynamic ProgrammingDP DP 기반기반 최단경로최단경로 –– Floyd Floyd 알고리즘알고리즘 2 (3/4)2 (3/4)

[ ][ ] 1 2 3 4 5P i j[ ][ ] 1 2 3 4 51 0 1 3 1 4

D i j

1 0 0 4 0 42 5 0 0 0 43 5 5 0 0 44 5 5 0 0 05 0 1 4 1 0

2 8 0 3 2 53 10 11 0 4 74 6 7 2 0 35 3 4 6 4 0

Computer Algorithmsby Yang-Sae MoonPage 28

Page 15: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

15

최단경로 출력 알고리즘

Dynamic ProgrammingDP DP 기반기반 최단경로최단경로 –– Floyd Floyd 알고리즘알고리즘 2 (4/4)2 (4/4)

void path(index q,r){

if (P[q][r] != 0) {path(q,P[q][r]);cout << “ v” << P[q][r];path(P[q][r],r);

}}

앞서의 P로 path(5,3)을 출력하면 다음과 같다.path(5,3) = 4path(5 4) = 1

Computer Algorithmsby Yang-Sae MoonPage 29

path(5,4) = 1path(5,1) = 0v1path(1,4) = 0

v4path(4,3) = 0결과: v1 v4. (즉, v5에서 v3으로 가는 최단경로는 v5, v1, v4, v3,이다.)

5 4 2

1

강의강의 순서순서

이항 계수 (Binomial Coefficient)

최단 경로 문제 (Shortest Path Problem)

Dynamic Programming

최단 경로 문제 (Shortest Path Problem)

최적의 원칙 (The Principle of Optimality)

연쇄행렬곱셈 (Matrix-Chain Multiplication)

Computer Algorithmsby Yang-Sae MoonPage 30

Page 16: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

16

문제의 입력에 대해서 최적(optimal)의 해답을 주는 재귀

관계식(recursive property)을 설정

Dynamic ProgrammingDynamic ProgrammingDynamic Programming에에 대한대한 설계설계 절차절차

상향적으로 최적의 해답을 계산 (D, P 계산)

상향적으로 최적의 해답을 구축 (경로 출력)

잠깐 쉬어갈까

Computer Algorithmsby Yang-Sae MoonPage 31

Dynamic Programming최적의최적의 원칙원칙 (The Principle of Optimality)(The Principle of Optimality)

어떤 문제의 입력에 대한 최적 해가 그 입력을 나누어 쪼갠 여러 부

분에 대한 최적 해를 항상 포함하고 있으면, 그 문제는 최적의 원칙

이 적용된다 라고 한다이 적용된다 라고 한다.

보기: 최단경로를 구하는 문제에서, vk를 vi에서 vj로 가는 최적 경

로 상의 정점이라고 하면, vi에서 vk 로 가는 부분경로와 vk에서 vj

로 가는 부분경로도 반드시 최적이어야 한다. 이렇게 되면 최적의

원칙을 준수하게 되므로 Dynamic Programming을 사용하여 이 문

제를 풀 수 있다.

Computer Algorithmsby Yang-Sae MoonPage 32

제를 풀 수 있다.

Page 17: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

17

Dynamic Programming최적의최적의 원칙이원칙이 적용되지적용되지 않는않는 예제예제

최장경로(Longest Path) 문제

v1에서 v4로의 최장경로는 [v1 v3 v2 v4]v1에서 v4로의 최장경로는 [v1, v3, v2, v4]

가 된다.

그러나, 이 경로의 부분 경로인 v1에서

v3으로의 최장경로는 [v1, v3]이 아니고,

[v1, v2, v3]이다.

따라서 최적의 원칙이 적용되지 않는다.

v2

3v3

v1

11

2

Computer Algorithmsby Yang-Sae MoonPage 33

따라서 최적의 원칙이 적용되지 않는다.

주의: 여기서는 단순경로(simple path),

즉 순환(cycle)이 없는 경로만 고려한다.v4

4

강의강의 순서순서

이항 계수 (Binomial Coefficient)

최단 경로 문제 (Shortest Path Problem)

Dynamic Programming

최단 경로 문제 (Shortest Path Problem)

최적의 원칙 (The Principle of Optimality)

연쇄행렬곱셈 (Matrix-Chain Multiplication)

Computer Algorithmsby Yang-Sae MoonPage 34

Page 18: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

18

Dynamic Programming연쇄행렬곱셈연쇄행렬곱셈 (Matrix(Matrix--Chain Multiplication) (1/2)Chain Multiplication) (1/2)

i j 행렬과 j k행렬을 곱하기 위해서는 일반적으로 i j k번만큼의 기본적인 곱셈이 필요하다. (교재 pp. 104-105)

연쇄적으로 행렬을 곱할 때 어떤 행렬곱셈을 먼저 수행하느냐에연쇄적으로 행렬을 곱할 때, 어떤 행렬곱셈을 먼저 수행하느냐에

따라서 필요한 기본적인 곱셈의 횟수가 달라지게 된다.

예를 들어서, 다음 연쇄행렬곱셈을 생각해 보자:

• A1 A2 A3

• A1의 크기는 10 100이고,

• A2의 크기는 100 5이고,

Computer Algorithmsby Yang-Sae MoonPage 35

2의 기는 이 ,

• A3의 크기는 5 50라고 하자.

• A1 A2를 먼저 계산한다면, 기본적인 곱셈의 총 횟수는 7,500회

• A2 A3를 먼저 계산한다면, 기본적인 곱셈의 총 횟수는 75,000회

Dynamic Programming

또 다른 예제: 교재 p. 105

연쇄적으로 행렬을 곱할 때 기본적인 곱셈의 횟수가 가장 적게 되

연쇄행렬곱셈연쇄행렬곱셈 (Matrix(Matrix--Chain Multiplication) (2/2)Chain Multiplication) (2/2)

는 최적의 순서를 결정하는 알고리즘 개발이 목표이다.

Computer Algorithmsby Yang-Sae MoonPage 36

Page 19: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

19

Dynamic Programming연쇄행렬곱셈연쇄행렬곱셈 –– 무작정무작정 알고리즘알고리즘

알고리즘: 가능한 모든 순서를 모두 고려해 보고, 그 가운데에서

가장 최소를 택한다.

시간복잡도 분석: 최소한 지수(exponential-time) 시간시간복잡도 분석: 최소한 지수(exponential time) 시간

증명:

• n개의 행렬(A1 , A2 ,…, An)을 곱할 수 있는 모든 순서의 가지 수를 tn이

라고 하자.

• 만약 A1이 마지막으로 곱하는 행렬이라고 하면, 행렬 A2 ,…, An을 곱하

는 데는 tn-1개의 가지수가 있을 것이다.

A 이 마지막으로 곱하는 행렬이라고 하면 행렬 A A 을 곱하는 데

Computer Algorithmsby Yang-Sae MoonPage 37

• An이 마지막으로 곱하는 행렬이라고 하면, 행렬 A1,…, An-1을 곱하는 데

는 또한 tn-1개의 가지수가 있을 것이다.

• 그러면, tn tn-1 + tn-1 = 2 tn-1이고, t2= 1이라는 사실은 쉽게 알 수 있다.

• 따라서 tn 2tn-1 22tn-2 … 2

n-2t2 = 2

n-2= (2

n)이다.

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 설계설계 (1/2)(1/2)

dk를 행렬 Ak의 열(column)의 수라고 하자. 그러면 자연히 Ak의 행

(row)의 수는 dk-1가 된다.

Computer Algorithmsby Yang-Sae MoonPage 38

Page 20: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

20

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 설계설계 (2/2)(2/2)

A1의 행의 수는 d0라고 하자. 그러면, 다음과 같이 재귀 관계식을

구축할 수 있다.

M[i][j] =i < j일 때 Ai부터 Aj까지의 행렬을 곱하는데

필요한 곱셈의 최소 횟수 (1 i < j n)

11min ( [ ][ ] [ 1][ ] )

[ ][ ]0

i k ji k jM i k M k j d d d i j

M i ji j

Computer Algorithmsby Yang-Sae MoonPage 39

j

1i k k jA A A A

1i kd d k jd d

k = i, i+1, ..., j-2, j-1

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 재귀식재귀식 적용적용 예예

1 2 3 4 5 6

5 2 2 3 3 4 4 6 6 7 7 8A A A A A A

4 5[ 4 ][ 6 ] m in ( [ 4 ][ 4 ] [ 5 ][ 6 ] 4 6 8 , [ 4 ][ 5 ] [ 6 ][6 ] 4 7 8 )

m in ( 0 6 7 8 4 6 8 , 4 6 7 0 4 7 8 )

m in ( 5 2 8 , 3 9 2 ) 3 9 2

kM M M M M

[ ][ ] 1 2 3 4 5 61 0 30 64 132 226 3482 0 24 72 156 268

M i j

Computer Algorithmsby Yang-Sae MoonPage 40

2 0 24 72 156 2683 0 72 198 3664 0 168 3925 0 3366 0

Page 21: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

21

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 최적최적 순서의순서의 구축구축

최적 순서를 얻기 위해서는 M[i][j]를 계산할 때 최소값을 주는 k값을 P[i][j]에 기억한다.

예: P[2][5] = 4인 경우의 최적 순서는 (A2 A3 A4)A5이다. 예: P[2][5] 4인 경우의 최적 순서는 (A2 A3 A4)A5이다. 구축한 P는 다음과 같다.

[ ][ ] 1 2 3 4 5 61 1 1 1 1 12 2 3 4 53 3 4 5

P i j

Computer Algorithmsby Yang-Sae MoonPage 41

따라서, 최적 분해는 (A1((((A2 A3) A4) A5) A6))이다.

4 4 55 5

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 알고리즘알고리즘 (1/2)(1/2)

문제: n개의 행렬을 곱하는데 필요한 기본적인 곱셈 횟수의 최소치

를 결정하고, 그 최소치를 구하는 순서를 결정하라.

입력 행렬의 수 배열 d[0 ]입력: 행렬의 수 n, 배열 d[0..n]

(d[i-1] d[i]는 i번째 행렬의 규모를 나타낸다.)

출력:

• 기본적인 곱셈의 횟수의 최소치를 나타내는 minmult;

• 최적의 순서를 얻을 수 있는 배열 P

(여기서 P[i][j]는 행렬 i부터 j까지가 최적 순서로 갈라지는 기점을 나타낸다 )

Computer Algorithmsby Yang-Sae MoonPage 42

(여기서 P[i][j]는 행렬 i부터 j까지가 최적 순서로 갈라지는 기점을 나타낸다.)

Page 22: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

22

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 알고리즘알고리즘 (2/2)(2/2)

알고리즘

int minmult(int n, const int d[], index P[][])

{

[ ][ ] 1 2 3 4 5 61 0 30 64 132 226 3482 0 24 72 156 2683 0 72 198 3664 0 168 392

M i j

index i, j, k, diagonal;

int M[1..n, 1..n];

for(i=1; i <= n; i++)

M[i][i] = 0;

for(diagonal = 1;diagonal <= n-1;diagonal++)

for(i=1;i <= n-diagonal;i++) { // i = row

j = i + diagonal; // j = column

M[i][j] = minimum (M[i][k]+M[k+1][j]+d[i-1]*d[k]*d[j]);

5 0 3366 0

Computer Algorithmsby Yang-Sae MoonPage 43

ikj-1P[i][j] = 최소치를 주는 k의 값

}

return M[1][n];

}

11min ( [ ][ ] [ 1][ ] )

[ ][ ]0

i k ji k jM i k M k j d d d i j

M i ji j

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 알고리즘알고리즘 분석분석

단위연산: 각 k값에 대하여 실행된 명령문(instruction), 여기서 최

소값인 지를 알아보는 비교문도 포함한다.

입력크기 곱할 행렬의 수입력크기: 곱할 행렬의 수 n

분석: j = i + diagonal이므로,

• k-루프를 수행하는 횟수 =

• for-i-루프를 수행하는 횟수 = n – diagonal

( 1) 1 1 1j i i diagonal i diagonal

Computer Algorithmsby Yang-Sae MoonPage 44

• diagonal의 범위는 1 ~ (n-1)이므로, 모든 경우 시간 복잡도는 다음과 같다.

3

1

1

( 1)( 1)[( ) ] ( )

6

n

diagonal

n n nn diagonal diagonal n

Page 23: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

23

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 최적최적 해의해의 출력출력 (1/2)(1/2)

문제: n개의 행렬을 곱하는 최적의 순서를 출력하시오.

입력: n과 앞서 구한 2차원 배열 P

출력: 최적의 순서출력: 최적의 순서

알고리즘:

void order(index i, index j){

if (i == j) cout << “A” << i;else {

k = P[i][j];

[ ][ ] 1 2 3 4 5 61 1 1 1 1 1

P i j

Computer Algorithmsby Yang-Sae MoonPage 45

cout << “(”;order(i,k);order(k+1,j);cout << “)”;

}}

2 2 3 4 53 3 4 54 4 55 5

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 최적최적 해의해의 출력출력 (2/2)(2/2)

order(i,j)의 의미:Ai ... Aj 의 계산을 수행하는데 기본적인 곱셈의 수가 가장

적게 드는 순서대로 괄호를 쳐서 출력하시오적게 드는 순서대로 괄호를 쳐서 출력하시오.

복잡도 분석: T(n) (n) Why?

Computer Algorithmsby Yang-Sae MoonPage 46

Page 24: 06. Dynamic Programming - Kangwoncs.kangwon.ac.kr › ~ysmoon › courses › 2010_1 › alg › 06.pdf · 2016-06-02 · Dynamic Programming n k • 결국, 구하려는값은B[n][k]에저장된다

24

Dynamic ProgrammingDP DP 기반기반 연쇄행렬곱셈연쇄행렬곱셈 –– 개선된개선된 솔루션솔루션

Yao(1982) (n2)

Hu and Shing(1982, 1984) (n lg n)

Computer Algorithmsby Yang-Sae MoonPage 47

Dynamic Programming교재의교재의 나머지나머지 부분부분 (( 자세한자세한 내용내용 생략생략))

최적 이진검색 트리: 주어진 키 값에 대해서 검색을 최소화하는

(가장 균형 잡힌) 이진트리를 구축하는 방법

• 교재의 알고리즘(Gilbert & Moore 1959) (n3) • 교재의 알고리즘(Gilbert & Moore 1959) (n )

• Yao(1982) (n2)

외판원 문제(Traveling Salesman Problem: TSP): 모든 도시를 방

문하되 출장 시간을 최소화하는 문제

• 무작정 알고리즘 (n!)

• 교재의 알고리즘 (n2n)

56

115

7389 94

Computer Algorithmsby Yang-Sae MoonPage 48

• 교재의 알고리즘 (n2 )

• 최악의 경우 시간복잡도가 지수보다 좋은 TSP 알고리즘을 찾은 사람은 아무도 없다.

• 또한, 그런 알고리즘이 불가능하다고 증명한 사람도 없다.

32

51

62 108 49