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) i1 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) in 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