๐Ÿ‘ฉ๐Ÿป‍๐ŸŒพ

Chap 3. Dynamic Programming ๋ณธ๋ฌธ

Study/Algorithm

Chap 3. Dynamic Programming

์ฅฌ์Šค์ด 2023. 4. 20. 21:36
728x90

Dynamic Programming์ด๋ž€?

์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ ์ˆ˜ํ•™์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜.
๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๊ณ , ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ์ €์žฅํ•˜์—ฌ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๊ณ , ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ „์ฒด ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•(=Bottom-Up)
 
4๊ฐ€์ง€์˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด Dynamic Programming์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

1. The Binomial Coefficient

C(n, k) = C(n-1, k) + C(n-1, k-1) for 0<k<n
C(n, k) = 1 for k=0 or k=n
 
Pseudo-Code using Divide and Conquer -> Top Down

public static int Bin(int n , int k){
	if(k == 0 || k == n)
    		return 1;
	else
    		return Bin(n-1, k) + Bin(n-1, k-1);
}

Pseudo-Code using Dynamic Programming

public static int Bin2(int n, int k){
	index i, j;
	int [][]B = new int[0..n][0..k];
    
    for(i = 0; i <= n; i++)
	for(j = 0; j <= min(i,k); j++)
            if(j == 0 || j == i)
            	B[i][j]=1;
            else
            	B[i][j]=B[i-1][j]+B[i-1][j-1];
	return B[n][k];
}

2. Floyd's Algorithm for Shortest Paths

given a pair of vertices (vi, vj), 1 <= i, j <= n

  • D(k)[i][j] = ์˜ค์ง ์ง‘ํ•ฉ {v1, v2, .... , vk} ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค๋งŒ ์‚ฌ์šฉํ•ด์„œ vi โ†’ vj ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ
  • D(0)[i][j] = W[i][j]
    • ์–ด๋–ค ๋…ธ๋“œ๋„ ํ†ต๊ณผํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ vi โ†’ vj๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ

Floyd's Algorithm ์žฌ๊ท€์‹

D(k)[i][j] = min(D(k-1)[i][j], D(k-1)[i - 1][j] + D(k-1)[i - 1][j - 1])

void Floyd(int n, const number W[][], number D[][]){
    index 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] = min(D[i][j], D[i][k] + D[k][j]);
}

T(n) = n * n * n 

void FloydPath(int n, const number W[][], number D[][], number P[][]){
    idex i, j, k;
    
    for(i = 1; i <= n; i++)
    	for(j = 1; j <= n; j++)
        	P[i][j] = 0;	// ์ค‘๊ฐ„์— ๊ฑฐ์น˜๋Š” v๊ฐ€ ์—†์Œ
    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]{
                    D[i][j] = D[i][k] + D[k][j];
                    P[i][j] = k;	// vi โ†’ vj๋กœ ๊ฐˆ ๋•Œ, k ๊ฑฐ์นจ
                 }
}
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);
    }
}

3. Optimal Binary Search Trees

Binary Search Tree ์ •์˜

  • ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๋Š” ํ•˜๋‚˜์˜ key๋ฅผ ํฌํ•จ
  • ์ฃผ์–ด์ง„ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์žˆ๋Š” key๋“ค์€ ์ฃผ์–ด์ง„ ๋…ธ๋“œ์˜ ํ‚ค๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์Œ
  • ์ฃผ์–ด์ง ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์žˆ๋Š” key๋“ค์€ ์ฃผ์–ด์ง„ ๋…ธ๋“œ์˜ ํ‚ค๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ

 

Boundary condition

  • A[i][i] = Pi
    • key i ๋งŒ ๊ฐ€์ง€๊ณ  binary search tree๋ฅผ ๋งŒ๋“ฆ
    • ์ฆ‰, ๋…ธ๋“œ 1๊ฐœ์งœ๋ฆฌ binary search tree๊ฐ€ ๋จ 

โญ๏ธ โˆ‘ ์ˆ˜์‹ ์„ค๋ช… โญ๏ธ
Pk : ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋“ฑ์žฅํ•  ํ™•๋ฅ , Pk* 1 ๊ฐ’์ธ๋ฐ ์ƒ๋žต๋œ *1์€  depth๊ฐ€ 1์ด๋ฏ€๋กœ ๊ณฑํ•ด์ฃผ๋Š” ๊ฐ’
A[1][k-1] : ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ตœ์ ํ™” ๊ฐ’
A[k+1][n] : ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ตœ์ ํ™” ๊ฐ’
์ฒซ๋ฒˆ์งธ โˆ‘ : ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ๊ฐ๊ฐ์˜ key ๊ฐ’๋“ค์„ ๋ฃจํŠธ ๋…ธ๋“œ( = key k)์™€ ๋น„๊ตํ•œ ๊ฐ’๋“ค์˜ ํ•ฉ
๋‘๋ฒˆ์งธ โˆ‘ : ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ๊ฐ๊ฐ์˜ ๊ฐ’๋“ค์„ ๋ฃจํŠธ ๋…ธ๋“œ( = key k)์™€ ๋น„๊ตํ•œ ๊ฐ’
 

Optimal Binary Search Trees ์žฌ๊ท€์‹

A[i][j] = min(A[i][k-1] + A[k+1][j] + โˆ‘ Pm
------------ Boundary Condition ------------
A[i][i] = Pi
A[i][i-1] = A[j+1][j] = 0    โ†’    ์—†๋Š” case
----------------------------------------------
 
Pseudo-Code

void OptSearchTree(int n, const float p[], float& minavg, index R[][]){
    index i, j, k, diagonal;
    float A[1..n+1][o..n];
    
    // boundary condition
    for(i = 1; i <= n; i++){
    	A[i][i-1] = 0; A[i][i] = p[i];
        R[i][i] = i; R[i][i-1] = 0;
    }
    A[n+1][n] = 0; R[n+1][n] = 0;
    
    // recursive property
    for(diagonal = 1; diagonal <= n-1; diagonal++)
    	for(i = 1; i <= n - diagonal; i++){
            j = i + diagonal;
            A[i][j] = min(A[i][k-1] + A[k+1][j]) + pm;
            
            R[i][j] = a value of k giving the minimum;
	}
    // answer
    minavg = A[1][n];
 }

T(n) = โˆ‘ (j-i+1) * (n-diagonal) = โˆ‘ (diagonal+1) * (n-diagonal) = n(n-1)(n+4)/6 โˆˆ ๐šฏ(n^3)

4. Traveling SalesPerson Problem(TSP)

TSP ์žฌ๊ท€์‹
D[vi][A] = min(W[i][j] + D[vj][A-{vj}]) if A โ‰  โˆ…
------------ Boundary Condition ------------
D[vi][โˆ…] = W[i][1]
----------------------------------------------
 
Pseudo-Code

void Travel(int n, const number W[][], index p[][], number& minLength){
	index i, j, k; 
	number D[1..n][subset of V-{v1}];
    
	//boundary condition
	for(i = 2; i <= n; i++)
		D[i][โˆ…] = W[i][1];
	for(k = 1; k <= n-2; k++)
    	for(all subsets A โІ V-{v1} contains k nodes)
        	for(i such that iโ‰ 1 and vi is not in A){
            	D[i][A] = min(W[i][j] + D[j][A-{vj}]);
                
                R[i][A] = value of j giving the minimum
            }
	// answer
	D[1][V-{v1}] = min(W[i][j] + D[j][V-{v1, vj}]);
	P[1][V-{v1}] = value of j that gave the minimum;
	minLength = D[1][V-{v1}];
}
728x90

'Study > Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Chap 9. Introduction to the Theory of NP  (0) 2023.06.11
Chap 7. Introduction to Computational Complexity: The Sorting Problem  (0) 2023.06.08
Chap 6. Branch and Bound  (0) 2023.06.06
Chap 5. Backtracking  (0) 2023.06.04
Chap 4. The Greedy Approach  (0) 2023.06.01
Comments