Complessità computazionale
Definizione 2.16
La complessità computazionale
è il numero di operazioni in virgola mobile (FLOP) coinvolte nell'esecuzione di un algoritmo in funzione della dimensione
dell'input.
Il costo computazionale espresso in operazioni piuttosto che in tempo di esecuzione e' una buona misura perchè è slegato dalla potenza del calcolatore di destinazione, ma non tiene conto del flusso delle istruzioni.
Algoritmi diversi per risolvere lo stesso problema hanno potenzialmente complessità diverse.
Esempio 2.13 (Algoritmo di Hörner)
Sia un polinomio qualsiasi
ll costo del calcolo ``ingenuo'' di
è:
L'algoritmo di Hörner consiste nel rappresentare il polinomio come:
Allora è evidente che ogni iterazione costa solo 2 operazioni in virgola mobile al posto di 3, e quindi:
Esempio 2.14 (Calcolo delle potenze)
Si vuole calcolare una potenza , dove
.
Una soluzione veloce, che impieghi meno di
prodotti, consiste nel suddividere i prodotti in potenze di due.
operazioni
Se
è una potenza di 2, la complessità è
In caso contrario, si può considerare la rappresentazione in base 2 dell'esponente:
operazioni
L'algoritmo impiega operazioni per calcolare i singoli fattori
, e un certo numero di prodotti tra essi per ottenere , al più (se , si risparmia un prodotto).
La complessità è quindi al più .
Esempio 2.15
Data la seguente matrice
Abbiamo che
eventuali m prodotti di matrici
Per
il calcolo del prodotto ha costo
FLOPS, mentre per
il calcolo del prodotto ha costo
FLOPS.
Ha costo
2 MFLOPS.
Esempio 2.16
Consideriamo il problema di calcolare .
Sia , allora è noto che
Consideriamo la serie di Taylor corrispondente (con resto di Lagrange):
con
converge a 0 per
,
.
Con
(f derivabile n+1 volte nell'intorno di
).
con
Vicino a 0 l'espansione di Taylor funziona bene:
Stima dell'errore:
Il caso due si puo' risolvere agevolmente con la seguente astuzia:
dove
con
,
Il che equivale a trovarsi sempre nel caso 1 con l'aggiunta di una potenza rapida.
Esempio 2.17 (Sviluppo di Laplace)
Consideriamo il problema di calcolare il determinante di una matrice
.
La sviluppo di Laplace è un metodo particolarmente inefficiente di calcolare il determinante3:
dove è una matrice
ottenuta da cancellando la riga -esima e la colonna -esima.
Il costo del calcolo del determinante di con Laplace è
e il numero di moltiplicazioni necessario è
.
>
n |
t @ 1GFLOPS |
t @ 1TFLOPS |
10 |
4 ms |
- |
15 |
24 minuti |
- |
20 |
154 anni |
2 mesi |
25 |
anni |
anni |
100 |
anni |
anni |
<>
Esempio 2.18 (MEG)
Il metodo di eliminazione di Gauss è un algoritmo per risolvere sistemi di equazioni lineari per mezzo di una
sequenza di operazioni (mosse di Gauss) operate sulla matrice associata.
Dove
è una sequenza di mosse di Gauss risulta in una matrice triangolare superiore tale che
Ricordiamo le proprietà del determinante:
- Dato
il determinante non cambia. Significa che se sommo o sottraggo ad una riga (colonna) una qualunque riga (colonna) moltiplicata per un numero il determinante non cambia;
- Scambiando due righe (oppure due colonne ) il determinante cambia segno.
Non c'è stato scambio di righe, dunque il determinante di U vale
L'algoritmo del MEG è un algoritmo finito, ma delicato da trattare in aritmetica di macchina.
Matteo Lisotto, Tobia Tesan - CC-BY 2.0