矩陣連乘問題java版

2021-06-27 12:38:04 字數 1822 閱讀 8115

/**

* * @author yuyuntan(譚淇蔚)

*定義陣列p[i]

*p[i]的含義有兩層

*指的是:

*1. 第i個矩陣的列

*2. 第i+1個矩陣的行

* *思路:

*步驟:

*劃分階段(子問題)並刻畫

*將原問題劃分成兩個子問題。如果原問題獲得最優值。則子問題的應該也是最優的。

*將矩陣連乘積a1a2a3a4簡記為a(1:n)

*設最優計算次序在矩陣ak和ak+1之間將矩陣鏈斷開,1≤k*(a1...ak)(ak+1...an)

*考慮任意大小(起點為i,終點為j)的子問題

*將矩陣連乘積 aiai+1ai+2...aj 簡記為a(i:j) ,這裡i≤j

*考察計算a(i:j)的最優計算次序。設這個計算次序在矩陣ak和ak+1之間將矩陣鏈斷開,i≤k*(ai...ak)(ak...aj)

*計算量: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],

*設計算a(i:k)的最少數乘次數為m[i,k],計算a(k+1:j)最少數乘次數為m[k+1,j]

*最後兩個矩陣相乘即a(i:k)a(k+1,j)所做的乘法次數:p[i-1]p[k]p[j]

*m[i,j]=m[i][k]+m[k+1][j+1]+p[i-1]p[k]p[j];

* *s[i][j]中的數字k表明計算矩陣鏈a[i:j]的最佳方式應在矩陣a[k]和a[k+1]之間斷開

*即最佳的加括號方式為(a[1:k])(a[k+1,j])

*因此s[1][n]記錄的資訊可知a[1:n]的最佳的加括號方式為:

*a[1:s[1][n])(a[s[1][n]:n)

*/public class matirxmul ;

int p = ;//兩組資料做測試

//p[i]的含義有兩層指的是:

//1. 第i個矩陣的列

//2. 第i+1個矩陣的行

int m = new int [p.length+1][p.length+1];//記錄連乘次數

int s = new int [p.length+1][p.length+1];//記錄最佳分割位置

matrixchain(p,m,s);

system.out.println("矩陣計算量最小次數矩陣");

printmatrixmul(m,p.length);

system.out.println("相對於m矩陣的最優斷開位置矩陣s");

printmatrixmul(s,p.length);

system.out.println("乘法的最優次序:");

traceback(s,1,p.length-1);

} private static void printmatrixmul(int m,int n)

} } public static void matrixchain(int p,int m,int s)

for(int r = 2; r<= p.length;r++)}}

}} private static void traceback(int s, int i, int j)

}}

矩陣連乘問題

矩陣連乘問題 應用動態規劃演算法,將前面計算的重複值儲存,一次來推進下一步的計算,直到得到m 1 n 的值,為最少的乘法次數 m i j 表示計算a i.j 所需的最少數乘次數 m i j min i s i j 記錄斷開位置,也就是最少計算次數的中間位置。include using namespa...

矩陣連乘問題

由於矩陣的乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序。這中計算次序 可以用加括號的方式來確定。例如,矩陣連乘積a1a2a3a4可以有5種不同的完全加括號方式 a1 a2 a3a4 a1 a2a3 a4 a1a2 a3a4 a1 a2a3 a4 a1a2 a3 a4 矩陣a和b可乘的條...

矩陣連乘問題

矩陣連乘問題 問題分析 最優子結構性質假設n個矩陣連乘的最優加括號方案為 a1.ak ak 1.an 注 此處省略了a1.ak,ak 1.an兩個子矩陣內部的括號 則加括號方案 a1.ak 是子矩陣鏈a1.ak的最優加括號方案,ak 1.an 是ak 1.an的最優加括號方案。證明略。但可證明該假設...