【问题标题】:Matrix multiplication using Dynamic Programming使用动态规划的矩阵乘法
【发布时间】:2013-01-11 20:30:15
【问题描述】:

我正在尝试了解以下使用动态编程进行矩阵乘法的算法。

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

  • mi,j = 0,如果 i = j,并且
  • mi, j = MIN, i ≤ k

算法:

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}

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

【问题讨论】:

  • 代码只是重复了数学语句。所以你是在问数学公式是从哪里来的?

标签: algorithm language-agnostic dynamic-programming


【解决方案1】:

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

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

现在,矩阵乘法是关联的,所以你可以用括号括起来

M_1 · M_2 · … · M_n

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

现在,让r_0M_1 的行数,r_iM_i 的列数(对于要定义的产品,它也必须是M_(i+1) 的行数) .

那么M_i · … · M_k是一个r_(i-1)×r_k矩阵,M_(k+1) · … · M_j是一个r_k×r_j矩阵。因此,如果乘积 M_i · … · M_j 的计算方法是首先计算乘积 M_i · … · M_kM_(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_k 之后拆分来评估M_i · … · M_j 的最低成本。

评估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 &lt; j

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

要找到产生最低成本的括号,您可以搜索最低成本数组以找到产生它的拆分[然后是两个子产品等],但最好存储信息在m 数组中以最低成本以及最低成本拆分的位置。

【讨论】:

    【解决方案2】:

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

    这个问题的关键是:计算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) em>(M3*...*Mn), ... , (M1*M2*...*Mn-1)*Mn

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2018-01-27
      相关资源
      最近更新 更多