Complessità: prodotto di matrici

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 · n

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 · n2T(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 O\left(n^{3}\right) a O\left(n^{2,8074}\right).
Vedi Algoritmo di Strassen.

Il miglioramento potrebbe sembrare impercettibile ma al crescere di n diventa significativo…

nT(n) T_3(n)\displaystyle \frac{T(n)}{T_3(n)}
101~6,42 * 10210364 %
102~4,12 * 10510641 %
103~2,64 * 10810926 %
104~1,70 * 1011101217 %
105~1,09 * 1014101511 %

Osserva

  • per n = 1.000 il tempo si riduce a un quarto
  • per n = 10.000 il tempo si riduce a un sesto