Requisiti di memoria per una rapida moltiplicazione della matrice


12

Supponiamo di voler moltiplicare matrici . L'algoritmo di moltiplicazione a matrice lenta viene eseguito nel tempo O ( n 3 ) e utilizza la memoria O ( n 2 ) . La moltiplicazione della matrice più veloce viene eseguita nel tempo n ω + o ( 1 ) , dove ω è la costante di algebra lineare, ma cosa si sa della sua complessità di memoria?n×nO(n3)O(n2)nω+o(1)ω

Sembra che possa essere possibile a priori che la moltiplicazione a matrice rapida consumi memoria. C'è qualche garanzia che possa essere fatto nella memoria O ( n 2 ) ? Gli algoritmi di moltiplicazione di matrici attualmente noti utilizzano la memoria O ( n 2 ) ?nωO(n2)O(n2)

(In realtà sono interessato alla moltiplicazione della matrice rettangolare, ma presumo che la risposta sarebbe la stessa in quel caso del caso quadrato, e il caso quadrato è meglio studiato.)

Risposte:


16

L'uso dello spazio è al massimo per tutti gli algoritmi simili a Strassen (ovvero quelli basati sul limite superiore del grado di moltiplicazione della matrice algebricamente). Vedi Complessità spaziale dell'algoritmo Coppersmith – WinogradO(n2)

Tuttavia, nella mia precedente risposta mi sono reso conto che non avevo spiegato perché l'uso dello spazio fosse ... quindi qui va qualcosa di ondulato a mano. Considera cosa fa un algoritmo simile a Strassen. Si parte da un algoritmo fisso per la moltiplicazione della matrice K × K che utilizza le moltiplicazioni K c per una costante c < 3 . In particolare, questo algoritmo (qualunque esso sia) può essere scritto WLOG in modo che:O(n2)K×KKcc<3

  1. Si calcola diverse matrici L 1 , ... , L K c quali voci moltiplicano della prima matrice A di vari scalari e K c matrici R 1 , ... , R K c dalla seconda matrice B di una forma simile,KcL1,,LKcAKcR1,,RKcB

  2. Si moltiplica quelli lineare combinazioni , alloraLiRi

  3. Moltiplica inserimenti di da vari scalari, poi aggiunge tutte queste matrici fino entrywise avere A B .LiRiAB

(Questo è un cosiddetto algoritmo "bilineare", ma si scopre che ogni algoritmo moltiplicazione matriciale "algebrico" può essere scritto in questo modo.) Per ogni , questo algoritmo deve solo memorizzare il prodotto attuale L iR i e il valore corrente di A B (inizialmente impostato su tutti gli zero) in memoria in un dato punto, quindi l'utilizzo dello spazio è O ( K 2 ) .i=1,,KcLiRiABO(K2)

Dato questo algoritmo finito, viene quindi esteso alle matrici arbitrarie , suddividendo le matrici grandi in blocchi K × K di dimensioni K - 1 × K - 1 , applicando l' algoritmo K × K finito al blocco matrici e chiamando ricorsivamente l'algoritmo ogni volta che è necessario moltiplicare due blocchi. Ad ogni livello di ricorsione, dobbiamo tenere in memoria solo gli elementi di campo O ( K 2 ) (memorizzazione di O ( 1 )K×KK×KK1×K1K×KO(K2)O(1)diverse matrici ). Supponendo che lo spazio utilizzato per K - 1 × K - 1 matrice di moltiplicazione sia S ( - 1 ) , l'utilizzo dello spazio di questo algoritmo ricorsivo è S ( ) S ( - 1 ) + O ( K 2 ) , che per S ( 1 ) = 2 K 2K×KK1×K1S(1)S()S(1)+O(K2)S(1)=2K2risolve a .S()O(K2)


nωωnωω(n2)

1
O(nω+δ)O(n2)δ>0

f(i)n2i=0,...,knω+o(1)n2+o(1)

kfkf1fkkn2+o(1)

nkknf(k(n))=no(1)k(n)nnω+o(1)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.