Nel prodotto tra matrici di dimensioni nxn, C=AxB, è richiesto almeno il tempo
- T1(n) = c1 · n2, per scrivere i risultati in C
- T2(n) = 2 · c2 · n2, per leggere i dati in A e B
Non può esistere un algoritmo con complessità inferiore a quella necessaria per esaminare l’input oppure per generare l’output e quindi si parte comunque da una complessità quadratica.
L’algoritmo tradizionale che calcola il singolo elemento cij tramite il prodotto scalare
cij = ai · bj = ai1 · b1j + ai2 · b2j + … + ain · bnj
richiede n moltiplicazioni per ogni prodotto scalare e quindi richiede
T3(n) = c3 · n · n2 = c3 · n3
per calcolare tutti i prodotti.
Questo algoritmo ci permette di stabilire un limite superiore per la complessità del problema.
In conclusione
T1(n) ≤ T2(n) ≤ T(n) ≤ T3(n)
c2 · n2 ≤ T(n) ≤ c3 · n3
Il problema del prodotto matriciale ha una complessità compresa tra O(n2) e O(n3) per il numero di prodotti.
Miglioramento?
Esistono effettivamente algoritmi che abbassano la complessità da a
.
Vedi Algoritmo di Strassen.
Il miglioramento potrebbe sembrare impercettibile ma al crescere di n diventa significativo…
n | ![]() | ![]() | ![]() |
---|---|---|---|
101 | ~6,42 * 102 | 103 | 64 % |
102 | ~4,12 * 105 | 106 | 41 % |
103 | ~2,64 * 108 | 109 | 26 % |
104 | ~1,70 * 1011 | 1012 | 17 % |
105 | ~1,09 * 1014 | 1015 | 11 % |
Osserva
- per n = 1.000 il tempo si riduce a un quarto
- per n = 10.000 il tempo si riduce a un sesto