2011-12-17 17 views
11

Mi è venuto in mente questo algoritmo per la moltiplicazione della matrice. Ho letto da qualche parte che la moltiplicazione della matrice ha una complessità temporale di o (n^2). Ma penso che il mio algoritmo darà o (n^3). Non so come calcolare la complessità temporale degli anelli annidati. Quindi per favore correggimi.algoritmo di moltiplicazione della matrice complessità del tempo

for i=1 to n 
    for j=1 to n  
    c[i][j]=0 
    for k=1 to n 
     c[i][j] = c[i][j]+a[i][k]*b[k][j] 
+2

Questo 'b [i] [k]' sembra sbagliato. Sospetto che tu voglia qualcosa come 'c [i] [j] + a [i] [k] * b [k] [j]' sul RHS dell'ultima riga. –

+0

non è corretto. Qui c [i] [j] è la matrice dei risultati – zedai

+3

Beh, in questo caso non stai sicuramente facendo la moltiplicazione della matrice! Si noti che per un dato 'i', si sta calcolando lo stesso risultato in' c [i] [j] 'per ogni' j', quindi nella matrice di output 'c' tutte le colonne saranno identiche. Devi sostituire 'b [i] [k]' con 'b [k] [j]' nell'ultima riga. –

risposta

11

L'algoritmo ingenuo, che è quello che hai quando lo correggi come indicato nei commenti, è O (n^3).

Esistono algoritmi che lo riducono, ma non è probabile che si trovi un'implementazione O (n^2). Credo che la questione dell'attuazione più efficiente sia ancora aperta.

Vedere questo articolo di Wikipedia su Matrix Multiplication per ulteriori informazioni.

8

Il metodo standard di moltiplicare una matrice m-by-n da una matrice n-by-p ha complessità O (MNP). Se tutti quelli sono "n" per te, è O (n^3), non O (n^2). EDIT: non sarà O (n^2) nel caso generale. Ma ci sono algoritmi più veloci per particolari tipi di matrici - se ne sai di più potresti essere in grado di fare meglio.

+0

Questo è falso. Ci sono aumenti di velocità nel caso generale. – jwg

+0

Algoritmo di Strassen? Sicuro. L'OP ha chiesto O (n^2) e ciò non è possibile in generale. Questo è davvero quello che stavo ottenendo. –

28

Utilizzando l'algebra lineare, esistono algoritmi che raggiungono una complessità migliore rispetto al naive O (n). Solvay Strassen algoritmo raggiunge una complessità di O (n 2.807) riducendo il numero di moltiplicazioni richieste per ogni sub-matrice 2x2 da 8 a 7.

L'algoritmo di moltiplicazione matrice veloce noto è Coppersmith-Winograd algoritmo con una complessità di O (n 2.3737). A meno che la matrice non sia enorme, questi algoritmi non comportano una grande differenza nel tempo di calcolo. In pratica, è più facile e veloce utilizzare algoritmi paralleli per la moltiplicazione della matrice.

+0

Secondo [Wikipedia] (https://en.wikipedia.org/wiki/Coppersmith%E2%80%93Winograd_algorithm), esiste un algoritmo di moltiplicazione di matrici del 2014 che ha ottenuto O (n^2.3729) mentre l'algoritmo di Coppersmith-Winograd era il più veloce fino al 2010. – Garrett

-1

Nella moltiplicazione di matrice ci sono 3 per il ciclo, che stiamo usando poiché l'esecuzione di ogni ciclo per richiede la complessità temporale O(n). Quindi per tre cicli diventa O(n^3)

Problemi correlati