某工程計算中經(jīng)常要完成多個矩陣相乘(鏈乘)的計算任務,對矩陣相乘進行以下說明。
(1)兩個矩陣相乘要求第一個矩陣的列數(shù)等于第二個矩陣的行數(shù),計算量主要由進行乘法運算的次數(shù)決定,假設采用標準的矩陣相乘算法,計算Amxn*Bnxp需要m*n*p次行乘法運算的次數(shù)決定、乘法運算,即時間復雜度為O(m*n*p)。
(2)矩陣相乘滿足結(jié)合律,多個矩陣相乘時不同的計算順序會產(chǎn)生不同的計算量。以矩陣A15×100,A2100*8,A38x50三個矩陣相乘為例,若按(A1*A2)*A3計算,則需要進行5*100*8+5*8*50=6000次乘法運算,若按A1*(A2*A3)計算,則需要進行100*8*50+5*100*50=65000次乘法運算。
矩陣鏈乘問題可描述為:給定n個矩陣,對較大的n,可能的計算順序數(shù)量非常龐大,用蠻力法確定計算順序是不實際的。經(jīng)過對問題進行分析,發(fā)現(xiàn)矩陣鏈乘問題具有最優(yōu)子結(jié)構(gòu),即若A1*A2**An的一個最優(yōu)計算順序從第k個矩陣處斷開,即分為A1*A2*…*Ak和Ak+1*Ak+2*...*An兩個子問題,則該最優(yōu)解應該包含 A1*A2*…*Ak的一個最優(yōu)計算順序和 Ak+1*Ak+2*...*An 的一個最優(yōu)計算順序。據(jù)此構(gòu)造遞歸式:
(2)函數(shù)cmm
#define N100
int cost[N[N];
int trace[N][N];
int cmm(int n,int seq[]){
int tempCost;
int tempTrace;
int i,j,k,p;
int temp;
for( i=0;i<n;i++){ cost[i][i] = 0;}
for(p=1;p<n;p++){
for(i=0; i<n-p;i++){
(1) ;
tempCost = -1;
for(k = i; (2) ;k++){
temp= (3) ;
if(tempCost==-1 || tempCost>temp){
tempCost = temp;
tempTrace=k;
}
}
cost[i][j] = tempCost;
(4) ;
}
}
return cost[0][n-1];
}