Complessità computazionale • Obie:vo principale: Analisi della complessità degli algoritmi – Confrontare algoritmi corretti che risolvono lo stesso problema, allo scopo di scegliere quello migliore in relazione a uno o più parametri di valutazione. A. Ferrari 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 – 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. – lo spazio • occupazione di memoria Durata delle istruzioni Efficienza • Le istruzioni non hanno tutte lo stesso tempo di esecuzione. • Il tempo di esecuzione di un algoritmo è una somma pesata delle istruzioni: • L’approssimazione di una funzione con una funzione asintotica è molto utile per semplificare i calcoli • La notazione asintotica di una funzione descrive 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. Ttotale=(i0*t0*n0)+(i1*t1*n1)+…+(im*tm*nm) – ij è l’istruzione, – tj è il costo dell’istruzione, il tempo di esecuzione – nj è il numero di volte che viene eseguita. 1 Misura dell’efficienza • 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 (1) • O (O grande) equivale al simbolo <=. – Corrisponde a “al più come”. – “la complessità dell’algoritmo è O(f(n))” equivale a “il tempo d’esecuzione dell’algoritmo è <= a f(n)”. • o (o piccolo) equivale al simbolo <. – “la complessità dell’algoritmo è o(f(n))” equivale a “il tempo d’esecuzione dell’algoritmo è strettamente < a f(n)”. • Θ (teta) corrispondente al simbolo =. – “la complessità dell’algoritmo è Θ(f(n))” equivale a “il tempo d’esecuzione dell’algoritmo è = a f(n)” Terminologia (2) • Ω (omega grande) equivale al simbolo >=. – “la complessità dell’algoritmo è Ω(f(n))” equivale a dire “il tempo d’esecuzione dell’algoritmo è >= a f(n)”. • ω (omega piccolo) equivale al simbolo >. – “la complessità dell’algoritmo è ω(f(n))” equivale a dire“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 – 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 – Sempre nell’algoritmo di ricerca in un vettore ordinato avremo il caso: • Ottimo • Pessimo • Medio Tipi di complessità • • • • • lineare logaritmica quadratica esponenziale fattoriale 2 Lineare • l’algoritmo ha complessità O(n) • Esempio: – algoritmo di ricerca sequenziale di un elemento in un array QuadraKca • Un esempio è l’algoritmo di ordinamento bubblesort eseguito su un array di elementi • l’algoritmo ha complessità O(n2) Torre di Hanoi Logaritmica • Esempio ricerca dicotomica in un array • La ricerca dicotomica ha complessità O(log2(n)) 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 è portare tutti dischi sull’ultimo paletto, potendo spostare solo un disco alla volta e potendo mettere un disco solo su uno più grande, mai su uno più piccolo Fa2oriale • 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!) 3 logaritmica < lineare < quadratica < esponenziale < fa2oriale Confronto 4