gitbook-way-to-algorithm
  • Introduction
  • Preface 前言
  • Content 目录
  • MathSymbolTable 数学符号表
  • Chapter-1 BasicKnowledge 第1章 基础知识
    • TimeComplexity 时间复杂度
    • Recursion 递归式
  • Chapter-2 Sort 第2章 排序
    • InsertSort 插入排序
    • BubbleSort 冒泡排序
    • QuickSort 快速排序
    • MergeSort 归并排序
  • Chapter-3 Search 第3章 搜索
    • BinarySearch 二分查找法(折半查找法)
    • AdditionMultiplicationPrinciple 加法乘法原理
    • BruteForce 暴力枚举
    • Recursion 递归
    • BreadthFirstSearch 广度优先搜索
    • BidirectionalBreadthSearch 双向广度搜索
    • AStarSearch A*搜索
    • DancingLink 舞蹈链
  • Chapter-4 DataStructure 第4章 数据结构
    • DisjointSet 并查集
    • PrefixTree(TrieTree) 前缀树
    • LeftistTree(LeftistHeap) 左偏树(左偏堆)
    • SegmentTree 线段树
    • FenwickTree(BinaryIndexedTree) 树状数组
    • BinarySearchTree 二叉查找树
    • AVLTree AVL平衡树
    • RedBlackTree 红黑树
    • SkipList 跳跃表
    • BPlusTree B+树
    • BMinusTree B-树
  • Chapter-5 DynamicProgramming 第5章 动态规划
    • Section-1 LinearDP 第1节 线性动规
      • LongestCommonSubsequence 最长公共子序列
      • LongestIncreasingSubsequence 最长递增子序列
      • BidirectionalSubsequence 双向子序列
      • MaximumContinuousSubsequenceSum 最大连续子序列和
      • LongestPalindromicSubsequence 最长回文子序列
    • Section-2 BagDP 第2节 背包问题
      • 01-Bag 01背包
      • CompleteBag 完全背包
      • TwoDimensionBag 二维背包
    • Section-3 RegionalDP 第3节 区域动规
      • MinimumMergeCost - 最小合并代价
      • UniquePath 唯一路径
      • TrianglePath 三角形路径
    • Section-4 TreeDP 第4节 树形动规
      • MaximumBinaryTree 最大二叉树
      • MaxMultipleTree 最大多叉树
      • MaximumBinaryTreeRadiusSum 最大二叉树和
  • Chapter-6 GraphTheory 第6章 图论
    • Section-1 Traverse 第1节 遍历
      • DepthFirstSearch 深度优先搜索
      • BreadthFirstSearch 广度优先搜索
      • TopologicalSort 拓扑排序
      • EulerCycle 欧拉回路
    • Section-2 MinSpanningTree 第2节 最小生成树
      • Kruskal Kruskal算法
      • Prim Prim算法
    • Section-3 ShortestPath 第3节 最短路径
      • BellmanFord BellmanFord算法
      • Dijkstra Dijkstra算法
      • FloydWarshall FloydWarshall算法
      • DifferentConstraints 差分约束
    • Section-4 StronglyConnectedComponents 第4节 强连通分支
      • Kosaraju Kosaraju算法
      • Tarjan Tarjan算法
      • 2-SAT 2-SAT问题
    • Section-5 NetworkFlow 第5节 网络流
      • EdmondsKarp EdmondsKarp算法(最短路径增广算法)
      • PushRelabel 压入与重标记算法
      • Dinic - Dinic算法
      • MinimumCostFlow - 最小费用流
      • MultipleSourceMultipleSinkMaxflow - 多源点多汇点最大流
    • Section-6 BinaryMatch 第6节 二分匹配
      • Hungarian 匈牙利算法
      • HopcroftKarp Hopcroft-Karp算法
      • MatchToMaxflow 二分匹配转化为最大流
      • KuhnMunkres Kuhn-Munkres算法
      • Introduction-Domination,Independent,Covering,Clique 介绍支配集、独立集、覆盖集和团
      • WeightedCoveringAndIndependentSet 最小点权覆盖和最大点权独立集
      • MinimumDisjointPathCovering 最小不相交路径覆盖
      • MinimumJointPathCovering 最小可相交路径覆盖
      • Coloring 染色问题
  • Chapter-7 CombinatorialMathematics 第7章 组合数学
    • FullPermutation 全排列
    • Combination 组合
    • Permutation 排列
    • PermutationGroup 置换群
  • Chapter-8 NumberTheory 第8章 数论
    • PrimeSieve 素数筛法
    • GreatestCommonDivisor 最大公约数
    • Euclid 欧几里得算法
    • ExtendedEuclid 扩展欧几里得算法
    • ChineseRemainerTheorem 中国剩余定理
    • ModularExponentiation 模幂运算
  • Chapter-9 LinearAlgebra 第9章 线性代数
    • Section-1 Matrix 第1节 矩阵
      • Strassen Strassen算法
      • GaussElimination 高斯消元法
      • LUP LUP分解
      • InverseMatrix 矩阵求逆
    • Section-2 LinearProgramming 第2节 线性规划
      • Simplex 单纯形算法
      • Dinkelback Dinkelback算法
  • Chapter-10 AnalyticGeometry 第10章 解析几何
    • Section-1 Polygon 第1节 多边形
      • Cross 向量叉积
      • SegmentIntersection 线段相交
      • Sweeping 扫除算法
      • ConvexPolygonArea 凸多边形面积
      • ConvexPolygonGravityCenter 凸多边形重心
      • NearestNeighbor 最近点对
    • Section-2 ConvexHull 第2节 凸包
      • GrahamScan Graham扫描算法
      • QuickHull 快速凸包算法
      • RotatingCalipers 旋转卡壳
  • Chapter-11 PatternMatch 第11章 文本匹配
    • SimpleMatch 简单匹配
    • AhoCorasickAutomata AC自动机
    • KnuthMorrisPratt KMP匹配算法
    • RabinKarp RabinKarp算法
    • BoyerMoore BoyerMoore算法
  • Chapter-12 GameTheory 第12章 博弈论
    • BashGame 巴什博弈
    • WythoffGame 威佐夫博弈
    • NimGame 尼姆博弈
Powered by GitBook
On this page
  • 问题
  • 行列式
  • 矩阵
  • Strassen算法
  • 数学复习全书(2013年李永乐李正元考研数学 数学一) - 第二篇 线性代数
  • 源码
  • 测试
  1. Chapter-9 LinearAlgebra 第9章 线性代数
  2. Section-1 Matrix 第1节 矩阵

Strassen Strassen算法

问题

用Strassen算法计算两个nnn阶矩阵相乘C=A×BC = A \times BC=A×B。

行列式

nnn阶行列式(Determinant):

∣a11a12⋯a1na21a22⋯a2n⋮⋮⋮an1an2⋯ann∣\begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix}​a11​a21​⋮an1​​a12​a22​⋮an2​​⋯⋯⋯​a1n​a2n​⋮ann​​​

表示nnn个元素的乘积

a1j1a2j2⋯anjna_{1 j_{1}} a_{2 j_{2}} \cdots a_{n j_{n}}a1j1​​a2j2​​⋯anjn​​

的代数和。其中j1,j2,…,jnj_{1}, j_{2}, \dots, j_{n}j1​,j2​,…,jn​是1,2,…,n1, 2, \dots, n1,2,…,n的一个排列。当j1,j2,…,jnj_{1}, j_{2}, \dots, j_{n}j1​,j2​,…,jn​是奇排列时该项带负号,当j1,j2,…,jnj_{1}, j_{2}, \dots, j_{n}j1​,j2​,…,jn​是偶排列时该项带正号。对于元素ajpjqa_{j_{p} j_{q}}ajp​jq​​下标的两个数字,若1≤p<q≤n1 \leq p \lt q \leq n1≤p<q≤n且jp>jqj_{p} \gt j_{q}jp​>jq​则称这两个有序的数[jp,jq][ j_{p}, j_{q} ][jp​,jq​]是逆序对。逆序对的数量称为逆序对数。若a1j1a2j2⋯anjna_{1 j_{1}} a_{2 j_{2}} \cdots a_{n j_{n}}a1j1​​a2j2​​⋯anjn​​中所有元素下标的逆序对数为偶数,则称排列j1,j2,…,jnj_{1}, j_{2}, \dots, j_{n}j1​,j2​,…,jn​为偶排列;否则为奇排列。

即

∣a11a12⋯a1na21a22⋯a2n⋮⋮⋮an1an2⋯ann∣=∑j1j2⋯jn(−1)τ(j1j2⋯jn)a1j1a2j2⋯anjn\begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \quad & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} = \sum_{j_{1} j_{2} \cdots j_{n}} (-1)^{ \tau (j_{1} j_{2} \cdots j_{n}) } a_{1 j_{1}} a_{2 j_{2}} \cdots a_{n j_{n}}​a11​a21​⋮an1​​a12​a22​⋮an2​​⋯⋯⋯​a1n​a2n​⋮ann​​​=j1​j2​⋯jn​∑​(−1)τ(j1​j2​⋯jn​)a1j1​​a2j2​​⋯anjn​​

其中τ(j1j2⋯jn)\tau (j_{1} j_{2} \cdots j_{n})τ(j1​j2​⋯jn​)是行列式的逆序数,∑j1j2⋯jn\sum_{j_{1} j_{2} \cdots j_{n}}∑j1​j2​⋯jn​​表示对所有nnn阶排列求和,该式称为nnn阶行列式的完全展开式。

特别的222阶行列式和333阶行列式的完全展开式分别为

∣abcd∣=a⋅d−b⋅c\begin{vmatrix} a & b \\ c & d \end{vmatrix} = a \cdot d - b \cdot c​ac​bd​​=a⋅d−b⋅c
∣a11a12a13a21a22a23a31a32a33∣=a11a22a33+a12a23a31+a13a21a32−a13a22a31−a12a21a33−a11a23a32\begin{vmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{vmatrix} = a_{11} a_{22} a_{33} + a_{12} a_{23} a_{31} + a_{13} a_{21} a_{32} - a_{13} a_{22} a_{31} - a_{12} a_{21} a_{33} - a_{11} a_{23} a_{32}​a11​a21​a31​​a12​a22​a32​​a13​a23​a33​​​=a11​a22​a33​+a12​a23​a31​+a13​a21​a32​−a13​a22​a31​−a12​a21​a33​−a11​a23​a32​

行列式操作和特性:

(1)(1)(1) 经过转置行列式的值不变,即∣AT∣=∣A∣\begin{vmatrix} A^T \end{vmatrix} = \begin{vmatrix} A \end{vmatrix}​AT​​=​A​​。行列式的转置是将AAA的行和列交换,得到ATA^{T}AT,转置行列式的任意元素满足aijt=ajia_{ij}^{t} = a_{ji}aijt​=aji​;例如

A33=∣a11a12a13a21a22a23a31a32a33∣A33T=∣a11a21a31a12a22a32a13a23a33∣A_{33} = \begin{vmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{vmatrix} \quad A_{33}^{T} = \begin{vmatrix} a_{11} & a_{21} & a_{31} \\ a_{12} & a_{22} & a_{32} \\ a_{13} & a_{23} & a_{33} \end{vmatrix}A33​=​a11​a21​a31​​a12​a22​a32​​a13​a23​a33​​​A33T​=​a11​a12​a13​​a21​a22​a23​​a31​a32​a33​​​

(2)(2)(2) 行列式中的任意两行/列交换位置,行列式的值不变;例如

∣a11a12a13a21a22a23a31a32a33∣=∣a21a22a23a11a12a13a31a32a33∣=∣a22a21a23a12a11a13a32a31a33∣\begin{vmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{vmatrix} = \begin{vmatrix} a_{21} & a_{22} & a_{23} \\ a_{11} & a_{12} & a_{13} \\ a_{31} & a_{32} & a_{33} \end{vmatrix} = \begin{vmatrix} a_{22} & a_{21} & a_{23} \\ a_{12} & a_{11} & a_{13} \\ a_{32} & a_{31} & a_{33} \end{vmatrix}​a11​a21​a31​​a12​a22​a32​​a13​a23​a33​​​=​a21​a11​a31​​a22​a12​a32​​a23​a13​a33​​​=​a22​a12​a32​​a21​a11​a31​​a23​a13​a33​​​

特别的,当两行/列相同时,该行列式的值为000;

(3)(3)(3) 某行/列中所有元素若存在公因子kkk,则可以将kkk提到行列式外;例如

∣k⋅a11k⋅a12⋯k⋅a1na21a22⋯a2n⋮⋮⋮an1an2⋯ann∣=k⋅∣a11a12⋯a1na21a22⋯a2n⋮⋮⋮an1an2⋯ann∣\begin{vmatrix} k \cdot a_{11} & k \cdot a_{12} & \cdots & k \cdot a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix} = k \cdot \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{vmatrix}​k⋅a11​a21​⋮an1​​k⋅a12​a22​⋮an2​​⋯⋯⋯​k⋅a1n​a2n​⋮ann​​​=k⋅​a11​a21​⋮an1​​a12​a22​⋮an2​​⋯⋯⋯​a1n​a2n​⋮ann​​​

特别的,某行/列的值全为000,该行列式的值为000;某两行/列的元素对应成比例,行列式的值为000;

(4)(4)(4) 某行/列的每个元素是两个元素之和,则可以把行列式拆分为两个行列式之和;例如

∣a1+b1a2+b2a3+b3c1c2c3d1d2d33∣=∣a1a2a3c1c2c3d1d2d33∣+∣b1b2b3c1c2c3d1d2d33∣\begin{vmatrix} a_{1} + b_1 & a_{2} + b_2 & a_{3} + b_3 \\ c_{1} & c_{2} & c_{3} \\ d_{1} & d_{2} & d_{33} \end{vmatrix} = \begin{vmatrix} a_{1} & a_{2} & a_{3} \\ c_{1} & c_{2} & c_{3} \\ d_{1} & d_{2} & d_{33} \end{vmatrix} + \begin{vmatrix} b_{1} & b_{2} & b_{3} \\ c_{1} & c_{2} & c_{3} \\ d_{1} & d_{2} & d_{33} \end{vmatrix}​a1​+b1​c1​d1​​a2​+b2​c2​d2​​a3​+b3​c3​d33​​​=​a1​c1​d1​​a2​c2​d2​​a3​c3​d33​​​+​b1​c1​d1​​b2​c2​d2​​b3​c3​d33​​​

(5)(5)(5) 把某行/列的kkk倍加到另一行/列上,行列式的值不变;例如

∣a1a2a3b1b2b3c1c2c33∣=∣a1a2a3b1+k⋅a1b2+k⋅a2b3+k⋅a3c1c2c33∣\begin{vmatrix} a_{1} & a_{2} & a_{3} \\ b_{1} & b_{2} & b_{3} \\ c_{1} & c_{2} & c_{33} \end{vmatrix} = \begin{vmatrix} a_{1} & a_{2} & a_{3} \\ b_{1} + k \cdot a_{1} & b_{2} + k \cdot a_{2} & b_{3} + k \cdot a_{3} \\ c_{1} & c_{2} & c_{33} \end{vmatrix}​a1​b1​c1​​a2​b2​c2​​a3​b3​c33​​​=​a1​b1​+k⋅a1​c1​​a2​b2​+k⋅a2​c2​​a3​b3​+k⋅a3​c33​​​

矩阵

矩阵(Matrix):n×mn \times mn×m个数字组成的nnn行mmm列的表格AnmA_{nm}Anm​

Anm=[a11a12⋯a1ma21a22⋯a2m⋮⋮⋱⋮an1an2⋯anm]A_{nm} = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1m} \\ a_{21} & a_{22} & \cdots & a_{2m} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nm} \end{bmatrix}Anm​=​a11​a21​⋮an1​​a12​a22​⋮an2​​⋯⋯⋱⋯​a1m​a2m​⋮anm​​​

其中第iii行第jjj列的元素为aija_{ij}aij​(1≤i≤n,1≤j≤m1 \leq i \leq n, 1 \leq j \leq m1≤i≤n,1≤j≤m)。特别的当n=mn = mn=m时称矩阵AAA为nnn阶矩阵或nnn阶方阵。

矩阵操作和特性:

(1)(1)(1) 零矩阵:所有元素都为000的矩阵

[00⋯000⋯0⋮⋮⋱⋮00⋯0]\begin{bmatrix} 0 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 0 \end{bmatrix}​00⋮0​00⋮0​⋯⋯⋱⋯​00⋮0​​

零矩阵记为OOO。

(2)(2)(2) 若两矩阵AnmA_{nm}Anm​和BstB_{st}Bst​的行和列数量相等,即n=s,m=tn = s, m = tn=s,m=t,称。的两矩阵称为同型矩阵。若同型矩阵的所有对应元素也想等,则两矩阵相等。

(3)(3)(3) nnn阶方阵AAA构成的行列式称为AAA的行列式,记作∣A∣\begin{vmatrix} A \end{vmatrix}​A​​。注意矩阵是一个表格,而行列式经过计算后是一个值。

(4)(4)(4) 矩阵加法:两个同型矩阵可以相加,即Cnm=Anm+BnmC_{nm} = A_{nm} + B_{nm}Cnm​=Anm​+Bnm​,任意元素满足cij=aij+bijc_{ij} = a_{ij} + b_{ij}cij​=aij​+bij​(1≤i≤n,1≤j≤m1 \leq i \leq n, 1 \leq j \leq m1≤i≤n,1≤j≤m)。矩阵加法满足特性

A+B=B+A(A+B)+C=A+(B+C)A+O=A,A−O=A\begin{matrix} A + B = B + A \\ (A + B ) + C = A + (B + C) \\ A + O = A, A - O = A \end{matrix}A+B=B+A(A+B)+C=A+(B+C)A+O=A,A−O=A​

(5)(5)(5) 矩阵数乘:矩阵与数可以相乘,即Bnm=k⋅AnmB_{nm} = k \cdot A_{nm}Bnm​=k⋅Anm​,任意元素满足bij=k⋅aijb_{ij} = k \cdot a_{ij}bij​=k⋅aij​(1≤i≤n,1≤j≤m1 \leq i \leq n, 1 \leq j \leq m1≤i≤n,1≤j≤m)。矩阵数乘满足特性

k(mA)=(km)A=m(kA)(k+m)A=kA+mAk(A+B)=kA+kB1⋅A=A0⋅A=O\begin{matrix} k(mA) = (km)A = m(kA) \\ (k + m)A = kA + mA \\ k(A + B) = kA + kB \\ 1 \cdot A = A \\ 0 \cdot A = O \end{matrix}k(mA)=(km)A=m(kA)(k+m)A=kA+mAk(A+B)=kA+kB1⋅A=A0⋅A=O​

(6)(6)(6) 矩阵乘法:两个矩阵Anm,BstA_{nm}, B_{st}Anm​,Bst​相乘必须满足条件m=sm = sm=s,即Cnt=Anm×BstC_{nt} = A_{nm} \times B_{st}Cnt​=Anm​×Bst​(m=sm = sm=s),任意元素满足cij=∑k=1maik⋅bkjc_{ij} = \sum_{k=1}^{m} a_{ik} \cdot b_{kj}cij​=∑k=1m​aik​⋅bkj​(1≤i≤n,1≤j≤t,1≤k≤m1 \leq i \leq n, 1 \leq j \leq t, 1 \leq k \leq m1≤i≤n,1≤j≤t,1≤k≤m)。特别的,若AAA是nnn阶方阵,则kkk个矩阵AAA相乘的结果记为∏i=1kA=Ak\prod_{i=1}^{k} A = A^{k}∏i=1k​A=Ak,称为AAA的kkk次幂。矩阵乘法满足特性

(AB)C=A(BC)A(B+C)=AB+AC(B+C)A=BA+CA\begin{matrix} (AB)C = A(BC) \\ A(B + C) = AB + AC \\ (B + C)A = BA + CA \end{matrix}(AB)C=A(BC)A(B+C)=AB+AC(B+C)A=BA+CA​

注意一般情况下AB≠BAAB \neq BAAB=BA。

(7)(7)(7) 矩阵转置:将矩阵AnmA_{nm}Anm​的行和列交换得到矩阵AmnTA_{mn}^{T}AmnT​,任意元素满足aijt=ajia_{ij}^{t} = a_{ji}aijt​=aji​。称AmnTA_{mn}^{T}AmnT​为AAA的转置矩阵。矩阵转置满足特性

(A+B)T=AT+BT(k⋅A)T=k⋅AT(A⋅B)T=BT⋅AT(AT)T=A\begin{matrix} (A + B)^{T} = A^{T} + B^{T} \\ (k \cdot A)^{T} = k \cdot A^{T} \\ (A \cdot B)^{T} = B^{T} \cdot A^{T} \\ (A^{T})^{T} = A \end{matrix}(A+B)T=AT+BT(k⋅A)T=k⋅AT(A⋅B)T=BT⋅AT(AT)T=A​

(8)(8)(8) 单位矩阵:nnn阶矩阵中,主对角线上的元素都是111,其余元素都是000,称为nnn阶单位矩阵,简写作EEE,EnE_{n}En​或III。即aii=1,aij=0a_{ii} = 1, a_{ij} = 0aii​=1,aij​=0(其中i≠ji \neq ji=j)。

Ann=[111012⋯01n021122⋯02n⋮⋮⋱⋮0n10n2⋯1nn]A_{nn} = \begin{bmatrix} 1_{11} & 0_{12} & \cdots & 0_{1n} \\ 0_{21} & 1_{22} & \cdots & 0_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ 0_{n1} & 0_{n2} & \cdots & 1_{nn} \end{bmatrix}Ann​=​111​021​⋮0n1​​012​122​⋮0n2​​⋯⋯⋱⋯​01n​02n​⋮1nn​​​

(9)(9)(9) 数量矩阵:数字kkk与单位矩阵EEE的积k⋅Ek \cdot Ek⋅E称为数量矩阵。

(10)(10)(10) nnn阶矩阵的主对角线:即矩阵AnnA_{nn}Ann​上的所有元素aiia_{ii}aii​(其中1≤i≤n1 \leq i \leq n1≤i≤n)。所有元素aiia_{ii}aii​连起来称为矩阵的对角线,其中的元素称为对角元素。

(11)(11)(11) 对角矩阵:非对角元素全为000的nnn阶方阵称为对角矩阵。

(12)(12)(12) 上/下三角矩阵:主对角线以下/上(不包括主对角线)元素都为000的nnn阶矩阵,即aij=0,i>ja_{ij} = 0, i \gt jaij​=0,i>j(上三角矩阵),aij=0,i<ja_{ij} = 0, i \lt jaij​=0,i<j(下三角矩阵)。

(13)(13)(13) 对称矩阵/反对称矩阵:满足AT=AA^{T} = AAT=A(即aijt=ajia_{ij}^{t} = a_{ji}aijt​=aji​)的矩阵为对称矩阵,满足AT=−AA^{T} = -AAT=−A(即aijt=−ajia_{ij}^{t} = - a_{ji}aijt​=−aji​)的矩阵称为反对称矩阵。

Strassen算法

根据数学定义,计算两个nnn阶矩阵相乘,由于cij=∑k=1naik⋅bkjc_{ij} = \sum_{k=1}^{n} a_{ik} \cdot b_{kj}cij​=∑k=1n​aik​⋅bkj​,计算CCC中的一个元素的时间复杂度为O(n)O(n)O(n)。CCC中有n2n^2n2个元素,因此时间复杂度为O(n3)O(n^3)O(n3)。Strassen算法的时间复杂度比平凡算法更低。

对于nnn阶矩阵乘法C=A×BC = A \times BC=A×B,设nnn为偶数,则可以将A,B,CA, B, CA,B,C三个矩阵划分为444个n/2n/2n/2的矩阵,C=A×BC = A \times BC=A×B转化为

[rstu]=[abcd]×[efgh]\begin{bmatrix} r & s \\ t & u \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \times \begin{bmatrix} e & f \\ g & h \end{bmatrix}[rt​su​]=[ac​bd​]×[eg​fh​]

按照矩阵乘法计算方法可知

r=a×e+b×gs=a×f+b×ht=c×e+d×gu=c×f+d×h\begin{matrix} r = a \times e + b \times g \\ s = a \times f + b \times h \\ t = c \times e + d \times g \\ u = c \times f + d \times h \end{matrix}r=a×e+b×gs=a×f+b×ht=c×e+d×gu=c×f+d×h​

上面计算中设两个nnn阶矩阵相乘的时间复杂度为T(n)T(n)T(n),则888次矩阵相乘的时间复杂度为8⋅T(n2)8 \cdot T( \frac{n}{2} )8⋅T(2n​)。nnn阶方阵的加法需要分别计算n2n^2n2次两个元素之和,因此时间复杂度为O(n2)O(n^2)O(n2)。由此可知

T(n)=8⋅T(n2)+O(n2)T(n) = 8 \cdot T(\frac{n}{2}) + O(n^2)T(n)=8⋅T(2n​)+O(n2)

通过时间复杂度的推导方法,可以得出T(n)=O(n3)T(n) = O(n^3)T(n)=O(n3)。因此分治法的时间复杂度与平凡算法相同。

Strassen算法在分治法基础上设置777个中间矩阵,将上式转化为

p1=a×f−a×h=a×(f−h)p2=a×h+b×h=(a+b)×hp3=c×e+d×e=(c+d)×ep4=d×g−d×e=d×(g−e)p5=a×e+a×h+d×e+d×h=(a+d)×(e+h)p6=b×g+b×h−d×g−d×h=(b−d)×(g+h)p7=a×e+a×f−c×e−c×f=(a−c)×(e+f)\begin{matrix} p_1 = a \times f - a \times h = a \times (f - h) \\ p_2 = a \times h + b \times h = (a + b) \times h \\ p_3 = c \times e + d \times e = (c + d) \times e \\ p_4 = d \times g - d \times e = d \times (g - e) \\ p_5 = a \times e + a \times h + d \times e + d \times h = (a + d) \times (e + h) \\ p_6 = b \times g + b \times h - d \times g - d \times h = (b - d) \times (g + h) \\ p_7 = a \times e + a \times f - c \times e - c \times f = (a - c) \times (e + f) \end{matrix}p1​=a×f−a×h=a×(f−h)p2​=a×h+b×h=(a+b)×hp3​=c×e+d×e=(c+d)×ep4​=d×g−d×e=d×(g−e)p5​=a×e+a×h+d×e+d×h=(a+d)×(e+h)p6​=b×g+b×h−d×g−d×h=(b−d)×(g+h)p7​=a×e+a×f−c×e−c×f=(a−c)×(e+f)​

可得

r=p5+p4−p2+p6s=p1+p2t=p3+p4u=p1+p5−p3−p7\begin{matrix} r = p_5 + p_4 - p_2 + p_6 \\ s = p_1 + p_2 \\ t = p_3 + p_4 \\ u = p_1 + p_5 - p_3 - p_7 \end{matrix}r=p5​+p4​−p2​+p6​s=p1​+p2​t=p3​+p4​u=p1​+p5​−p3​−p7​​

这样计算矩阵相乘时,只需要计算777次矩阵相乘运算,矩阵间的加减运算的时间复杂度仍然是O(n2)O(n^2)O(n2)。即有

T(n)=7⋅T(n2)+O(n2)T(n) = 7 \cdot T( \frac{n} {2} ) + O(n^2)T(n)=7⋅T(2n​)+O(n2)

最终推导可得,Strassen算法的时间复杂度为O(nlog27)≈O(n2.81)O(n^{log_2 7}) \approx O(n^{2.81})O(nlog2​7)≈O(n2.81)。

数学复习全书(2013年李永乐李正元考研数学 数学一) - 第二篇 线性代数

源码

测试

PreviousSection-1 Matrix 第1节 矩阵NextGaussElimination 高斯消元法

Last updated 6 years ago

https://book.douban.com/subject/21370697/
Strassen.h
Strassen.cpp
StrassenTest.cpp