矩阵链乘法

矩阵链乘法问题:给定n个矩阵构成的一个链<A1,A2,...,An>,其中i=1,2,...,n,矩阵Ai的维数为pi-1 X pi,对成绩A1A2...An以一种最小化标量乘法次数的方式进行加全部括号
两个矩阵相乘

对于AiAi+1...Aj,设m[i][j]为计算矩阵Ai..j所需的标量乘法运算次数的最小值,可知m[i][i]=0。则求m[i][j]的递归定义为:
m[i][j]=0(if i==j)  or  min{m[i][k]+m[k+1][j]+pi-1pkpj}(if i<j and i=<k<j)
下面的程序利用动态规划自底向上计算最小乘法运算次数,设m[i][j](1=<i,j<=n)保存Ai...j的最小乘法次数,s[i][j](1=<i,j<=n)保存当取得m[i][j]时k的值
matrix chain
 1 //p={p0,p1,...,pn}
2 MATRIX-CHAIN-ORDER(p)
3 n=length(p)-1
4 for(i=1;i<=n;++i)
5 m[i][i]=0
6 for(l=2;l<=n;++l)
7 for(i=1;i<=n-l+1;++i)
8 j=i+l-1
9 m[i][j]=INFINITY
10 for(k=i;k<j;++k)
11 if(m[i][k]+m[k+1][j]+p[i-1]p[k]p[j]<m[i][j])
12 m[i][j]=m[i][k]+m[k+1][j]+p[i]p[k]p[j]
13 s[i][j]=k
构造一个最优解
1 PRINT-OPTIMAL-PARENS(s,i,j)
2 if(i==j)
3 print "Ai"
4 else
5 print "(" PRINT-OPTIMAL-PARENS(s,i,s[i][j])
6 PRINT-OPTIMAL-PARENS(s,s[i][j]+1,j)
7 print ")"
1 MATRIX-MULTIPLY(A,B)
2 if(column(A)!=row(B))
3 return "nonsense"
4 for(i=0;i<row(A);++i)
5 for(j=0;j<column(B);++j)
6 C[i][j]=0
7 for(k=0;k<column(A);++k)
8 C[i][j]+=A[i][k]*B[k][j]
9 return C
posted @ 2012-02-06 20:32  Cavia  阅读(947)  评论(0编辑  收藏  举报