该算法找到乘以矩阵链的最低成本。
给定一个A
具有p
行和q
列的矩阵B
以及具有q
行和r
列的矩阵,标准矩阵乘法A·B
进行p*q*r
乘法 - 对于乘积的每个p×r
条目,q
对应行的元素A
和对应的列的元素之间的乘法B
。
现在,矩阵乘法是关联的,所以你可以用括号括起来
M_1 · M_2 · … · M_n
如您所愿,它总是会产生相同的结果。
现在,让r_0
的行数M_1
和r_i
列数M_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_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
.
然后计算完整产品的最小成本,首先计算仅涉及两个矩阵的子产品的最小成本[其中只有一个可能的拆分],然后计算使用三个矩阵的子产品的最小成本,为此我们需要最小成本只有两个矩阵的子乘积——这就是括号起作用的地方,通常会产生影响——然后是四个等,直到找到总计算的最小成本。
要找到产生最低成本的括号,您可以搜索最小成本数组以找到产生它的拆分[然后是两个子产品等],但最好存储在哪里的信息以最低成本与m
阵列中的最低成本分开。