使用动态规划的矩阵乘法

时间:2013-01-11 20:30:15

标签: algorithm language-agnostic dynamic-programming

我试图通过动态编程来理解下面的矩阵乘法算法。

如果mi, j是评估产品Mi × ... × Mj的最低费用,那么:

  • mi,j = 0,如果i = j,
  • mi,j = MIN,i≤k< j {mi,k + mk + 1,j + ri-1rkrj},如果i<学家

算法:

for i := 1 to n do
   mi,i := 0
for length := 1 to n-1 do
   for i := 1 to n-length do
      j := i + length
      mi,j = MINi≤k<j{mi,k + mk+1,j + ri-1rkrj}

关于它如何实际运作的任何线索,或者是否有人可以指出我的一个很好的参考。

2 个答案:

答案 0 :(得分:2)

该算法找到了乘以矩阵链的最低成本。

给定带有A行和p列的矩阵q,以及带有B行和q列的矩阵r标准矩阵乘法A·B需要p*q*r次乘法 - 对于产品的每个p×r条目,qA的相应行的元素之间进行乘法运算相应的B列。

现在,矩阵乘法是关联的,因此您可以将产品括起来

M_1 · M_2 · … · M_n

如你所愿,它总会产生相同的结果。

现在,让r_0M_1r_i的行数M_i的列数(也必须是{{}的行数1}}用于定义产品。

然后M_(i+1)M_i · … · M_k矩阵,r_(i-1)×r_kM_(k+1) · … · M_j矩阵。因此,如果通过首先计算产品r_k×r_jM_i · … · M_j然后将两个结果矩阵相乘来计算乘积M_i · … · M_k,则乘法的总成本为

M_(k+1) · … · M_j

其中c_{i,k} + c_{k+1,j} + r_(i-1)×r_k×r_j 是所选择的计算c_{i,k}方式的费用(与M_i · … · M_k类似)。

现在,如果以最低成本评估两个子产品,那么通过c_{k+1,j}之后的拆分来评估M_i · … · M_j的最低成本显然会实现。

通过计算所有可能拆分的最低成本,可以找到评估M_k的最低成本,所以

M_i · … · M_j

代表m_{i,j} = min { m_{i,k} + m_{k+1,j} + r_(i-1)×r_k×r_j : i <= k < j }

然后计算完整产品的最低成本,首先计算仅涉及两个矩阵的子产品的最低成本[其中只有一个可能的分割],然后对于使用三个矩阵的子产品,我们需要只有两个矩阵的子产品的最低成本 - 这就是括号内所起作用的地方,通常会有所不同 - 然后是四等等,直到找到总计算的最低成本。

要找到产生最低成本的括号,您可以搜索最小成本数组来处理产生它的分裂[然后是两个子产品等],但最好存储信息在i < j数组中,以最小成本和最小成本分割的位置。

答案 1 :(得分:0)

我不喜欢复制和粘贴,我会保持简短并用自己的话说:

这个问题的关键点是:计算A * B * C只有两种可能的方式:A *(B * C)或(A * B)* C.类似地,计算A * B * C * D只有三种方式:A *(B * C * D),(A * B)*(C * D),(A * B * C)* D. (注意:(B * C * D)和(A * B * C)这里是一个子问题并且之前已经计算过了)

因此,计算M1 * M2 * ... Mn具有n-1种可能性:M1 (M2 * M3 * ... * Mn),(M! M2)(M3 * ... * Mn),...,(M1 * M2 * ... * Mn-1)* Mn

这就是你给定的伪代码中的内容:)