算法分析与设计 分治算法 矩阵乘法 矩阵乘法 问题描述 两个 n×nn \times nn×n 的矩阵 AAA 和 BBB 相乘,通常算法时间复杂度为 O(n3)O(n^3)O(n3)。是否存在分治算法可以降低时间复杂度? 问题分析 将 AAA 和 BBB 分成 4 个大小为 n2×n2\dfrac{n}{2} \times \dfrac{n}{2}2n×2n 的子矩阵相乘。 [C11C12C21C22]=[A11A12A21A22][B11B12B21B22] \begin{array}{l} {\left[\begin{array}{ll} C_{11} & C_{12} \\ C_{21} & C_{22} \end{array}\right]=\left[\begin{array}{ll} A_{11} & A_{12} \\ A_{21} & A_{22} \end{array}\right]\left[\begin{array}{ll} B_{11} & B_{12} \\ B_{21} & B_{22} \end{array}\right]} \end{array} [C11C21C12C22]=[A11A21A12A22][B11B21B12B22]需要计算的子问题包括 8 个小矩阵乘法以及 4 个矩阵加法,时间复杂度为: T(n)=8T(n2)+Θ(n2) \begin{aligned} T(n) = 8 T\left( \dfrac{n}{2} \right) + \Theta(n^2) \end{aligned} T(n)=8T(2n)+Θ(n2)即使如此,计算得到的时间复杂度没有得到改善,仍为 T(n3)T(n^3)T(n3)。我们可令 M1=A11(B12−B22)M2=(A11+A12)B22M3=(A21+A22)B11M4=A22(B21−B11)M5=(A11+A22)(B11+B22)M6=(A12−A22)(B21+B22)M7=(A11−A21)(B11+B12) \begin{aligned} M_{1} &= A_{11}(B_{12} - B_{22}) \\ M_{2} &= (A_{11} + A_{12})B_{22} \\ M_{3} &= (A_{21} + A_{22})B_{11} \\ M_{4} &= A_{22}(B_{21} - B_{11}) \\ M_{5} &= (A_{11} + A_{22})(B_{11} + B_{22}) \\ M_{6} &= (A_{12} - A_{22})(B_{21} + B_{22}) \\ M_{7} &= (A_{11} - A_{21})(B_{11} + B_{12}) \\ \end{aligned} M1M2M3M4M5M6M7=A11(B12−B22)=(A11+A12)B22=(A21+A22)B11=A22(B21−B11)=(A11+A22)(B11+B22)=(A12−A22)(B21+B22)=(A11−A21)(B11+B12)于是 C11=M5+M4−M2+M6C12=M1+M2C21=M3+M4C22=M5+M1−M3−M7 \begin{aligned} C_{11} = M_{5} + M_{4} - M_{2} + M_{6} \\ C_{12} = M_{1} + M_{2} \\ C_{21} = M_{3} + M_{4} \\ C_{22} = M_{5} + M_{1} - M_{3} - M_{7} \end{aligned} C11=M5+M4−M2+M6C12=M1+M2C21=M3+M4C22=M5+M1−M3−M7这样就把 8 个矩阵相乘转变成 7 个矩阵相乘,时间复杂度降低为 T(n)=7T(n2)+Θ(n2)=Θ(nlog27) \begin{aligned} T(n) &= 7 T\left( \dfrac{n}{2} \right) + \Theta(n^2) \\ &= \Theta\left(n^{\log_{2}{7}}\right) \end{aligned} T(n)=7T(2n)+Θ(n2)=Θ(nlog27) 大整数乘法快速排序