演算法導論 矩陣鏈乘法

2021-06-09 21:25:26 字數 1348 閱讀 6481

【問題描述】

給定有n個連乘矩陣的維數,要求計算其採用最優計算次序時所用的乘法次數,即所要求計算的乘法次數最少。例如,給定三個連乘矩陣的維數分別是10*100,100*5和5*50,採用(a1a2)a3,乘法次數為10*100*5+10*5*50=7500次,而採用a1(a2a3),乘法次數為100*5*50+10*100*50=75000次乘法,顯然,最好的次序是(a1a2)a3,乘法次數為7500次。

分析:

矩陣鏈乘法問題描述:

給定由n個矩陣構成的序列[a1,a2,...,an],對乘積a1a2...an,找到最小化乘法次數的加括號方法。

1)尋找最優子結構

此問題最難的地方在於找到最優子結構。對乘積a1a2...an的任意加括號方法都會將序列在某個地方分成兩部分,也就是最後一次乘法計算的地方,我們將這個位置記為k,也就是說首先計算a1...ak和ak+1...an,然後再將這兩部分的結果相乘。

最優子結構如下:假設a1a2...an的乙個最優加括號把乘積在ak和ak+1間分開,則字首子鏈a1...ak的加括號方式必定為a1...ak的乙個最優加括號,字尾子鏈同理。

一開始並不知道k的確切位置,需要遍歷所有位置以保證找到合適的k來分割乘積。

2)構造遞迴解

設m[i,j]為矩陣鏈ai...aj的最優解的代價,則

┌ 0 如果i = j

m[i,j] = │

└ min(i≤kusing namespace std;

#define n 7

//p為矩陣鏈,p[0],p[1]代表第乙個矩陣,p[1],p[2]代表第二個矩陣,length為p的長度

//所以如果有六個矩陣,length=7,m為儲存最優結果的二維矩陣,s為儲存選擇最優結果路線的

//二維矩陣

void matrixchainorder(int *p,int (*m)[n],int (*s)[n],int length)

//l表示矩陣鏈的長度

// l=2時,計算 m[i,i+1],i=1,2,...,n-1 (長度l=2的鏈的最小代價)

for(l=2;l<=n;l++)}}

}cout << m[1][n-1] << endl;

}void printanswer(int(*s)[n],int i,int j)

else

}int main()

; int m[n][n],s[n][n];

matrixchainorder(p,m,s,n);

printanswer(s,1,n-1);

return 0;

}

演算法導論之矩陣鏈乘法詳解

內容都是是演算法導論上的,僅作為乙個閱讀筆記,記錄一下自己閱讀過程中碰到的一些問題。希望能對需要的同學有所幫助!矩陣鏈乘法是指給定乙個n個矩陣的序列 矩陣鏈 a1,a2,an 我們希望計算它們的乘積 a1a2a3 an 對於這個問題,我們可以先用括號明確計算的次序,然後利用標準的矩陣相乘演算法進行計...

演算法導論 動態規劃之矩陣鏈乘法

原題見pdf204頁 a0a1a2a3a4a5 定義 a i 的維數為p i p i 1 m i j 為重a i 乘到a j 標量乘法運算的最小次數。m i j 0,當i j時 加入要求解的是m 0 2 則m 0 2 為m 0 0 m 1 2 p 0 p 1 p 3 m 0 1 m 2 2 p 0 ...

演算法導論 矩陣乘法strassen演算法

矩陣運算在做科 算時是必不可少的,如果採用matlab來計算,這倒也容易。但是如果是自己寫c或者c 一般而言,需要做三次迴圈,其時間複雜度就是o n 3 上圖給出了我們一般會採用的方法,就是對應元素相乘和相加。如果把c a b進行分解,可以看出,這裡需要進行8次的乘法運算 分別是 r a e b g...