Unità F1
Analisi della complessità degli
algoritmi
Obiettivo principale
• Confrontare algoritmi corretti che risolvono lo stesso
problema, allo scopo di scegliere quello migliore in
relazione a uno o più parametri di valutazione.
Valutazione con un
parametro
• Se si ha a disposizione un solo parametro per
valutare un algoritmo, per esempio il tempo
d’esecuzione, è semplice la scelta: il più
veloce.
• Ogni altra caratteristica non viene
considerata.
Valutazione con più
parametri
• Nel caso di due parametri normalmente si
considera
o il tempo.
• numero di passi (istruzioni) che occorrono per produrre il
risultato finale.
• Passi e non secondi o millisecondi perché il tempo varia
al variare delle potenzialità del calcolatore.
o lo spazio
• occupazione di memoria
Durata delle istruzioni
• Le istruzioni non hanno tutte lo stesso tempo
di esecuzione.
• Il tempo di esecuzione di un algoritmo è una
somma pesata delle istruzioni:
Ttotale=(i0*t0*n0)+(i1*t1*n1)+…+(im*tm*nm)
o ij è l’istruzione,
o tj è il costo dell’istruzione, il tempo di esecuzione
o nj è il numero di volte che viene eseguita.
Misura dell’efficienza
• L’approssimazione di una funzione con una
funzione asintotica è molto utile per semplificare i
calcoli sul tempo di esecuzione di un algoritmo.
• La notazione asintotica di una funzione consente di
descriverne il comportamento in modo
semplificato, ignorando dettagli della formula.
• Esempio: per valori sufficientemente alti di x il
comportamento della funzione f(x) = x2 – 3x + 1 è
approssimabile con la funzione f(x) = x2.
• Per un algoritmo con un input di dimensione n,
possiamo definirne l’efficienza dicendo che
“l’algoritmo per calcolare il risultato finale impiega
al più f(n) passi”, “l’algoritmo ha complessità f(n)”.
Terminologia
• O (O grande) equivale al simbolo <=.
o Corrisponde a “al più come”.
o “la complessità dell’algoritmo è O(f(n))” equivale a “il
tempo d’esecuzione dell’algoritmo è <= a f(n)”.
• o (o piccolo) equivale al simbolo <.
o “la complessità dell’algoritmo è o(f(n))” equivale a “il
tempo d’esecuzione dell’algoritmo è strettamente < a
f(n)”.
• Θ (teta) corrispondente al simbolo =.
o “la complessità dell’algoritmo è Θ(f(n))” equivale a “il
tempo d’esecuzione dell’algoritmo è = a f(n)”.
Terminologia
• Ω (omega grande) equivale al simbolo >=.
o “la complessità dell’algoritmo è Ω(f(n))”
equivale a dire “il tempo d’esecuzione
dell’algoritmo è >= a f(n)”.
• ω (omega piccolo) equivale al simbolo >.
o “la complessità dell’algoritmo è ω(f(n))” è uguale a “il tempo
d’esecuzione dell’algoritmo è strettamente > di f(n)”.
Complessità computazionale
• La complessità computazionale di un
algoritmo è la quantità di tempo necessaria
per produrre il risultato finale.
• La complessità si esprime sotto forma di una
funzione matematica che mette in relazione
il tempo di esecuzione di un algoritmo con
la dimensione dei dati di input.
• Il caso peggiore per un algoritmo è il caso in
cui questo, per generare il risultato, impiega
più tempo.
Complessità
• In molti casi la complessità è legata al tipo o
al numero dei dati di input
o Ad esempio la ricerca di un valore in un vettore
ordinato dipende dalla dimensione del vettore
• La complessità può dipendere anche dalla
disposizione e dal tipo di dati
o Sempre nell’algoritmo di ricerca in un vettore
ordinato avremo il caso:
• Ottimo
• Pessimo
• Medio
Tipi di complessità
•
•
•
•
•
lineare;
logaritmica;
quadratica;
esponenziale;
fattoriale.
Lineare
• l’algoritmo ha
complessità O(n)
• Esempio:
o algoritmo di
ricerca sequenziale
di un elemento in
un array
Logaritmica
• Esempio ricerca
dicotomica in un
array
• La ricerca
dicotomica ha
complessità
O(log2(n))
Quadratica
• Un esempio è
l’algoritmo di
ordinamento
bubblesort
eseguito su un
array di elementi
• l’algoritmo ha
complessità O(n2)
Esponenziale
• l’algoritmo della Torre di Hanoi
ha complessità Ω(2n),
• La Torre di Hanoi è un
rompicapo matematico
composto da tre paletti e un
certo numero di dischi di
grandezza decrescente, che
possono essere infilati in uno
qualsiasi dei paletti.
• Il gioco inizia con tutti i dischi
incolonnati su un paletto in
ordine decrescente, in modo
da formare un cono.
• Lo scopo del gioco è portare
tutti dischi sull’ultimo paletto,
potendo spostare solo un disco
alla volta e potendo mettere
un disco solo su un altro disco
più grande, mai su uno più
piccolo
Torre di Hanoi
Fattoriale
• E’ quella che cresce
più velocemente
rispetto a tutte le
precedenti.
• Esempio: algoritmo
che calcola tutti gli
anagrammi di una
parola di n lettere
distinte.
• la complessità di un
tale algoritmo è Θ(n!)
logaritmica < lineare < quadratica < esponenziale < fattoriale
Alcuni esempi
Calcolo complessità e confronto
Algoritmo 1 – Calcolo
ALGORITMO 1
x,i,p: intero
INIZIO
leggi(x)
i1
p x
MENTRE i<5 ESEGUI
p p*x
i i+1
FINEMENTRE
scrivi(p)
FINE
5
x
1
1
1
1x5
2x4
17
1
Algoritmo 2 – Calcolo
ALGORITMO 2
x,i,p: intero
INIZIO
leggi(x)
leggi(n)
in
p 1
MENTRE i>0 ESEGUI
p p*x
i i-1
FINEMENTRE
scrivi(p)
FINE
n
x
1
1
1
1
3xn+1
1
3n+6
Ricerca sequenziale
FUNZIONE RicercaSequenziale(V:vettore;N,P:Intero):Booleano
Trovato : Booleano
I : Intero
INIZIO
Trovato Falso
I 1
MENTRE (I<N) AND (NOT Trovato) ESEGUI
SE V[I]=X ALLORA
Trovato Vero
Ciclo eseguito:
FINESE
I I+1
•Caso ottimo 1 volta
FINEMENTRE
•Caso pessimo n volte
RITORNO(Trovato)
FINE
•Caso medio n/2 volte
Ricerca binaria
FUNZIONE RicercaBinaria(V:vettore;N,X:Intero):Booleano
Primo, Ultimo, Centro : Intero ; Trovato : Booleano
INIZIO
Primo 1; Ultimo N; Trovato Falso
MENTRE (Primo<=Ultimo) AND (NOT Trovato)
Centro (Primo+Ultimo)/2
SE V[Centro]=X ALLORA
Trovato Vero
ALTRIMENTI
SE V[Centro]<X ALLORA Primo  Centro+1
ALTRIMENTI Ultimo  Centro-1
FINESE
FINESE
FINEMENTRE
Ciclo
RITORNO(Trovato)
FINE
eseguito:
•ottimo 1 volta
•pessimo log n volte
•medio log n volte
Confronto fra n - n/2 - log(n)
n
10
20
30
40
50
60
70
80
90
100
300
1000
10000
100000
n/2
5
10
15
20
25
30
35
40
45
50
150
500
5000
50000
log(n)
3,321928
4,321928
4,906891
5,321928
5,643856
5,906891
6,129283
6,321928
6,491853
6,643856
8,228819
9,965784
13,28771
16,60964