动态规划-矩阵连乘问题

来源:互联网 发布:开淘宝店可以兼职吗 编辑:程序博客网 时间:2024/05/01 22:24

给定n个矩阵,其中与 是可乘的,   。考察这n个矩阵的连乘积   由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。

若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积

算法复杂度分析:

对于n个矩阵的连乘积,设其不同的计算次序为P(n)

由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下


将矩阵连乘积  

将矩阵连乘积简记为A[i:j],这里ij         

考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵

AkAk+1之间将矩阵链断开,i≤k<j,则其相应完全

加括号方式为

计算量: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],则原问题的最优值为m[1,n]  

i=j时,A[i:j]=Ai,因此,m[i,i]=0i=1,2,…,n

i<j时,

这里的维数为     

可以递归地定义m[i,j]

k的位置只有j-i可能   

在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征。

用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法

<pre name="code" class="cpp">void MatrixChain(int *p,int n,int **m,int **s){        for (int i = 1; i <= n; i++) m[i][i] = 0;        for (int r = 2; r <= n; r++)           for (int i = 1; i <= n - r+1; i++) {              int j=i+r-1;              m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j];              s[i][j] = i;              for (int k = i+1; k < j; k++) {                 int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];                 if (t < m[i][j]) { m[i][j] = t; s[i][j] = k;}              }          }}


算法复杂度分析:

算法matrixChain的主要计算量取决于算法中对rik3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)


矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。
在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。
利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。

递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。
动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。
通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率
1 0
原创粉丝点击