矩陣的連乘問題也可以像我們之前講到過的矩陣的快速冪一樣來進行一下優化,也就是減少我們乘的次數。
假如我們現在有6個矩陣進行連乘,如a1
(30∗35
) ,a2
(35∗15
) ,a3
(15∗5
) ,a4
(5∗10
) ,a5
(10∗20
) ,a6
(20∗25
) ,這樣的6個矩陣進行連乘的話,如果按照我們普通的運算方式那麼我們需要進行運算次數為:
40500
,我們可以用以下的**來進行驗證:
var result = 0;
for (var i = 2; i
< len; i++)
之前我們了解了矩陣的乘法滿足結合律,所以我們利用這一點,也可以來對我們的矩陣連乘進行優化,所以就引出了我們下面的這種方法。
在這裡不詳細的去展開這種方法的由來,以及為什麼這麼做,因為很多的教科書上都會有這個演算法,總體來將就是建立一張自底向上的表,這張表的右上角也就是我們的最優次數,然後每次計算完我們此時的最優值,我們將其儲存起來,方便與下回可以直接呼叫。假定我們的這張表(二維陣列)的名字叫做
我們的p
,中儲存的就是我們個個矩陣的行數與列數,p.
len−
1 就是我們的矩陣個數,如我所舉的那個例子,也就是那6個矩陣,由它們構成的
p 陣列就為:var p = [30, 35, 15, 5, 10, 20, 25];
,了解了
p的構成方式,再來看一下乙個具體的例子,也就是在計算我們的m[
2][5
] 時應該怎麼樣去計算?(m[
2][5
] 就是求得a2
∗a3∗
a4∗a
5 的最少次數)
演算法流程:
我們首先將諸如:a1
∗a2 ,a2
∗a3 ,a3
∗a4 等計算出來,此時我們的計算規則較為簡單,並不需要進行值的大小比較,因為兩個矩陣相乘的次數是固定的。
我們進行迴圈的流程大概是:
經過我們的一系列迴圈,我們最終得出的表的右上角就是我們的最優次數,也就是m[
1][n
] 。例子最終形成的表為:
我們的m[i
][j]
中的i,
j 分別代表的為起始的矩陣下標與終止矩陣下標。
知道這個規則後我們就可以來寫我們這個演算法的**了(這裡並沒有封裝成方法)
// 生成二維陣列
var burntwoarr = function (row, col)
}return result;
};// 變數宣告
var p = [30,35,15,5,10,20,25],
len = p.length,
m = burntwoarr(len, len);
// 大迴圈,每次計算對角線
for (var r =2; r < len; r++) }}
}console.log(m[1][len -1]); // 15125
但是這樣發現我們寫出的**貌似沒有什麼實際的作用,因為這個**僅僅能夠計算出最少的次數,這在現實中貌似毫無作用,我們還需要考慮的就是我們應該怎樣的結合矩陣,使得次數達到最少。於是我們需要引入乙個po
s 陣列來確定如何結合?
我們只需要簡單的更改一下我們的**:
var p = [30,35,15,5,10,20,25],
len = p.length,
m = burntwoarr(len, len),
pos = burntwoarr(len, len);
// 大迴圈,每次計算對角線
for (var r =2; r < len; r++) }}
}console.log(m[1][len -1]); // 15125
console.log(pos[1][len -1]); // 3
為了方便回溯回去,找到我們最優的方案,我們可以新增乙個函式
function traceback (pos, left, right)
traceback
函式就可以起到這個作用。
traceback(pos, 1, len - 1);
//a2 * a2 ,a3 * a3
//a1 * a1 ,a2 * a3
//a4 * a4 ,a5 * a5
//a4 * a5 ,a6 * a6
//a1 * a3 ,a4 * a6
矩陣連乘 動態規劃 動態規劃解矩陣連乘問題
一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 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 ...