男朋友决定每天写进blog一个算法课上的示例,我不想落后,决定一起开始这个工程啦(#^.^#)。第一个当然是我比较感兴趣的矩阵连乘求最优的算法了。
1 | 输入:<A1,A2, ..., An>, Ai是(pi -1) * pi矩阵 |
动态规划
一般给出的是动态规划算法,使用动态规划,是因为矩阵连乘可以分解为若干个具有重叠性的子问题:
我们可以递归的求解每一种方式的代价,进而通过比较得到乘法次数最少的方案即最优解:
$$
A_i\times A_{i+1}\times…\times A_j = \begin{cases}(A_i) & \times(A_{i+1}\times…\times A_j)\(A_i\times A_{i+1})&\times(A_{i+2}\times…\times A_j)\…\(A_i\times…\times A_k)\times(A_{k+1}\times…\times A_j)\…\(A_i\times…\times A_{j-1})\times(A_j)\end{cases}
$$
考虑到所有的k,优化解的代价方程为:
$m[i, j]= 0 , if: i=j $
$m[i, j]= min_{i<k<j}{ m[i, k]+m[k+1, j]+p_{i-1}p_kp_j} , if : i<j$
由此,我们可以自底向上的递归求解该问题,第一步:求m[1,1],接着可求解m[2,2]、m[1,2],然后求m[3,3]、m[2,3]、m[1,3]、、、求解过程中,动态的求解出了每一步的最优解,最终的结果m[1,n]即是我们要找的最优解:
算法伪代码
1 | FOR i=1 TO n DO |
时间复杂度:O($n^3$),空间复杂度O($n^2$)
代码示例:
1 | /** |
贪心算法
贪心算法循环从连乘的矩阵中选出两个相邻矩阵乘法次数最小的优先进行乘法运算,并将运算结果更新到连乘的矩阵中,直到最后只有一个矩阵为止。
需要注意的是,贪心算法每次找到局部最优解,但结果不一定是全局最优解。
代码示例
1 | /** |