矩阵乘法基础
对于 p × q p\times q p×q矩阵 A A A和 q × r q\times r q×r矩阵 B B B, A × B A\times B A×B需要 p × q × r p\times q\times r p×q×r次乘法计算(模拟矩阵乘法过程易得)
问题描述
矩阵乘法满足结合律,我们可以通过加括号的方式改变矩阵乘法的计算次序。问何种计算次序(加括号的方式),使得计算矩阵连乘积所需的数乘次数最少。
穷举法复杂度分析
穷举法递推关系如下:
贪心策略
沿着先把大维数消除,达到最少乘法运算次数的贪心策略是错误的,例题中 A 4 A 5 A_4A_5 A4A5没有结合起来先运算说明了这一点。
动态规划求解
将矩阵连乘积
A
i
A
i
+
1
…
A
j
A_iA_{i+1}\dots A_j
AiAi+1…Aj简记为
A
[
i
:
j
]
A[i:j]
A[i:j],这里
i
≤
j
i\leq j
i≤j
我们设其中一种加括号方式为:
(
A
i
A
i
+
1
…
A
k
)
(
A
k
+
1
A
k
+
2
…
A
j
)
(A_iA_{i+1}\dots A_k)(A_{k+1}A_{k+2}\dots A_j)
(AiAi+1…Ak)(Ak+1Ak+2…Aj)
则该加括号方式的计算量为
两种情况讨论
- 当 i = = j i == j i==j时, A [ i : j ] = A i A[i:j] =A_i A[i:j]=Ai,因此, m [ i , i ] = 0 , i = 1 , 2 , … , n m[i,i] = 0,i=1,2,\dots,n m[i,i]=0,i=1,2,…,n
- 当 i < j i<j i<j时, m [ i , j ] = m [ i , k ] + m [ k + 1 , j ] + p i − 1 p k p j m[i,j] = m[i,k]+m[k+1,j]+p_{i-1}p_kp_j m[i,j]=m[i,k]+m[k+1,j]+pi−1pkpj,其中 A i A_i Ai的维数为 p i − 1 × p i p_{i-1}\times p_i pi−1×pi
根据以上讨论,得到下列递推式:
求解最优解(由短序列到长序列,枚举
k
k
k所在位置的过程)
计算次序如下图所示:
求解最优加括号方案
在每次计算最优解表格的基础上,额外开一个相同大小的表格记录该最优解对应的
k
k
k值的位置,
k
k
k为
A
[
i
:
k
]
A[i:k]
A[i:k]中的边界
k
k
k值
例题如下:
复杂度分析
- 时间复杂度:因为要枚举序列长度(从短序列到长序列),枚举序列起点(不用枚举序列终点,因为起点和长度确定了,终点也就确定了),枚举 k k k值,一共3层枚举。因此计算时间上界为 O ( n 3 ) O(n^3) O(n3)
- 空间复杂度: m [ i ] [ j ] m[i][j] m[i][j]为一个2维表格,因此空间复杂度为 O ( n 2 ) O(n^2) O(n2)