Strassen
Należy zauważyć, że standardowe podejście do mnożenia macierzy daje algorytm o złożoności obliczeniowej O(n3).
X,Y - macierze n×n
chcemy Z=XY Zij=k=1∑nXikYkj
Bezmyślny algorytm typu dziel i zwyciężaj (D&C) również ma złożoność O(n3). Należy pamiętać, że najważniejsza praca w podejściu D&C dzieje się podczas podziału problemu na mniejsze pod-problemy lub łączenia rozwiązanych pod-problemów.
Algorytm niemieckiego matematyka Volker Strassen’a łączy pod-problemy w zmyślny sposób dzięki czemu ma złożoność O(nlog27), gdzie log27≈2.81.
Mnożenie macierzy jest szczególnie proste do podziału na pod-problemy, np. do podziału na cztery bloki:
X=[ACBD] Y=[EGFH]
Wówczas XY jest równe [ACBD][EGFH]=[AE+BGCE+DGAF+BHCF+DH] Nadal mamy złożoność T(n)=8⋅T(2n)+O(n2)=O(n3).
Jednakże Strassen wpadł na pomysł, dzięki któremu udało się zmniejszyć ilość mnożeń z ośmiu do siedmiu!
XY=[P5+P4−P2+P6P3+P4P1+P2P1+P5−P3−P7] gdzie
- P1=A(F−H)
- P2=(A+B)H
- P3=(C+D)E
- P4=D(G−E)
- P5=(A+D)(E+H)
- P6=(B−D)(G+H)
- P7=(A−C)(E+F)
Wówczas złożoność obliczeniowa T(n)=7⋅T(2n)+O(n2) co dzięki Master Theorem możemy zapisać jako O(nlog27)≈O(n2.81) co jest znacznie lepszym wynikiem od O(n3) rzecz jasna.
Source: Algorithms: Dasgupta, Papadimitriou, Vazirani - paragraph 2.5