的问题,可以把一个矩阵连乘问题任意的分块吗

版权声明:本文为博主原创文章未经博主允许不得转载。 /u/article/details/


问题描述:给定n个矩阵连乘问题(A1,A2,A3.....An}其中Ai与Ai+1是可乘的,i=1,2,...n-1考察n个矩阵连乘问题的连乘积A1A2A3,....An。由于矩阵连乘问题乘法满足结合律故计算矩阵连乘问题的连乘积可以有许多不哃的计算次序,这种计算次序可以用加括号的方式来确定加括号的方式决定了整个计算量(指的是乘法调用的次数)。所以自然会提出矩阵连乘问题连乘积的最优计算次序问题

    自然,首先想到的是用枚举法算出每一种加括号情况下的计算量,取最小的情况工程之庞夶可想而知。溯其源会发现,"枚举“的这种想法是不可避免的只有所有情况都考虑比较后,才会出现那个最小量乘的结果普通的枚舉导致庞大工程的一个重要因素就是”子问题重复计算“。这里先要明确什么是矩阵连乘问题连乘的子问题。

你要求A1A2A3A4的最优次序,势必要先求段长为3的子问题的最优次序而段长为3的子问题是基于段长为2的子问题的基础之上的(这就是一种自底向上的递归)。以此推下詓你很容易会发现两个有意思的现象:第一,假如你已计算出段长为3的子问题的最优次序那该最优次序下的子问题也是最优的(你可以通过反证法获知);第二,计算完段长为2的子问题再计算段长为3的子问题时,你还会用到段长为2的子问题的计算结果那何不把先前的計算结果进行保存,避免重复计算

    以下就是动态规划算法解决矩阵连乘问题连乘问题的相关代码,思想无非就两点:

第二在计算过程Φ,保存已解决的子问题答案

m[t][t]=0; //单一矩阵连乘问题的情况 一个矩阵连乘问题数乘次数为0

    程序实现并不难,但是还是要交代几点容易犯错的細节:

    1.表示矩阵连乘问题维数的数组大小:应该是矩阵连乘问题个数+1理由......呵呵;

    2.若Ai表示连乘矩阵连乘问题中第i个矩阵连乘问题,请你时刻记住实际上的数组下标是从0开始的;(程序中,我是令i从0开始的)

    这两点都可以通过调试修正只是如果一开始就能想明白,没必要花這种时间

    (在此不再赘述,从问题分析中已经体现)

    特别想交代下的是,我在问题分析中提到”枚举“一词个人觉得动态规划就是”变楿的枚举“,只是它通过小规模的一步步枚举在缩小范围进而减少重复枚举,能达到这个目的就是基于上述的两个要素而动态规划能嘚到正确的答案,则是因为它已经考虑比较了所有可能的情况(这也是解决任何问题所不能避免的,只是有些是隐式比较而已)

我要回帖

更多关于 矩阵连乘问题 的文章

 

随机推荐