矩阵链乘法
1.问题
设A1,A2,……,An为n个矩阵的序列,其中Ai为Pi-1×Pi阶矩阵,这个矩阵链的输入用向量P=<P0,P1,……,Pn>给出。
给定向量P,确定一种乘法次序,使得具备运算的总次数达到最小。
2.解析
Ai…j:表示矩阵链相乘的子问题Ai,Ai+1…Aj; M[i…j]:表示得到乘积Ai…j所用的最少基本运算次数;
假定最后一次相乘发生在矩阵链Ai…k Ak+1…j之间
满足优化原则。也就是说,m[i,j]最小值时,m[i,k],m[k+1,j]也是最小的。
实例:
以上述问题为例:
3. 设计
for r from 2 to n //r为当前问题规模(长度)
for I from 1 to n-r+1
j=i+r-1 //不同终点
m[i , j] = m[i+1,j]+P[i-1] * P[k]* P[j] //划分为Ai(Ai+1…Aj),此时k=i
s[i , j] = i
for k from i+1 to j-1
t =min (t, m[i, k]+m[k+1, j] + P[i-1]*P[k]*P[j] //划分不同的位置
s[i,j]=k
void MatrixChain(int n)
{
for (int r = 2; r <= n; r++) { //r为当前问题规模(长度)
for (int i = 1; i <= n - r + 1; i++) { //i的起点不断变化,各种r长
int j = i + r - 1; //不同终点
m[i][j] = m[i + 1][j] + P[i - 1] * P[i] * P[j];//划分为Ai(Ai+1...Aj),此时k=i
s[i][j] = i;
for (int k = i+1; k <= j - 1; k++){
int t = m[i][k] + m[k + 1][j] + P[i - 1] * P[k] * P[j];
if (t < m[i][j]){
m[i][j] = t;
s[i][j] = k;
}
}
}
}
}