動態規劃之矩陣鏈相乘

2021-06-22 09:38:32 字數 1441 閱讀 4478

在看這張之前,最好看看我寫的

動態規劃詳解

,裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。

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

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

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

幾個前提概念

使用動態規劃的四個步驟來分析:

①.描述最優解的結構。

書中直接就說利用ai...aj的乘積矩陣來描述,跳躍性有點大,不仔細分析,還不知道裡面的水有多深。那現在來**一下。

還是按照正常思路,從總數n開始劃分,總的矩陣相乘代價最小,兩個大矩陣的劃分有n-1種可能,因此可以任意選擇乙個i值來分析(有的問題只能由n到n-1,有一定限制,所以第一步劃分時要警惕一下)。

選擇乙個劃分結點i,分成兩個矩陣相乘,a1...ai和ai+1...an。兩個子矩陣都不能被對方代替,如果不好看出遞迴方程,可以再一次劃分,將a1...ai劃分成a1...aj和aj+1...ai。從這裡看出,子矩陣的左右範圍是變化的,不能通過以為陣列來描述,這時就考慮用二維陣列(一般備份儲存空間都是陣列來表示的,一維二維居多,可嘗試)。

②.遞迴定義最優解的值。

既然用二維陣列,則m[i,j]表示ai...aj的乘積。當選取中間點k來劃分時,m[i,j] = m[i,k]+m[k+1,j]+分割代價。ai...ak的乘積為行數和列數為pi-1和pk,那麼劃分後子陣列相乘的代價為pi-1 * pk *pj。所以m[i,j] = m[i,k]+m[k+1,j]+pi-1 * pk *pj。

但要對下標變數有限制,表示式中i<=k

③.按自底而上的方式計算最優解的值。

現在的問題是找到備份陣列,在第一步的分析中已經闡述了這個問題。當遞迴表示式中陣列m換成函式時,就是乙個暴力求解的遞迴演算法。這裡設定二維陣列m[1...n,1...n]來儲存資料。

但是如何實現自底向上的遞迴?由於m[i,j]依賴於m[i,k]和m[k+1,j],而k是一直變化的。依賴於長度小於j-i+1的資料。最小是兩個相鄰的矩陣相乘。因此,這裡以長度為主變數來實現自底向上:l←2-n。

④.由計算出的結果創造乙個最優解。

通常重構最優解資訊儲存的陣列與備份陣列一樣,此處為s[n,n]。s[i,j]儲存m[i,j] = m[i,k]+m[k+1,j]+

pi-1 * pk *pj表示式中的分割點k的取值。這個遞迴方程很典型,方程中就有關分割點的資訊,當更新m[i,j]的時候,同步更新s[i,j]的值。

偽**:

matrix-chain-order(p)

}

動態規劃之矩陣鏈相乘

題目 n個矩陣連乘,求最少的乘法運算次數以及結合方式 假設矩陣a為r1 r2,矩陣b為r2 r3,所以m a b r1 r2 r3。當有多個矩陣相乘的時候,矩陣以不同的方式結合的時候其運算次數是不同的。例如 m m1 m2 m3 m4 5 20 20 50 50 1 1 100 m1 m2 m3 m...

動態規劃 矩陣鏈相乘

實驗題目3 矩陣鏈乘法 11.1日實驗 要求 1 設計暴力法,產生所有矩陣鏈相乘以組合情況,寫出 並除錯成功 2 設計動態規劃演算法,寫出 尋找最小乘法次數和對應相乘的順序,並除錯成功 3 隨機產生由10個矩陣,測試 2 的 輸出最小乘法次數和相乘的順序。from random import def...

動態規劃 矩陣鏈相乘

設s1,a2,a3,an為n個矩陣的序列,其中ai為pi 1 pi階矩陣,這個矩陣鏈的輸入用向量p 給出。給定向量p,確定一種乘法次序,使得基本運算的總次數達到最小。我才用的矩陣為 a1 30 35 a2 35 15 a3 15 5 a4 5 10 a5 10 20 a6 20 25 那麼得到的p ...