演算法筆記 動態規劃 矩陣連乘問題

2021-07-09 14:34:46 字數 1840 閱讀 4573

問題描述:給定n個矩陣:a1,a

2,...,a

n,其中ai與a

i+1是可乘的,i=1,2...,n-1。確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。輸入資料為矩陣個數和每個矩陣規模,輸出結果為計算矩陣連乘積的計算次序和最少數乘次數。

問題解析:由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序。這種計算次序可以用加括號的方式來確定。若乙個矩陣連乘積的計算次序完全確定,也就是說該連乘積已完全加括號,則可以依此次序反覆呼叫2個矩陣相乘的標準演算法計算出矩陣連乘積。

完全加括號的矩陣連乘積可遞迴地定義為:

(1)單個矩陣是完全加括號的;

(2)矩陣連乘積a是完全加括號的,則a可表示為2個完全加括號的矩陣連乘積b和c的乘積並加括號,即a=(bc)

例如,矩陣連乘積a

1a2a3a4有5種不同的完全加括號的方式:(a1(a2(a3a4))),(a1((a2a3)a4)),((a1a2)(a3a4)),((a1(a2a3))a4),(((a1a2)a3)a4)。每一種完全加括號的方式對應於乙個矩陣連乘積的計算次序,這決定著作乘積所需要的計算量。

看下面乙個例子,計算三個矩陣連乘;維數分別為10*100 , 100*5 , 5*50 按此順序計算需要的次數((a1*a

2)*a

3):10x100x5+10x5x50=7500次,按此順序計算需要的次數(a

1*(a2*a3)):10*5*50+10*100*50=75000次

所以問題是:如何確定運算順序,可以使計算量達到最小化。

演算法思路

例:設要計算矩陣連乘乘積a

1a2a3a4a5a6,其中各矩陣的維數分別是: a

1:30*35;     a2:35*15;     a3:15*5;     a4:5*10;     a5:10*20;     a6:20*25 

遞推關係:

設計算a[i:j],1≤i≤j≤n,所需要的最少數乘次數m[i,j],則原問題的最優值為m[1,n]。

當i=j時,a[i:j]=a

i,因此,m[i][i]=0,i=1,2,…,n

當ik和a

k+1之間斷開,i<=ki-1pk

pj。由於在計算是並不知道斷開點k的位置,所以k還未定。不過k的位置只有j-i個可能。因此,k是這j-i個位置使計算量達到最小的那個位置。

綜上,有遞推關係如下:

構造最優解

若將對應m[i][j]的斷開位置k記為s[i][j],在計算出最優值m[i][j]後,可遞迴地由s[i][j]構造出相應的最優解。s[i][j]中的數表明,計算矩陣鏈a[i:j]的最佳方式應在矩陣ak和a

k+1之間斷開,即最優的加括號方式應為(a[i:k])(a[k+1:j)。因此,從s[1][n]記錄的資訊可知計算a[1:n]的最優加括號方式為(a[1:s[1][n]])(a[s[1][n]+1:n]),進一步遞推,a[1:s[1][n]]的最優加括號方式為(a[1:s[1][s[1][n]]])(a[s[1][s[1][n]]+1:s[1][s[1][n]]])。同理可以確定a[s[1][n]+1:n]的最優加括號方式在s[s[1][n]+1][n]處斷開...照此遞推下去,最終可以確定a[1:n]的最優完全加括號方式,及構造出問題的乙個最優解。

矩陣連乘 動態規劃 動態規劃解矩陣連乘問題

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...

python矩陣連乘 動態規劃 矩陣連乘問題

一 問題描述 給定n個數字矩陣a1,a2,an,其中ai與ai 1是可乘的,設ai是pi 1 pi矩陣,i 1,2,n。求矩陣連乘a1a2.an的加括號方法,使得所用的乘次數最少。例子三個矩陣連乘,可以有 a1a2 a3和a1 a2a3 兩種方法求積 乘法次數分別為 p0p1p2 p0p2p3和p0...

動態規劃 矩陣連乘問題

給定n 1個矩陣 a0,a1,a2,an 1 其中ai與ai 1是可乘的,i 0,1,2,n 2。矩陣乘法滿足結合律。考察這n個矩陣的連乘積,得出運算次數最少的結合。首先,考慮兩個矩陣相乘。如果a b兩個矩陣可以相乘,那麼a b的形式必定滿足 a p q b q r 設c a b,那麼c滿足c p ...