多语言展示
当前在线:118今日阅读:61今日分享:18

矩阵链乘法算法讲解(JAVA)

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
工具/原料
1

eclipse-luna

2

win7_64bit

3

jdk1.7.5

方法/步骤
1

寻找最优子结构

2

构造递归解设m[i,j]为矩阵链Ai...Aj的最优解的代价,则          ┌ 0    如果i = jm[i,j] = │          └ min(i≤k<j) {m[i,k] + m[k+1,j] + Ai.row*Ak.col*Aj.col}  如果i < j

3

构建辅助表,解决重叠子问题        从第二步的递归式可以发现解的过程中会有很多重叠子问题,可以用一个nXn维的辅助表t[n][n]来保存子问题的解,表中每个元素包含2个信息,分别是最优乘积代价及其分割位置k。辅助表t[n][n]可以由2种方法构造,一种是自底向上填表构建,该方法要求按照递增的方式逐步填写子问题的解,也就是先计算长度为2的所有矩阵链的解,然后计算长度3的矩阵链,直到长度n;另一种是自顶向下填表的备忘录法,该方法将表的每个元素初始化为某特殊值(本问题中可以将最优乘积代价设置为一极大值),以表示待计算,在递归的过程中逐个填入遇到的子问题的解。        备忘录法会比自底向上法慢一个常数因子,因为前者有递归调用的代价,维护表格的开销也稍大。

5

java源代码:package ch3.dynamic.algorithm;public class MatrixChain { public static Pair matrixChainOrder(int[] p){ int n=p.length-1; int i,j,L,k,q; int[][] m = new int[n+1][n+1]; int[][] s = new int[n+1][n+1]; for(i=0;i<=n;i++){ m[i][i]=0; } for(L=2;L<=n;L++){                      ///L是子矩阵链的长度 for(i=1;i<=n-L+1;i++){              ///这个地方n也算是一个 eg 6-2+1=5   5,6 就是一组 j=i+L-1;                        ///这个地方我们可以分析得   j-L+1=i   类似于上面一行的说明解释 m[i][j]=Integer.MAX_VALUE;      ///预先设置m[i][j]等于无穷大 for(k=i;k<=j-1;k++){ q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];  ///用于暂时存储i-j子矩阵链中的求解的值 //////由于全部加括号 那么相互之间构成括号结合的两项肯定是相互靠近在一起的两项 if(q

6

运行测试成功效果:

注意事项
1

感觉不错请投票支持奥

2

这个地方学了一个下午自我感觉比较难理解,主要是很多算法思想是第一次接触

推荐信息