21-02-23 알고리즘 기초강의
연쇄 행렬 곱셈
연쇄 행렬 곱셈은 주어진 n개의 연쇄 행렬을 곱하는 최적의 순서를 구하는 문제
- 행렬 곱셈은 결합 법칙이 성립하지만 곱셈 순서에 따라 각 원소의 곱셈 횟수가 달라짐 → 이 곱셈 횟수가 가장 작아지는 최적의 순서를 구하기
- 2 x 3 행렬과 3 x 4 행렬을 곱하면 2 x 4 행렬이 됨
→ i x k 행렬과 k x j 행렬을 곱하면 i x j 행렬이 되며
→ 원소 곱셈의 횟수는 i * k * j가 된다
- Brute-force 방식으로 접근하기
- 모든 경우의 수(카탈랑 수)를 계산하여 최적의 순서를 선택
- 카탈랑 수는 결국 지수함수이므로 너무 오래걸림
- Dynamic Programming 방식으로 접근하기
- 재귀 관계식을 찾는다
- M: 연쇄 행렬을 곱하는데 필요한 최소 횟수 행렬
- M[i][j]: A
i에서 Aj까지 행렬을 곱하는데 필요한 최소 횟수 - A
i… Aj행렬을 (Ai… Ak)(Ak+1… Aj)로 분할하는 재귀 관계식 찾기
- 상향식 방법으로 해답을 구하기
- M[i][i] = 0 (대각선에 위치하는 원소를 0으로 초기화)
- M[1][n]을 상향식으로 계산 (대각선 1번, 대각선 2번 … 대각선 n-1번)
- n개의 행렬을 두 개의 최적 부분행렬의 곱으로 분할
- M[i][j] = minimum(M[i][k] + M[k+1][j] + d
i-1dkdj) // 단, i ≤ k ≤ j-1
파이썬으로 연쇄 행렬 곱셈
1 | def minmult (d): |
자바스크립트로 연쇄 행렬 곱셈
1 | const minmult = d => { |