📅  最后修改于: 2020-12-10 06:30:34             🧑  作者: Mango
这是动态编程下的一种方法,其中以前的输出用作下一个的输入。
在这里,Chain表示一个矩阵的列等于第二个矩阵的行(总是)。
一般来说:
然后
给定以下矩阵{A 1 ,A 2 ,A 3 ,… A n },我们必须执行矩阵乘法,这可以通过一系列矩阵乘法来实现
矩阵乘法运算本质上是关联的,而是可交换的。这样,我们的意思是我们必须遵循上述矩阵顺序进行乘法运算,但是我们可以根据需要随意在上面的括号中加上括号。
通常,对于1≤i≤p和1≤j≤r
可以看到,矩阵“ C”中的总条目为“ pr”,因为矩阵的维数为pxr。此外,每个条目都需要O(q)次来计算,因此计算矩阵“ C”的所有可能条目所需的总时间'是'A'和'B'的乘积,与尺寸pq r的乘积成比例。
还应注意,我们可以通过对括号重新排序来节省操作数。
例1:让我们有3个矩阵,分别是(1 x 100),(100 x 5)和(5 x 50)的A 1 ,A 2 ,A 3。
可以通过两种方式将三个矩阵相乘:
情况1中的标量乘法数将为:
(100 x 5 x 50) + (10 x 100 x 50) = 25000 + 50000 = 75000
情况2中的标量乘法数将为:
(100 x 10 x 5) + (10 x 5 x 50) = 5000 + 2500 = 7500
为了找到最佳的计算乘积的方法,我们可以简单地用各种可能的方式对表达式加上括号,并在每次需要多少个标量乘法时计数。
矩阵链乘法问题可以表述为“找到要相乘的矩阵链的最佳括号,以使标量乘法的数量最小化”。
对矩阵加括号的方式数目:
括号内有很多方法可以使用这些矩阵。如果有n个项,则可以通过(n-1)种方式放置最外面的一对括号。
可以看出,在分割第k个矩阵之后,我们剩下两个带括号的矩阵序列:一个由“ k”个矩阵组成,另一个由“ nk”个矩阵组成。
现在有左括号括起来的“ L”方式和右子括号括起来的“ R”方式,那么Total将是LR:
同样p(n)= c(n-1),其中c(n)是第n个Catalon数
c(n)=
在应用斯特林公式时,我们有
c(n)=Ω
这表明4 n增长更快,因为它是指数函数,则n 1.5 。
令A i,j为矩阵i与j相乘的结果。可以看出,A i,j的维数为p i-1 xp j矩阵。
动态编程解决方案涉及将问题分解为多个子问题,可以将这些子问题的解决方案结合起来以解决全局问题。
在最大括号内,我们将两个矩阵相乘
因此,我们剩下两个问题:
找到“ k”的最佳值的第一个问题的一个可能答案是,检查“ k”的所有可能选择,并考虑其中的最佳选择。但是可以观察到,检查所有可能性将导致总可能性呈指数增长。还可以注意到,仅存在O(n 2 )个不同的矩阵序列,以这种方式无法达到指数增长。
步骤1:最优括号的结构:我们在动态范例中的第一步是找到最优子结构,然后使用它来构造从最优解到子问题的最优解。
设A i …. j ,其中i≤j表示评估乘积所得的矩阵
A i A i + 1 …. A j
如果我置于
步骤2:递归解:令m [i,j]是计算矩阵A i …. j所需的最小标量乘法数。
如果i = j,则该链仅由一个矩阵A i …. i = A i组成,因此不需要标量乘法来计算乘积。因此,对于i = 1、2、3 … n,m [i,j] = 0。
如果i
“ k”只有(j-1)个可能的值,即k = i,i + 1 ….. j-1。由于最佳括号必须为“ k”使用这些值之一,因此我们只需检查所有值即可找到最佳值。
这样圆括号了产品的最小代价A I A I + 1 ……第j变得
为了构造最优解,让我们将s [i,j]定义为'k'的值,在该值处我们可以对乘积A i A i + 1 ….. A j进行分割以获得最优括号,即s [i,j] = k使得