📜  矩阵链乘法

📅  最后修改于: 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。

可以通过两种方式将三个矩阵相乘:

  • A 1 ,(A 2 ,A 3 ):首先相乘(A 2和A 3 ),然后相乘并与A 1相加。
  • (A 1 ,A 2 ),A 3首先相乘(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)= ”DAA矩阵链乘法”

在应用斯特林公式时,我们有

c(n)=Ω ”DAA矩阵链乘法”

这表明4 n增长更快,因为它是指数函数,则n 1.5

动态规划算法的发展

  • 表征最佳解决方案的结构。
  • 递归定义最佳解决方案的值。
  • 以自下而上的方式计算最佳解决方案的价值。
  • 根据计算的信息构造最佳解决方案。

动态规划方法

令A i,j为矩阵i与j相乘的结果。可以看出,A i,j的维数为p i-1 xp j矩阵。

动态编程解决方案涉及将问题分解为多个子问题,可以将这些子问题的解决方案结合起来以解决全局问题。

在最大括号内,我们将两个矩阵相乘

因此,我们剩下两个问题:

  • 如何分割矩阵序列?
  • 如何在子序列A 1 …… k和A k + 1 … n中加上括号?

找到“ k”的最佳值的第一个问题的一个可能答案是,检查“ k”的所有可能选择,并考虑其中的最佳选择。但是可以观察到,检查所有可能性将导致总可能性呈指数增长。还可以注意到,仅存在O(n 2 )个不同的矩阵序列,以这种方式无法达到指数增长。

步骤1:最优括号的结构:我们在动态范例中的第一步是找到最优子结构,然后使用它来构造从最优解到子问题的最优解。

设A i …. j ,其中i≤j表示评估乘积所得的矩阵

A i A i + 1 …. A j

如果我置于I A I + 1 ……第j必须拆分是A k和A K + 1之间的乘积在范围I≤ķ≤Ĵ一些整数k。也就是说,对于k的某个值,我们首先计算矩阵A i … k和A k + 1..j ,然后将它们相乘以产生最终乘积A i..j 。计算A i …. k的成本加上计算A k + 1 …. 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和A k + 1之间划分,其中i≤k≤j。然后,m [i,j]等于计算子产品A i …. k和A k + 1 …. j的最小成本+将它们相乘的成本。我们知道A i的维数为p i-1 xp i ,因此计算乘积A i …. k和A k + 1 …. j需要p i-1 p k p j标量乘法,我们得到

“ 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使得