動態規劃之矩陣鏈乘法

2021-08-10 03:04:37 字數 2182 閱讀 3896

給定乙個n個矩陣的序列,我們希望計算它的乘積 a1a2a3...an,我們可以用括號標定計算次序,然後再利用標準的矩陣乘法演算法來計算,由於矩陣乘法滿足結合律,所以任何一種計算順序最後的計算結果都是相同的。

完全括號化的矩陣乘積鏈:它是單一矩陣,或者兩個完全括號化的矩陣乘積鏈的積,並且已經外加括號;例如矩陣鏈(a1,a2,a3,a4),則有下邊5種完全括號化的矩陣鏈:

對矩陣鏈加括號雖然對計算結果沒影響,但是計算過程中所花費的代價卻是影響巨大。我們先來做簡單的分析,首先a,b矩陣能相乘的條件是兩個矩陣相容(即a矩陣的列數等於b矩陣的行數),設a是n*m階,b是m*r階,那麼要進行n*m*r次標量乘法運算;舉個例子:設a1,a2,a3三個矩陣分別為10x100,100x5,5x50階,若按(a1(a2a3))順序計算,那麼總共進行(100x5x50)+(10x100x50)=75000次標量乘法運算;若按((a1a2)a3)順序,那麼總共進行(10x100x5)+(10x5x50)=7500次標量乘法運算,第二種順序比第一種運算快10倍。

引入矩陣乘法鏈問題:給定n個矩陣的鏈(a1,a2,...an),矩陣ai的規模pi-1xpi,求完全括號化方案,使得a1a2...an的乘積所需的標量乘法次數最小。

在此之前先來考慮一下完全括號化方案的總數,用p(n)表示方案總數,當n=1時,只有乙個矩陣,只有一種方案;n>=2時,這樣考慮,完全括號化的矩陣乘積可以看成兩個完全括號化的部分積的形式,總結成下邊的式子:

下邊根據動態規劃的4個步驟來設計演算法:

1、最優括號化方案的結構特徵:

用ai...j表示aiai+1...aj的乘積,為了進行完全括號化,必須在ak,ak+1之間將鏈斷開,即對乙個整數k,我們先計算ai...k,ai+1...j,再計算兩者的乘積,此方案的代價是ai...k,ak+1...j的計算代價,加上兩者相乘的計算代價。有乙個重要的結論:在原問題ai...aj的最優括號化方案中,對子鏈ai...ak,ak+1...aj括號化的方案就是原問題的括號化方案。

2、乙個遞迴求解方案:

用m[i,j]表示計算ai...aj所需的標量乘法次數的最小值,那麼m[1,n]就表示整個問題的解。這樣來定義遞迴式,當i=j時,輸入只有乙個矩陣,即m[i,i]=0,當i

最後再加乙個量s[i,j]儲存劃分位置。

3、計算代價,給出實現:

自底向上**法

//自底向上**法

void min_chainorder_down2up(datatype p,int n,datatype m[n],datatype s[n])

{ for(int l=2;l<=n;l++)

{for(int i=1;i<=n-l+1;i++)

{int j=l+i-1;

m[i][j]=max_limits;

for(int k=i;k<=j-1;k++)

{int q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];

if(q

演算法時間複雜度o(n^3),並且需要o(n^2)的記憶體來維護m和s這兩個表

4、構造最優解:

void print_result(datatype s[n],int i,int j)

{ if(i==j)

cout<

#include #define n 7

#define max_limits 100000

typedef int datatype;

using namespace std;

//自底向上**法

void min_chainorder_down2up(datatype p,int n,datatype m[n],datatype s[n])

{ for(int l=2;l<=n;l++)

{for(int i=1;i<=n-l+1;i++)

{int j=l+i-1;

m[i][j]=max_limits;

for(int k=i;k<=j-1;k++)

{int q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];

if(q

動態規劃之矩陣鏈乘法

雖然我們在 動態規劃之鋼條切割 裡面已經介紹過動態規劃的相關知識,這裡還是提一下動態的兩大特徵 1.最優子結構,原問題的解是在子問題的最優解的基礎上建立起來的 2.重疊子問題,即在不斷求解子問題的過程中會產生相同的子問題,而不是一直產生新的子問題 現在我們來看乙個例子,假設有三個矩陣 a1 10,1...

動態規劃 矩陣鏈乘法

矩陣鏈乘法問題 給定n個矩陣的鏈,矩陣ai的規模為p i 1 p i 求完全括號化方案,使得計算乘積a1a2 an所需標量乘法次數最少。m i j 表示矩陣鏈ai j所需標量乘法次數的最小值。m i j 0 i j m i j m i k m k 1 j p i 1 p k p j i k s 1....

動態規劃 矩陣鏈乘法

兩個矩陣相乘的計算量,對於一般的矩陣乘法來說,如矩陣a m,n 與矩陣b n,p 相乘需要進行的加法次數為m n p次乘法 由於矩陣乘法滿足結合律,因此矩陣相乘的結合性,會影響整個計算表示式的乘法執行次數 如下面的例子,a b c三個矩陣相乘,其中a 10,5 b 5,20 c 20,3 1 ab ...