Binomial Coefficient Dynamic Programming The binomial coefficient is
이항계수(Binomial Coefficient) – 정의 Dynamic Programming 이항계수 구하는 공식 • The binomial coefficient is the number of ways of picking k unordered outcomes from n possibilities, also known as a combination n. Ck. 계산량이 많은 n!이나 k!을 계산하지 않고 이항계수를 구하기 위해 서 통상 다음 수식을 사용한다. 4 Computer Algorithms by Yang-Sae Moon
이항계수 – Divide & Conquer 알고리즘 Dynamic Programming 문제: 이항계수를 계산한다. 입력: 음수가 아닌 정수 n과 k, 여기서 k n 출력: 이항계수 결과 값 알고리즘: int bin(int n, int k) { if (k == 0 || n == k) return 1; else return bin(n-1, k-1) + bin(n-1, k) } 5 Computer Algorithms by Yang-Sae Moon
이항계수 – Dynamic Programming 알고리즘 Dynamic Programming 문제: 이항계수를 계산한다. 입력: 음수가 아닌 정수 n과 k, 여기서 k n 출력: 이항계수 결과 값 알고리즘: int bin 2(int n, int k) { index i, j; int B[0. . n][0. . k]; 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]; } 11 Computer Algorithms by Yang-Sae Moon
가중치 포함 방향 그래프 예제 1 v 1 3 5 v 5 3 Dynamic Programming 9 1 2 3 2 v 4 4 15 v 2 v 3 Computer Algorithms by Yang-Sae Moon
DP 기반 최단경로 – Floyd 알고리즘 1 (2/2) Dynamic Programming 알고리즘 void floyd(int n, const number W[][], number D[][]) { 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]); } 모든 경우를 고려한 분석: • 단위연산: for-j 루프안의 지정문 • 입력크기: 그래프에서의 정점의 수 n 22 Computer Algorithms by Yang-Sae Moon
DP 기반 최단경로 – Floyd 알고리즘 2 (2/4) Dynamic Programming 알고리즘 void floyd 2(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; vi에서 vj로 가는데 vk를 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]) { P[i][j] = k; D[i][j] = D[i][k] + D[k][j]; } } 24 Computer Algorithms by Yang-Sae Moon
DP 기반 최단경로 – Floyd 알고리즘 2 (3/4) Dynamic Programming 그림 3 -2의 예를 가지고 (D와) P를 구해 보시오. 25 Computer Algorithms by Yang-Sae Moon
DP 기반 최단경로 – Floyd 알고리즘 2 (4/4) Dynamic Programming 최단경로 출력 알고리즘 void path(index q, r) { if (P[q][r] != 0) { path(q, P[q][r]); count << “ v” << P[q][r]; path(P[q][r], r); } } 앞서의 P로 path(5, 3)을 출력하면 다음과 같다. path(5, 3) = 4 path(5, 4) = 1 path(5, 1) = 0 v 1 path(1, 4) = 0 v 4 path(4, 3) = 0 결과: v 1 v 4. (즉, v 5에서 v 3으로 가는 최단경로는 v 5, v 1, v 4, v 3, 이다. ) 26 Computer Algorithms by Yang-Sae Moon
DP 기반 연쇄행렬곱셈 – 설계 (1/2) Dynamic Programming dk를 행렬 Ak의 열(column)의 수라고 하자. 그러면 자연히 Ak의 행 (row)의 수는 dk-1가 된다. 32 Computer Algorithms by Yang-Sae Moon
DP 기반 연쇄행렬곱셈 – 재귀식 적용 예 34 Dynamic Programming Computer Algorithms by Yang-Sae Moon
DP 기반 연쇄행렬곱셈 – 알고리즘 (2/2) Dynamic Programming 알고리즘 int minmult(int n, const int d[], index P[][]) { index i, j, k, diagonal; int M[1. . n, 1. . n]; for(i=1; i <= n; i++) M[i][j] = 0; for(diagonal = 1; diagonal <= n-1; diagonal++) for(i=1; i <= n-diagonal; i++) { j = i + diagonal; M[i][j] = minimum (M[i][k]+M[k+1][j]+d[i-1]*d[k]*d[j]); i k j-1 P[i][j] = 최소치를 주는 k의 값 } return M[1][n]; } 37 Computer Algorithms by Yang-Sae Moon
DP 기반 연쇄행렬곱셈 – 최적 해의 출력 (1/2) Dynamic Programming 문제: n개의 행렬을 곱하는 최적의 순서를 출력하시오. 입력: n과 앞서 구한 2차원 배열 P 출력: 최적의 순서 알고리즘: int minmult(int n, const int d[], index P[][]) void order(index i, index j) { if (i == j) cout << “A” << i; else { k = P[i][j]; cout << “(”; order(i, k); order(k+1, j); cout << “)”; } } 39 Computer Algorithms by Yang-Sae Moon
DP 기반 연쇄행렬곱셈 – 개선된 솔루션 Dynamic Programming Yao(1982) (n 2) Hu and Shing(1982, 1984) (n lg n) 41 Computer Algorithms by Yang-Sae Moon
- Slides: 42