給定
n個矩陣
n個矩陣的連乘積
由於矩陣乘法滿足結合律,所以計算矩陣的連乘可以有許多不同的計算次序。這種計算次序可以用加括號的方式來確定。
若乙個矩陣連乘積的計算次序完全確定,也就是說該連乘積已完全加括號,則可以依此次序反覆呼叫
2個矩陣相乘的標準演算法計算出矩陣連乘積
演算法複雜度分析:對於n
個矩陣的連乘積,設其不同的計算次序為
p(n)。
由於每種加括號方式都可以分解為兩個子矩陣的加括號問題:
(a1...
ak)(ak+1…an)
可以得到關於
p(n)
的遞推式如下
將矩陣連乘積
將矩陣連乘積簡記為
a[i:j
],這裡i≤
j 考察計算
a[i:j
]的最優計算次序。設這個計算次序在矩陣 ak
和ak+1
之間將矩陣鏈斷開,i≤k
,則其相應完全
加括號方式為
計算量:
a[i:k
]的計算量加上
a[k+1:j]
的計算量,再加上 a[
i:k]
和a[k+1:j]
相乘的計算量
特徵:計算
a[i:j
]的最優次序所包含的計算矩陣子鏈
a[i:k]和
a[k+1:j]
的次序也是最優的。
矩陣連乘計算次序問題的最優解包含著其子問題的最優解。這種性質稱為
最優子結構性質。問題的最優子結構性質是該問題可用動態規劃演算法求解的顯著特徵。
設計算a[i:j],
1≤i≤j≤n
,所需要的最少數乘次數
m[i,j
],則原問題的最優值為
m[1,n]
當i=j時,
a[i:j
]=ai
,因此,
m[i,i
]=0,
i=1,2,…,n 當
i時,
這裡的維數為
可以遞迴地定義
m[i,j
]為k的位置只有j-i種可能
在遞迴計算時,
許多子問題被重複計算多次。這也是該問題可用動態規劃演算法求解的又一顯著特徵。
用動態規劃演算法解此問題,可依據其遞迴式以自底向上的方式進行計算。在計算過程中,儲存已解決的子問題答案。每個子問題只計算一次,而在後面需要時只要簡單查一下,從而避免大量的重複計算,最終得到多項式時間的演算法
void matrixchain(int *p,int n,int **m,int **s)}}
}
演算法複雜度分析:
演算法matrixchain的主要計算量取決於演算法中對r,
i和k的
3重迴圈。迴圈體內的計算量為
o(1),而3
重迴圈的總次數為
o(n3
)。因此演算法的計算時間上界為
o(n3
)。演算法所占用的空間顯然為
o(n2)。
•矩陣連乘計算次序問題的最優解包含著其子問題的最優解。這種性質稱為最優子結構性質。
•在分析問題的最優子結構性質時,所用的方法具有普遍性:首先假設由問題的最優解匯出的子問題的解不是最優的,然後再設法說明在這個假設下可構造出比原問題最優解更好的解,從而導致矛盾。
•利用問題的最優子結構性質,以自底向上的方式遞迴地從子問題的最優解逐步構造出整個問題的最優解。最優子結構是問題能用動態規劃演算法求解的前提。
•遞迴演算法求解問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。這種性質稱為子問題的重疊性質。
•動態規劃演算法,對每乙個子問題只解一次,而後將其解儲存在乙個**中,當再次需要解此子問題時,只是簡單地用常數時間檢視一下結果。
通常不同的子問題個數隨問題的大小呈多項式增長。因此用動態規劃演算法只需要多項式時間,從而獲得較高的解題效率
矩陣連乘 動態規劃 動態規劃解矩陣連乘問題
一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 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 ...