COMPLESSITA' degli ALGORITMI 5ASA maggio 2015 Complessità degli algoritmi ● Teoria della complessità studiata dagli anni 70 - complessità di un problema - complessità di un programma - valutazione dell’efficienza di un algoritmo ● Un programma richiede spazio di memoria e tempo di calcolo. ● Per valutare la complessità dei programmi, ci concentreremo sul tempo di calcolo. Cosa si intende per complessità di un algoritmo? DEFINIZIONE: si dice complessità di un algoritmo che risolve un problema di dimensione N, una funzione f(N) indicante il massimo numero di passi mediante il quale l'algoritmo risolve il problema. COMPLESSITA' COMPUTAZIONALE: il tempo (o quantità di memoria) necessario per l'esecuzione di un certo algoritmo (o programma). Complessità di un algoritmo ● Come valutare la complessità di uno specifico algoritmo? Contando: · il numero di operazioni aritmetiche · il numero di operazioni logiche · il numero di letture e scritture dei file in memoria · le istruzioni · etc.. Tipi di complessità ● Complessità temporale: tempo richiesto per l'esecuzione dell'algoritmo ● Complessità spaziale: spazio occupato in memoria per eseguire l'algoritmo. Ipotesi semplificative · ogni operazione ha costo unitario · il tempo globalmente impiegato è proporzionale, al numero di operazioni eseguite. · Non ci si riferisce ad una specifica macchina ESEMPIO Per moltiplicare due matrici quadrate NxN di interi (C = A x B), occorre: · ripetere N2 volte il calcolo del valore C[i,j] · per calcolare C[i,j], effettuare ○ ○ ○ ○ 2*N letture, N moltiplicazioni N-1 addizioni 1 scrittura Esempio Totale: 2*N3 letture, N3 moltiplicazioni, N2*(N-1) addizioni, N2 scritture Tempo richiesto:(ipotesi: stesso tempo per tutte le operazioni): time Alg( C = AxB ) (N) =2*N3+N3+N2*(N-1)+N2 = 4*N3 Motivazioni Perché valutare la complessità di un algoritmo? · per scegliere l’algoritmo più efficiente Da cosa dipende la complessità di un algoritmo? · dalla “dimensione” dei dati a cui l’algoritmo si applica. La complessità dell’algoritmo viene espressa in funzione della dimensione dei dati Motivazioni Si consideri un algoritmo che risolve il generico problema P. time Alg(P)(N) = 2N è molto diverso da avere time Alg(P)(N) = 4*N3 perché cambia l’ordine di grandezza. Ordine di grandezza N N*log 2N N2 N3 2N 2 2 4 8 4 10 33 100 103 >103 100 664 105 106 >>1025 1000 9966 106 109 >>10250 10000 13288 108 1012 >>102500 Esempio di tempo di elaborazione Consideriamo un elaboratore in grado di compiere 1000 operazioni/s e un algoritmo dell'ordine di grandezza 2N. N TEMPO 10 1s 20 103 s (circa 17 minuti) 30 106 s (circa 11,5 giorni) 40 >1013 s (circa 340 secoli) Esempio di tempo di elaborazione Comportamento asintotico E' importante capire cosa succede quando i dati sono di grandi dimensioni: ● se N piccolo va bene qualunque algoritmo ● se N grande (N ∞ ) allora si potrebbero avere situazioni critiche. Risulta importante studiare la funzione timeAlg (N) con (N ∞) Comportamento asintotico ● Non è facile studiare il comportamento asintotico di timeAlg(N) ● Studieremo l'ordine di grandezza di N ○ ○ ○ ○ ○ costante al variare di N polinomiale al variare di N logaritmico al variare di N esponenziale al variare di N fattoriale al variare di N Comportamento asintotico Maggiorante: time(N) = O (g(N)) Si parla di maggiorante di una funzione e si indica con O: quando esistono due costanti a >0, N’ tali che: timeAlg (N) <= a*g(N) per ogni N > N’ e si scrive timeAlg(N) = O (g(N)) Minorante: time(N) = Ω (f(N)) Si parla di minorante al comportamento asintotico di una funzione e si indica con Ω: quando esistono due costanti c>0, N’ tali che: timeAlg (N) > c*f(N) per ogni N > N’ e si scrive timeAlg(N) = Ω (f(N)) Limite superiore ed inferiore di time (N) Caso particolare Se esiste una funzione f(N) tale che: timeAlg(N) = O (f(N)) = Ω (f(N)) allora f(N) costituisce una valutazione corretta del costo dell’algoritmo. le due limitazioni inferiore e superiore coincidono, quindi caratterizzano compiutamente time(N). Caso particolare: esempio Dato timeAlg(N) = 4*N2+N+1 ● si dimostra che timeAlg(N)<=5*N2 per ogni N>2 :timeAlg(N) = 0(N2) ● si dimostra che timeAlg(N) >4*N2 per ogni N>1 timeAlg(N) = Ω (N2) ● f(N) =O( N2 ) risulta essere una valutazione corretta del costo Classi di complessità CLASSE DI COMPLESSITA' ESEMPIO Costante: 0(1) o 0(C) Algoritmi, senza cicli, che non dipendono dalla dimensione del problema Logaritmica: 0(logN) Algoritmo di ricerca binaria Lineare: O(N) Algoritmo di ricerca sequenziale Pseudolineare:N*logN:0(N*logN) Algoritmo MergeSort Polinomiale:0(Nk) Algoritmo BubbleSort ( K=2) Esponenziale:O(KN) Algoritmo che produce stringhe di dimensione N per un alfabeto di 21 simboli Efficienza di un algoritmo ● Se due algoritmi appartengono alla stessa classe di complessità ○ Alg1 è migliore di Alg2 se lim N ∞(timeAlg1(N)/timeAlg2(N)) = C con C<1 ○ A2 è migliore di A1 se lim N ∞(timeAlg1(N)/timeAlg2(N)) = C con C>1 Esempio Dato un problema P si hanno due algoritmi Alg1 e Alg2 che risolvono il problema. timeAlg1(N) = N + 8 e timeAlg2(N)=3N Alg1 risulta migliore di Alg2 (se N>5 ) Test 1/5 1. Una funzione F(N) è intesa come complessità di un algoritmo di dimensione N se: a. rappresenta il numero minimo di passi nel quale risolve il problema b. rappresenta il numero massimo di passi nel quale risolve il problema c. rappresenta il numero medio di passi nel quale risolve il problema d. rappresenta il numero di passi nel quale risolve il problema Test 2/5 2. Considerando un elaboratore in grado di compiere un'operazione ogni microsecondo, quanto sarà il suo tempo di elaborazione per un algoritmo avente ordine di grandezza N^2, con N=1000? a. 1 secondo b. 10 secondi c. 5 secondi d. 0,1 secondi Test 3/5 3. Se esiste un funzione f(N) tale che timeAlg(N) = O (f(N)) = Ω (f(N)) allora: a. f(N) rappresenta una valutazione corretta del costo dell'algoritmo b. f(N) non definisce il costo dell'algoritmo c. f(N) tale condizione non può mai essere verificata d. Nessuna delle risposte precedenti Test 4/5 4. La complessità O(N), di un dato algoritmo, è : a. b. c. d. quadratica costante lineare polinomiale Test 5/5 5. Si considerino due algoritmi, che risolvono il problema P, aventi stessa classe di complessità, Alg1 sarà migliore di Alg2 se il limite per N che tende a ∞ di : a. timeAlg1(N)/timeAlg2(N) = C con C>1 b. timeAlg1(N) /timeAlg2(N) = 0 c. timeAlg1(N)/timeAlg2(N)=C con C<1 d. Nessuna delle risposte precedenti Soluzioni 1. 2. 3. 4. 5. B A A C C