最優矩陣鏈乘

2022-08-01 04:24:11 字數 3218 閱讀 8196

我們都學過矩陣的乘法。矩陣的乘法不滿足分配率,但是滿足結合律,因此矩陣\((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\)

\(q=a_ \times a_ \times a_ \times ...... \times a_n\)

其中\(1 \leq k。矩陣鏈乘的結果就可以用\(p\times q\)來表示了,且答案為\(k\)從\(1\)到\(n-1\)迴圈一遍,運算結果最小的那個。狀態轉移方程如下:

\(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

nit之間的關係為:

i<=n-t+1;
ijt之間的關係為:

j=i+t-1;
kj之間的關係為:

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 找出最優解的性質,刻畫其特徵結構 對於矩陣連乘問題,最優解就是找到一種計算順序,使得計算次數最少...