Upload
ennio-izzo
View
216
Download
3
Embed Size (px)
Citation preview
6 13 2
8
4
5 7 4 0
7
9
9 8 27 5 7 4 0 4 3 6 1
4
1
2 3
5
1 2 3 4 5 6 7 8 9 10 11 12
12
6 7
8 9 10 11
2 9
28
2
8 2
2
7
7 2
6
2
6 2
2
2
1
1 8
1
7
17
1
6
16
1
2
12
1
1
1
71
7
1
7 1
1
4
4 1
1
1 73
36
3
36
3
5
5 3
4
3
4 3
3
363
35
3
5 3
4
3
4 3
3
3
Ordinamento dell’array
Max-Heapfy(A,i) l = 2i, r =2i+1 m = i if l A.heapsize and A[l] > A[m] m = l if r A.heapsize and A[r] > A[m] m = r if m i t = A[i], A[i] = A[m], A[m] = t Max-Heapfy(A,m)
Build-Max-Heap (A) A.heapsize = A.length for i = A.lenght/2 downto 1 Max-Heapfy(A,i)
Heap-Sort (A) Build-Max-Heap(A) for i = A.length downto 2 t = A[i], A[i] = A[1], A[1] = t A.heapsize = A.heapsize - 1 Max-Heapfy(A,1)
Paragonare tra loro algoritmiAbbiamo una scala di complessità:
vogliamo inserire ogni algoritmo in questa scala
1
log
log
...
2
...
2
3
nn
nn
n
n
n
Un algoritmo può richiedere tempi diversi per input della stessa taglia. Ad esempio il tempo per ordinare n oggetti può dipendere dal loro ordine iniziale.
complessità massima
complessità minima
complessità media
1
log
log
...
2
...
2
3
nn
nn
n
n
n
Nell’analizzare la complessità tempo di un algoritmo siamo interessati a come aumenta il tempo al crescere della taglia n dell’input.
Siccome per valori “piccoli” di n il tempo richiesto è comunque poco, ci interessa soprattutto il comportamento per valori “grandi” di n (il comportamento asintotico)
Inoltre, siccome la velocità del processore influisce sul tempo calcolo per una costante moltiplicativa noi valuteremo la complessità a meno di una tale costante.
Questo giustifica le seguenti definizioni:
Notazione asintotica O (limite superiore asintotico)
} ogniper )()(0
che tali ed 0 esistono:)({ ))((
0
0
nnncgnf
ncnfng
)(nf
)(ncg
0nO(g(n))
Scriveremo f(n) = O(g(n)) per dire che f(n) è una delle funzioni dell’insieme O(g(n))
f(n) = O(g(n)) si legge: f(n) è “o grande” di g(n)
Se f(n) = O(g(n)) rappresenta il tempo calcolo richiesto da un algoritmo diciamo che O(g(n)) è un limite superiore asintotico per la complessità tempo di tale algoritmo.
esempi)(552)( 22 nOnnnf
infatti 22 5520 cnnn per c = 4 ed n0 = 5
)1(sin2)( Onnf infatti 1sin20 cn
per c = 3 ed n0 = 1
)()( 201
22 nOanananf
Vedremo che in generale per a2 > 0
Notazione asintotica .(limite inferiore asintotico)
} ogniper 0)()(
che tali ed 0 esistono:)({ ))((
0
0
nnncgnf
ncnfng
)(nf
)(ncg
0n
Se f(n) = (g(n)) rappresenta il tempo calcolo richiesto da un algoritmo diciamo che (g(n)) è un limite inferiore asintotico per la complessità tempo di tale algoritmo.
Scriveremo f(n) = (g(n)) per dire che f(n) è una delle funzioni dell’insieme (g(n)).
f(n) = (g(n)) si legge: f(n) è “omega” di g(n)
esempi)(552)( 22 nnnnf
infatti 5520 22 nncnper c = 1 ed n0 = 10
)1(sin2)( nnf
infatti nc sin210 per c = 1 ed n0 = 1
)()( 201
22 nanananf
Vedremo che in generale se a2 > 0
Notazione asintotica .(limite asintotico stretto)
)}()()(0
ogniper che tali ed 0,
esistono:)({ ))(())(())((
21
0021
ngcnfngc
nnncc
nfngngOng
)(nf
)(1 ngc
0n
)(2 ngc
Se f(n) = (g(n)) rappresenta il tempo calcolo richiesto da un algoritmo diciamo che (g(n)) è un limite asintotico stretto per la complessità tempo di tale algoritmo.
Scriveremo f(n) = (g(n)) per dire che f(n) è una delle funzioni dell’insieme (g(n)).
f(n) = (g(n)) si legge: f(n) è “theta” di g(n)
esempi)(552 22 nOnn )(552 22 nnn
22
221 5520 ncnnnc
per c1 = 1, c2 = 4 ed n0 = 10
)(552 22 nnn Dunque
)1(sin2 On )1(sin2 n)1(sin2 nDunque
)(552)( 32 nnnnf
per ogni n n0 allora 5520 231 nnnc
altrimenti
321
552
nnnc per ogni n n0. Assurdo!
)(552)( 2 nnnnf
per ogni n n0 allora ncnn 22 5520
altrimenti
n
c
nn2
2
552 per ogni n n0. Assurdo!
Metodo del limiteSpesso è possibile determinare dei limiti asintotici calcolando il limite di un rapporto. Ad esempio se
0)(/)(lim kngnfn
allora per ogni > 0 esiste n0 tale che per n ≥ n0
kngnfk )(/)(
Preso 0 < < k e posto c1 = k e c2 = k + )()()( 21 ngcnfngc
))(()( ngnf e quindi
Se diciamo che
Attenzione: quando il limite del rapporto non esiste questo metodo non si può usare.
)(
)(lim
ng
nfn ))(()( ngnf
))(()( ma ))(()( ngnfngnf ed in questo caso
Se diciamo che0)(
)(lim ng
nfn ))(()( ngonf
))(()( ma ))(()( ngnfngOnf ed in questo caso
In generale )(...)( 01kk
k nanananf
per ogni funzione polinomiale di grado k con coefficiente ak > 0. Inoltre
baba nn per )()(
bann ba e ogniper )(log)(log
)()log( kk nnn
hknn hk per )()(
nbn baa logloglog perché
)()( )log(
)()()(lognnk
kh
bOaOnnO
nOnOnO
)()( )log(
)()()(lognnk
kh
bann
nnn
Per 0 < h < k e 1 < a < b :
esiste un algoritmo che risolve il problema con questa complessità
limite superiore: O(n2)
1
log
log
...
2
...
2
3
nn
nn
n
n
n
Valutare la difficoltà dei problemi
Un limite superiore per il problema dell’ordinamento
Abbiamo visto che Insert-Sort per ordinare n oggetti richiede O(n2) operazioni
Quindi O(n2) è un limite superiore
Valutare la difficoltà dei problemi
ogni algoritmo che risolve il problema ha complessità maggiore o uguale di questalimite inferiore: (n)
1
log
log
...
2
...
2
3
nn
nn
n
n
n