矩陣鏈乘法問題

2021-05-26 10:31:08 字數 949 閱讀 4623

問題描述(詳見演算法導論p197-p198):

已知:給定n個矩陣構成的乙個矩陣鏈(a1, a2, ..., an),矩陣ai的維數為pi-1×pi

求:決定該矩陣鏈的乘法結合順序(即加括號),使得矩陣鏈乘法的執行時間最短

幾個前提概念

首先判斷是否具有最優子結構假設ai...aj的矩陣鏈乘法的最優解是在ak與ak+1之間分開的,即(ai...ak)(ak+1...aj),則子串行也必須是矩陣鏈乘法的最優解

由此可知,問題的最優解包含子問題的最優解,滿足最優子結構

然後給出遞迴表示式

遞迴表示式如下

其中矩陣ai的維數為pi-1 x pi

然後進行自底向上的求解

矩陣m是乙個上三角矩陣(不需要考慮i>j的情況),且對角線上的元素值均為0

由上面的遞迴表示式知,m[i, j]的值只取決於m[i, k]和m[k+1, j](k≥i且k<j),因此自底向上的求解過程實際是按子串行的長度遞增來進行的

最後構造最優解

在推導過程中記錄s[i, j]的值,用於遞迴構造最優解(即矩陣鏈的圓括號新增順序)

**:

int ** dp(int * p, int n)

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

}} }

printf("m: %d\n", m[0][n-1]);

return s;

}void print_parens(int ** s, int i, int j, int n)

else

}

矩陣鏈乘法問題 (演算法)

一 概述 以兩個矩陣相乘為例,a1 a2,a1和a2為兩個矩陣,假設a1的行列數是p q,a2的行列數是q r。注意這裡由於是a1乘以a2,所以a1的列數要等於a2的行數,否則無法做矩陣乘法,滿足上述條件的矩陣,我們稱之為 相容 的。那麼對於a1 a2而言,我們需要分別執行p r次對應a1的行元素乘...

矩陣鏈乘法

設m i j 為計算矩陣ai.j所需標量乘法運算次數的最小值。對整個問題計算ai.n的最小代價就是m i,n 使用輔助表是s 1.n,1.n 來記錄計算m i,j 時取得最優代價處k的值。k是裂開的位置。include define n 6 void matrix int p,int m n 1 i...

矩陣鏈乘法

a1,a2.an,n個矩陣,矩陣ai的維數為p i 1 p i 資料矩陣鏈乘法加全部括號,使得計算乘法的次數最少 對矩陣ai,ai 1,其維數分別為p i 1 p i p i p i 1 ai ai 1要執行乘法運算的次數為p i 1 p i p i 1 m i j 為矩陣ai ai 1 aj最少的...