• 검색 결과가 없습니다.

제8장 동적 프로그래밍

N/A
N/A
Protected

Academic year: 2021

Share "제8장 동적 프로그래밍"

Copied!
25
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

http://academy.hanb.co.kr

쉽게 배우는 알고리즘

8장. 동적 프로그래밍

Dynamic Programming (DP) IT COOKBOOK IT COOKBOOK

8장.

동적 프로그래밍

Dynamic Programming (DP)

계시란 바깥 어딘가에서 우리한테 갑자기 주어지는 객관적 지식이 아니다. 만물의 근원에 대한 본질적인 귀속감, 우리가 거기에 아주 밀접하게 닿아 있다는 관계성을 스스로가 발견해내는 것이 계시다. -데이빗 스타인들-라스트

(2)

- 3 - 한빛미디어㈜

학습목표

• 동적 프로그래밍이 무엇인가

를 이해한다.

• 어떤 특성을 가진 문제가 동적 프로그래밍의

적용 대상인지를 감지

할 수 있도록 한다.

• 기본적인 몇 가지 문제를 동적 프로그래밍으

로 해결할 수 있도록 한다.

배경

• 재귀적 해법

– 큰 문제에 닮음꼴의 작은 문제가 깃든다.

– 잘 쓰면 보약, 못쓰면 맹독

• 관계중심으로 파악함으로써 문제를 간명하게 볼 수 있다. • 재귀적 해법을 사용하면 심한 중복 호출이 일어나는 경우가 있다.

• Dynamic Programming

– 재귀적 중복을 해결하는 프로그래밍 기법

– 이 기법에 왜 동적 프로그래밍이라는 이름이

(3)

- 5 - 숙명여대 멀티미디어과학과

재귀적 해법의 빛과 그림자

• 재귀적 해법이 바람직한 예

– 퀵정렬, 병합정렬 등의 정렬 알고리즘

– 계승(factorial) 구하기

– 그래프의 Depth First Search

– …

• 재귀적 해법이 치명적인 예 è DP의 대상!!

– 피보나치수 구하기

– 행렬곱셈 최적순서 구하기

– …

도입문제: 피보나치수 구하기

• f

n

= f

n-1

+ f

n-2

• 아주 간단한 문제지만

– Dynamic programming의 동기와 구현이 다

포함되어 있다.

(4)

- 7 - 숙명여대 멀티미디어과학과

피보나치수를 구하는 Recursive Algorithm

fib

(n)

{

if

(n == 1 or

n == 2)

then return

1;

else return

(

fib

(n-1) +

fib

(n-2));

}

ü

엄청난 중복 호출이 존재한다

fib(5) fib(3) fib(4) fib(2) fib(3) fib(1) fib(2) fib (1) fib (2) fib(4) fib(2) fib(3) fib (1) fib (2) fib(6) fib(5) fib(3) fib(4) fib(2) fib(3) fib(1) fib(2) fib (1) fib (2) fib(7)

피보나치 수열의 Call Tree

(5)

- 9 - 숙명여대 멀티미디어과학과

fib()에서 문제 크기가 커짐에 따라

중복 호출이 증가하는 모습

수행되는 fib() fib(2)의 호출 횟수 fib(3) 1 fib(4) 2 fib(5) 3 fib(6) 5 fib(7) 8 fib(8) 13 fib(9) 21 fib(10) 34

ü

중복 호출 횟수 자체가 다시 피보나치 수열을 이루며 증가

ü

증가 속도는 2



이상의 비율

피보나치수를 구하는 DP Algorithm

fib(n)

{

f[1] = f[2] = 1;

for

(i = 3; i <= n; i++)

f[i] = f[i-1] +f[i-2];

return

f[n];

}

ü

Θ(n) 시간에 끝난다

(6)

- 11 - 숙명여대 멀티미디어과학과

피보나치수 DP 재귀 버전

// 배열 f[]의 모든 원소는 0으로 초기화되어 있음. f[i] 값이 0이면 // fib(i)가 아직 한 번도 수행되지 않았음을 의미. fib(n) { if (f[n] != 0) return f[n]; // 이전에 호출되었었는지 검사 else { if (n == 1 || n == 2) f[n] = 1; else f[n] = fib(n-1) + fib(n-2); } return f[n]; }

è Memoization(메모하기) 기법에 해당.

DP의 적용 요건

• Optimal substructure

– 큰 문제의 최적 솔루션에 작은 문제의 최적

솔루션이 포함됨

• Overlapping recursive calls

– 재귀적 해법으로 풀면 같은 문제에 대한

재귀호출이 심하게 중복됨

(7)

- 13 - 숙명여대 멀티미디어과학과

문제 예 2: 행렬 경로 문제

• 양 또는 음의 정수 원소들로 구성된 n×n 행렬이

주어지고, 행렬의 좌상단에서 시작하여 우하단까지

이동한다

• 이동 방법 (제약조건)

– 오른쪽이나 아래쪽으로만 이동할 수 있다 – 왼쪽, 위쪽, 대각선 이동은 허용하지 않는다

• 목표: 행렬의 좌상단에서 시작하여 우하단까지

이동하되, 방문한 칸에 있는 수들을 더한 값이

최대화되도록 한다

6 7 12 5 5 3 11 18 7 17 3 3 8 10 14 9 6 7 12 5 5 3 11 18 7 17 3 3 8 10 14 9 불법 이동 (상향) 불법 이동 (좌향)

불법 이동의 예

(8)

- 15 - 숙명여대 멀티미디어과학과 6 7 12 5 5 3 11 18 7 17 3 3 8 10 14 9 6 7 12 5 5 3 11 18 7 17 3 3 8 10 14 9

유효한 이동의 예

j: 1 2 3 4 i: 1 2 3 4

• 변수 c

ij

: 원소 (i, j)에 이르는 최고점수

• c

ij

=

11

1

+ 

1,  − 1

1

+ 

 − 1,1



+ max {

,  − 1,



− 1, 

}

if i == j == 1

if i == 1, j > 1

if i > 1, j == 1

if i > 1, j > 1

행렬 경로 문제의 Recursive Algorithm

matrixPath(i, j) (i, j)에 이르는 최저점수 {

if(i == 1 andj == 1) then returnmij;

else if(i == 1) then return(matrixPath(1, j-1) + mij);

else if(j == 1) then return(matrixPath(i-1, 1) + mij);

else return((max(matrixPath(i-1, j), matrixPath(i, j-1)) + mij);

(9)

- 17 - 숙명여대 멀티미디어과학과 mat(4,3) mat (4,2) mat(3,3) mat(3,2) mat(4,1) mat(2,1) mat(3,1) mat(1,1) mat(3,1) mat(2,2) mat(4,4) mat(2,3) mat(1,2) mat(2,1) mat(1,1) mat(2,1) mat(1,2) mat(1,1) mat(1,1) mat(1,1) mat(3,4) mat(2,4) mat(2,3) mat(1,4) mat(1,2) mat(1,3) mat(1,1) mat(1,3) mat(2,2) mat(1,2) mat(1,1) mat(1,2) mat(2,1) mat(1,1) mat(1,1) mat(1,3) mat(3,2) mat(3,1) mat(2,2) mat(2,1) mat(1,1) mat(2,1) mat(1,2) mat(1,1) mat(1,1) mat(2,2) mat(2,1) mat(1,2) mat(1,1) mat(1,1) mat(3,3) mat(2,3) mat(1,2) mat(1,1) mat(1,3) mat(3,2) mat(3,1) mat(2,2) mat(2,1) mat(1,1) mat(2,1) mat(1,2) mat(1,1) mat(1,1) mat(2,2) mat(2,1) mat(1,2) mat(1,1) mat(1,1)

Call Tree

matrixPath()에서 문제 크기가 커짐에

따라 중복 호출이 증가하는 모습

수행되는 matrixPath() matrixPath(2,1)의 호출 횟수 matrixPath(2, 2) 1 matrixPath(3, 3) 3 matrixPath(4, 4) 10 matrixPath(5, 5) 35 matrixPath(6, 6) 126 matrixPath(7, 7) 462 matrixPath(8, 8) 1,716 matrixPath(9, 9) 6,435

(10)

- 19 - 숙명여대 멀티미디어과학과

DP

matrixPath(i, j) (i, j)에 이르는 최저점수 { c[1,1] ← m11; fori ← 2 ton c[i,1] ← mi1+ c[i-1,1]; forj ← 2 ton c[1, j] ← m1j+ c[1, j-1]; fori ← 2 ton forj ← 2 ton

c[i, j] ← mij+ max(c[i-1, j], c[i, j-1]);

returnc[n, n]; }

üComplexity: O(n

2

)

문제 예 3: 조약돌 놓기

• 3×N 테이블의 각 칸에 양 또는 음의 정수가 기록되어

있다

• 조약돌을 놓는 방법 (제약조건)

– 각 열에는 적어도 하나의 조약돌을 놓아야 한다 – 가로나 세로로 인접한 두 칸에 동시에 조약돌을 놓을 수 없다

• 목표: 돌이 놓인 자리에 있는 수의 합을 최대가 되도록

조약돌 놓기

(11)

- 21 - 숙명여대 멀티미디어과학과

6

7

12

-5

5

3

11

3

-8

10

14

9

7

13

8

5

11

12

7

4

8

-2

9

4

테이블의 예

6 7 12 -5 5 3 11 3 -8 10 14 9 7 13 8 5 11 12 7 4 8 -2 9 4

합법적인 예

합법적이지 않은 예

6 7 12 -5 5 3 11 3 -8 10 14 9 7 13 8 5 11 12 7 4 8 -2 9 4

Violation!

(12)

- 23 - 숙명여대 멀티미디어과학과 6 7 12 -5 5 3 11 3 -8 10 14 9 7 13 8 5 11 12 7 4 8 -2 9 4 6 7 12 -5 5 3 11 3 -8 10 14 9 7 13 8 5 11 12 7 4 8 -2 9 4 6 7 12 -5 5 3 11 3 -8 10 14 9 7 13 8 5 11 12 7 4 8 -2 9 4 패턴 1: 패턴 2: 패턴 3: 6 7 12 -5 5 3 11 3 -8 10 14 9 7 13 8 5 11 12 7 4 8 -2 9 4 패턴 4:

가능한 패턴

임의의 열을 채울 수 있는 패턴은 4가지뿐이다 패턴 1: 패턴 2: 패턴 3: 2 3 2 1 1 3 4 1 1 3 3 2 2 2

서로 양립할 수 있는

패턴들

패턴 1은 패턴 2, 3과 패턴 2는 패턴 1, 3, 4와 패턴 3은 패턴 1, 2와 패턴 4는 패턴 2와 양립할 수 있다

(13)

- 25 - 숙명여대 멀티미디어과학과

6

7

12

-5

5

3

11

3

-8

10

14

9

7

13

8

5

11

12

7

4

8

-2

9

4

-5

4

-5

4

i

i-1

i 열과 i-1열의 관계를 파악해 보자

• c

ip

: i 열이 패턴 p로 놓일 때의 최고점수

• w

ip

: i 열이 패턴 p로 놓일 때 i열에 돌이 놓인 곳의 점수

• c

ip

=



max 

 − 1,

 + 



if i == 1

if i > 1

단, q는 p와 양립 가능한

패턴 q

Recursive Algorithm

pebble(i, p) ▷ i 열이 패턴 p로 놓일 때의 i 열까지의 최대 점수 합 구하기 ▷ w[i, p] : i 열이 패턴 p로 놓일 때 i 열에 돌이 놓인 곳의 점수 합. p {1, 2, 3, 4} { if(i == 1) returnw[1, p] ; else{ max = ―∞ ; for(q = 1; q <= 4; q++) { if (패턴 q가 패턴 p와 양립) { tmp = pebble(i-1, q) ; if (tmp > max) max = tmp ; } }

return(w[i, p] + max) ; }

(14)

- 27 - 숙명여대 멀티미디어과학과 pebbleSum(n)

▷ n 열까지 조약돌을 놓은 방법 중 최대 점수 합 구하기

{

return max { pebble(n, p) } ; }

ü pebble(i, 1) ~ pebble(i, 4) 중 최대값이 최종적인 답

p =1,2,3,4

peb(4,3)

peb (3,1) peb(3,2) peb(2,3) peb(2,1) peb(1,1)peb(1,3) peb(1,4) peb(1,1) peb(1,2) peb(1,2) peb(1,3)

peb(5,1) peb(4,2) peb(2,2) peb(2,3) peb(1,1) peb(1,2) peb(2,4) peb(1,2)

Call Tree

(15)

- 29 - 숙명여대 멀티미디어과학과

pebble()에서 문제 크기가 커짐에 따라

중복 호출의 비율이 증가하는 모습

문제의 크기(n) 부분 문제의 총 수(4n) 함수 pebble()의 총 호출 횟수 1 4 4 2 8 12 3 12 30 4 16 68 5 20 152 6 24 332 7 28 726

DP 적용

• DP의 요건 만족

– Optimal substructure

• pebble(i, …)에 pebble(i-1, …)이 포함됨 • 즉, 큰 문제의 최적 솔루션에 작은 문제의 최적 솔루션이 포함됨

– Overlapping recursive calls

• 재귀적 알고리즘에 중복 호출 심함

• 함수 pebble() 한 번 호출은 부분 문제 한 개와

대응됨

– 이 4n개를 아래에서 작은 것부터 저장해가며

구하면 됨.

(16)

- 31 - 숙명여대 멀티미디어과학과

DP

pebble(n) ▷ n 열까지 조약돌을 놓을 때의 최고 점수 { for(p = 1; p ≤ 4; p++) peb[1, p] = w[1, p] ; for(i = 2; i ≤ n; i++) { for(p = 1; p ≤ 4; p++)

peb[i, p] = w[i, p] + max{peb[i-1, q]};

return max{peb[n, p]}; } 패턴 q는 패턴 p와 양립 p =1,2,3,4

ü복잡도 : O(n)

기껏 3 가지 기껏 n 바퀴 기껏 4 바퀴 무시

Complexity

pebble

(n)

{

for

p ← 1 to

4

peb[1, p] ← w[1, p] ;

for

i ← 2 to

n {

for

p ← 1 to

4 {

peb[i, p] ← w[i, p] + max {peb[i-1, q]} ;

}

return

max {

peb

[n, p] } ;

}

패턴 q는 패턴 p와 양립

(17)

- 33 - 숙명여대 멀티미디어과학과

문제 예 4: 행렬 곱셈 순서(Matrix-Chain

Multiplication) 문제

• Matrices A, B, C

– (AB)C = A(BC)

• 예: A:10ⅹ100, B:100ⅹ5, C:5ⅹ50

– (AB)C: 7500번의 곱셈 필요

– A(BC): 75000번의 곱셈 필요

• A

1

, A

2

, A

3

, …, A

n

을 곱하는 최적의 순서는?

Recursive Relation

• 마지막으로 matrix multiplication이 수행되는 상황

– n-1 가지 가능성

• (A1… An-1)An • (A1… An-2) (An-1An) • ∙ ∙ ∙ • (A1A2)(A3… An) • A1(A2… An )

– 어느 경우가 가장 매력적인가?

(18)

- 35 - 숙명여대 멀티미디어과학과

ü c

ij

: 행렬 A

i

, A

i+1

, …, A

j

의 곱 A

i

A

i+1

…A

j

를 계산하는

최소 비용

ü A

i

의 차원: p

i-1

p

i

0

if i == j

min {c

ik

+ c

k+1, j

+ p

i-1

p

k

p

j

}

if i < j

i ≤ k ≤ j-1

c

ij

=

Recursive Algorithm

rMatrixChain(i, j) ▷ 행렬곱 Ai…Aj를 구하는 최소 비용 구하기 { if(i == j) then return0; ▷ 행렬이 하나뿐인 경우의 비용은 0 min ← ∞; for(k = i; k <= j-1; k++) {

q = rMatrixChain(i, k) + rMatrixChain(k+1, j) + pi-1pkpj;

if(q < min) thenmin = q; }

(19)

- 37 - 숙명여대 멀티미디어과학과

DP

matrixChain(n) { for(i = 1; i <= n; i++) m[i, i] = 0; ▷ 행렬이 하나뿐인 경우의 비용은 0 for(r = 1; r <= n-1; r++) ▷ r: 문제의 크기를 결정하는 변수, 문제의 크기 = r+1 fori ← 1 ton-r { j ← i + r;

m[i, j] ← min {m[i, k] + m[k+1, j] + pi-1pkpj};

} returnm[1, n]; } i ≤ k ≤ j-1

ü

Complexity: Θ(n

3

)

문제 예 5: 최장 공통부분 순서

Longest Common Subsequence(LCS)

• 두 string에 공통적으로 들어있는 common

subsequence들 중 가장 긴 것을 찾는다

• Subsequence의 예

– <bcdb>는 문자열 <abcbdab>의 subsequence이다

• Common subsequence의 예

– <bca>는 문자열 <abcbdab>와 <bdcaba>의 common subsequence이다

• Longest common subsequence(LCS)

– Common subsequence들 중 가장 긴 것

(20)

- 39 - 숙명여대 멀티미디어과학과

Optimal Substructure

• 두 문자열 X

m

= <x

1

x

2

… x

m

>과 Y

n

= <y

1

y

2

… y

n

>에 대해

– xm== yn이면 Xm과 Yn의 LCS의 길이는 Xm-1과 Yn-1의 LCS의 길이보다 1이 크다 – xm≠ yn이면 Xm과 Yn의 LCS의 길이는 Xm과 Yn-1의 LCS의 길이와 X m-1과 Yn의 LCS의 길이 중 큰 것과 같다.

• c

ij

=

0 if i == 0 or j == 0 ci-1, j-1 + 1 if i, j > 0 and

x

i

== y

j

max{

ci-1, j, ci, j-1} if i, j > 0 and

x

i

y

j

ü

c

ij: 두 문자열 Xi= <x1x2… xi>와 Yj= <y1y2… yj>의 LCS 길이라 하자.

Recursive Algorithm

LCS(m, n) ▷ 두 문자열 Xm과 Yn의 LCS 길이 구하기 { if(m == 0 ||n == 0) then return0;

else if(xm== yn) then returnLCS(m-1, n-1) + 1;

else returnmax{LCS(m-1, n), LCS(m, n-1)}; }

(21)

- 41 - 숙명여대 멀티미디어과학과 LCS(3,4) LCS(3,3) LCS(2,4) LCS(1,4) LCS(1,3) LCS(0,4) LCS(1,2) LCS(0,3) LCS(1,1) LCS(0,2) LCS(0,1) LCS(1,0) LCS(2,3) LCS(2,2) LCS(2,1) LCS(1,3) LCS(1,2) LCS(0,3) LCS(1,1) LCS(0,2) LCS(0,1) LCS(1,0) LCS(1,2) LCS(1,1) LCS(0,2) LCS(0,1) LCS(1,0) LCS(1,1) LCS(2,0) LCS(0,1) LCS(1,0) LCS(3,2) LCS(2,2) LCS(2,1) LCS(3,1) LCS(2,1) LCS(3,0) LCS(1,1) LCS(2,0) LCS(1,0) LCS(0,1) LCS(1,2) LCS(1,1) LCS(0,2) LCS(0,1) LCS(1,0) LCS(1,1) LCS(2,0) LCS(0,1) LCS(1,0) LCS(2,3) LCS(2,2) LCS(2,1) LCS(1,3) LCS(1,2) LCS(0,3) LCS(1,1) LCS(0,2) LCS(0,1) LCS(1,0) LCS(1,2) LCS(1,1) LCS(0,2) LCS(0,1) LCS(1,0) LCS(1,1) LCS(2,0) LCS(0,1) LCS(1,0)

Call Tree

LCS()에서 문제 크기가 커짐에 따라

중복 호출이 증가하는 모습

수행되는 LCS() LCS(1,1)의 호출 횟수 LCS(2, 2) 2 LCS(2, 3) 3 LCS(3, 3) 6 LCS(3, 4) 10 LCS(4, 4) 20 LCS(4, 5) 35 LCS(5, 5) 70 LCS(5, 6) 126 LCS(6, 6) 252 LCS(6, 7) 462 LCS(7, 7) 924

(22)

- 43 - 숙명여대 멀티미디어과학과

DP

LCS(m, n) ▷ 두 문자열Xm과 Yn의 LCS 길이 구하기 { fori ← 0 tom C[i, 0] ← 0; forj ← 0 ton C[0, j] ← 0; fori ← 1 tom forj ← 1 ton

if(xm== yn) thenC[i, j] = C[i-1, j-1] + 1;

elseC[i, j] = max{C[i-1, j], C[i, j-1]};

returnC[m, n]; }

ü

Complexity: Θ(mn)

문제 예 6: Shortest Path

• Weighted digraph G=(V, E)

– w

i,j

: vertex i에서 vertex j에 이르는 edge의 길이

• Edge가 없으면 ∞

• 목표

– 시작점 s에서 다른 각 vertex에 이르는 최단거리를

모두 구한다

(23)

- 45 - 숙명여대 멀티미디어과학과

• d

tk

: 중간에 최대 k 개의 edge를 거쳐

s로부터 vertex t에 이르는 최단거리

• 목표: d

tn-1

• Note! For i≠s,

– d

t0

= ∞

– d

t1

= w

s,t 다음 페이지로 넘어가기 전에 무엇을 중심으로 관계를 파악할 지 스스로 생각해보자

Recursive Relation

d

t

k

= min {

d

r

k-1

+ w

r, t

}

d

s

0

= 0;

d

t

0

= ∞;

(24)

- 47 - 숙명여대 멀티미디어과학과

DP

Ballman-Ford(G, s) {

ds← 0;

forall vertices i ≠ s di← ∞;

fork ← 1 ton-1 {

forall edges (a, b) {

if(da+ wa,b< db ) thendb ← da+ wa,b;

} } } ü Propagation 되는 모습이 떠오르면 잘 이해한 것! b a 8 9 8 10 1 3 -12 -7 11 8 2 4 5 -15 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ (a) 8 9 8 10 1 3 -12 -7 11 8 2 4 5 -15 0 ∞ 11 9 ∞ ∞ 8 ∞ (b) i =1 8 9 8 10 1 3 -12 -7 11 8 2 4 5 -15 0 19 11 9 19 10 -6 ∞ (c) i =2 8 9 10 1 3 -12 11 8 2 5 -15 0 11 7 12 4 -6 12 (d) i =3 8 9 10 1 3 -12 11 8 2 5 -15 0 11 0 12 4 -8 6 (e) i =4 8 9 10 1 3 -12 11 8 2 5 -15 0 11 0 9 1 -15 6 (f) i =5

(25)

- 49 - 숙명여대 멀티미디어과학과 8 9 8 10 1 3 -12 -7 11 8 2 4 5 -15 0 10 11 0 9 1 -15 6 (f) i =5 8 9 8 10 1 3 -12 -7 11 8 2 4 5 -15 0 7 11 9 3 -5 -18 6 (i) (h) i =78 9 8 10 1 3 -12 -7 11 8 2 4 5 -15 0 7 11 9 3 -5 -18 6 8 9 8 10 1 3 -12 -7 11 8 2 4 5 -15 0 10 11 -3 3 1 -15 3 (g) i =6 나중에 그래프 알고리즘 부분에서 다시 한 번 생각할 기회가 있음 IT COOKBOOK IT COOKBOOK

Thank you

참조

관련 문서

 관계된 개체 클래스들이 관계성을 통해 하나의 릴레이션 으로 합병.  개체 클래스 Employee와 Store가 Manages 관계성을 통해

프로그래밍

프로그래밍

(예) ‘끊이지 않는 울음’에 대한 기술과 같이 끊임없이 우는 아기를 양 육하는 부모들의 체험에 대한 연구를 통해 그러한 체험을 구성하는 본질적인 요소를

TransferDatabase 다른 데이터베이스 파일과의 가져오기, 내보내기, 연결 등을 지원한다. TransferSpreadsheet 스프레드시트

 승리에 대한 과도한 압력으로 스포츠의 본질적인 가치 변질 (스포츠 참가를 통해 선수의 정신과 육체에 심각한 상해).. 문제는 선수들의 의지

• 그러나 중생의 체험을 통해 새로운 피조물 이 됨으로 완전한 본질적인 변화의 가능성 을 밝혔다. • 타락한 인간이

카르다노는 제자인 로도비코 페라리와 얻은, 일반적인 사차 방정식의 대수적 해법과 아울러, 3차 방정식의 대수적 해법을 출판하고 싶다고