Mnożenie macierzy n×nn\times n

by Jerry Sky

Strassen


Należy zauważyć, że standardowe podejście do mnożenia macierzy daje algorytm o złożoności obliczeniowej O(n3)O(n^3).

X,YX,Y - macierze n×nn\times n
chcemy Z=XYZ = XY Zij=k=1nXikYkj Z_{ij} = \sum_{k=1}^{n}X_{ik}Y_{kj} matrix multiplication

Bezmyślny algorytm typu dziel i zwyciężaj (D&C) również ma złożoność O(n3)O(n^3). 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)O\big(n^{\log_27}\big), gdzie log272.81\log_27 \approx 2.81.

Mnożenie macierzy jest szczególnie proste do podziału na pod-problemy, np. do podziału na cztery bloki:

X=[ABCD] X = \begin{bmatrix} A & B \\ C & D \end{bmatrix} Y=[EFGH] Y = \begin{bmatrix} E & F \\ G & H \end{bmatrix}

Wówczas XYXY jest równe [ABCD][EFGH]=[AE+BGAF+BHCE+DGCF+DH] \begin{bmatrix} A & B \\ C & D \end{bmatrix} \begin{bmatrix} E & F \\ G & H \end{bmatrix} = \begin{bmatrix} AE + BG & AF + BH \\ CE + DG & CF + DH \end{bmatrix} Nadal mamy złożoność T(n)=8T(n2)+O(n2)=O(n3)T(n) = 8 \cdot T\big(\frac{n}{2}\big) + O(n^2) = O(n^3).

Jednakże Strassen wpadł na pomysł, dzięki któremu udało się zmniejszyć ilość mnożeń z ośmiu do siedmiu!

XY=[P5+P4P2+P6P1+P2P3+P4P1+P5P3P7] XY = \begin{bmatrix} P_5 + P_4 - P_2 + P_6 & P_1 + P_2 \\ P_3 + P_4 & P_1 + P_5 - P_3 - P_7 \end{bmatrix} gdzie

Wówczas złożoność obliczeniowa T(n)=7T(n2)+O(n2)T(n) = 7\cdot T\big(\frac{n}{2}\big) + O(n^2) co dzięki Master Theorem możemy zapisać jako O(nlog27)O(n2.81)O\big(n^{\log_27}\big) \approx O\big(n^{2.81}\big) co jest znacznie lepszym wynikiem od O(n3)O(n^3) rzecz jasna.

Source: Algorithms: Dasgupta, Papadimitriou, Vazirani - paragraph 2.5