我們都學過矩陣的乘法。矩陣的乘法不滿足分配率,但是滿足結合律,因此矩陣\((a×b)×c\)和\(a×(b×c)\)的結果是一樣的,但是中間的運算量可能是不同的。
比如三個矩陣\(a=2\times3\)、\(b=3\times4\)、\(c=4\times5\),則\((a \times b)\times c\)需要運算\(2\times3\times4+2\times4\times5=64\)次,而\(a\times(b \times c)\)的運算量是\(3\times5\times5+2\times3\times5=90\)次。顯然第一次的計算方法比較節約計算量
最優矩陣鏈乘,就是在一堆矩陣相乘的情況下,找出需要運算次數最少的那個方法。通俗的說,就是給矩陣乘法加括號
我們假設有\(n\)個矩陣相乘:
\(a_1 \times a_2 \times a_3 \times ...... \times a_n\)我們可以先將這n個矩陣分為兩部分\(p\)和\(q\):
\(p=a_1 \times a_2 \times a_3 \times ...... \times a_k\)其中\(1 \leq k。矩陣鏈乘的結果就可以用\(p\times q\)來表示了,且答案為\(k\)從\(1\)到\(n-1\)迴圈一遍,運算結果最小的那個。狀態轉移方程如下:\(q=a_ \times a_ \times a_ \times ...... \times a_n\)
\(f(i,j)=min \p_p_ \}, i\leq k其中,\(f(i,j)\)表示第\(i\)個矩陣到第\(j\)個矩陣的運算量,\(k\)為中間乘號的位置,\(p\)儲存矩陣的行和列,第\(i\)行矩陣的行為\(p_\),列為\(p_i\)。
我們來用圖表演示一下這個過程。假設現在有4個矩陣\(a_\)~\(a_\),其輸入如下:
\(p=\\)輸入內容表示的含義:
矩陣\(a_1\)
\(a_2\)
\(a_3\)
\(a_4\)
行\(\times\)列
\(3\times5\)
\(5\times2\)
\(2\times1\)
\(1\times10\)
p的下標01
23|4p值3
521|10
計算過程
標著的數字是計算的順序。在花括號裡面部分的就是上文所說的\(p\),花括號外面的部分就是\(q\)
首先,根據輸入的陣列構建乙個二維陣列,這個二維陣列是用來存放計算結果的:
int n=arr.length-1;
//為了讓陣列的指標能夠和上圖對應起來,二維陣列的大小設定為n+1
int m=int[n+1][n+1];
結合上面的例子來講解。輸入的陣列一共有5個元素,表示一共有4個矩陣。所以構造的二維陣列就是5*5的。其中m[1][2]
存放的是\(a1 \times a2\)的最終結果;同理,m[1][3]
存放的是\(a1 \times a2 \times a3\)的最終結果————雖然在計算\(a1 \times a2 \times a3\)的過程中有兩種可能,但我們只取結果最小的那乙個作為最終結果儲存在陣列中。
接著,我們用乙個指標i
來標識二維陣列中的行
用指標j
標識二維陣列中的列
用t
表示鏈乘的矩陣的長度:如\(a1 \times a2 \times a3\)的長度為3,\(a1 \times a2\)的長度為2
用k
來標識乘號的位置,比如上圖表1行4列中的第二個式子中k=2
n
、i
、t
之間的關係為:
i<=n-t+1;
i
、j
、t
之間的關係為:
j=i+t-1;
k
、j
之間的關係為:
k<=j-1
根據t
的大小,我們可以寫乙個迴圈:
int i,j,k,t;
for(t=2;t<=n;t++){
for(i=1;i<=n-t+1;i++){
j=i+t-1;
m[i][j]=integer.max_value
for(k=i;i<=j-1;k++){
int temp=m[i][k]+m[k+1][j]+a[i-1]*a[k]*a[j];
if(temp完整**:
public class mcp{
public static void matrixchainproduct(int arr){
int n=arr.length-1;
int m=new int[n+1][n+1];
int i,j,k,t;
for(t=2;t<=n;t++) {
for(i=1;i<=n-t+1;i++) {
j=i+t-1;
m[i][j]=integer.max_value;
for(k=i;k<=j-1;k++) {
int temp=m[i][k]+m[k+1][j]+arr[i-1]*arr[k]*arr[j];
if(temp輸出結果:
3, 5, 2, 1,10
最少計算次數:55
2, 7, 3, 6, 10
最少計算次數:198
10, 3, 15, 12, 7, 2
最少計算次數:678
7, 2, 4, 15, 20, 5
最少計算次數:990
最優矩陣鏈乘
問題描述 乙個n m矩陣由n行m列共n m個數排列而成。兩個矩陣a和b可以相乘當且僅當a的列數等於b的行數。乙個n m的矩陣乘以乙個m p的矩陣等於乙個n p的矩陣,運算量為nmp。矩陣乘法滿足結合律,a b c可以表示成 a b c或者是a b c 兩者的運算量卻不同。例如當a 2 3 b 3 4...
最優矩陣鏈乘
題目大意 乙個n m矩陣由n行m列共n m個數排列而成。兩個矩陣a和b可以相乘當且僅當a的列數等於b的行數。乙個n m的矩陣乘以乙個m p的矩陣等於乙個n p的矩陣,運算量為nmp。矩陣乘法滿足結合律,a b c可以表示成 a b c或者是a b c 兩者的運算量卻不同。例如當a 2 3 b 3 4...
最優矩陣鏈乘 動態規劃
給定n個矩陣 a1,a2,an 其中ai與ai 1是可乘的,i 1,2 n 1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。解答 我們按照動態規劃的幾個步驟來分析 1 找出最優解的性質,刻畫其特徵結構 對於矩陣連乘問題,最優解就是找到一種計算順序,使得計算次數最少...