COMPLESSITA` degli ALGORITMI

Transcript

COMPLESSITA` degli ALGORITMI
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