6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6...

25
6 1 3 2 8 4 5 7 4 0 7 9 9 8 2 7 5 7 4 0 4 3 6 1 4 1 2 3 5 3 4 5 6 7 8 9 10 12 6 7 8 9 10 11 2 9 2 8 2 8 2 2 7 7 2 6 2 6 2 2 2 1 1 8 1 7 1 7 1 6 1 6 1 2 1 2 1 1 1 7 1 7 1 7 1 1 4 4 1 1 1 7 3 3 6 3 3 6 3 5 5 3 4 3 4 3 3 3 6 3 3 5 3 5 3 4 3 4 3 3 3 Ordinamento dell’array

Transcript of 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6...

Page 1: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 2: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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)

Page 3: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

Build-Max-Heap (A) A.heapsize = A.length for i = A.lenght/2 downto 1 Max-Heapfy(A,i)

Page 4: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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)

Page 5: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 6: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 7: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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)

Page 8: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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:

Page 9: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

Notazione asintotica O (limite superiore asintotico)

} ogniper )()(0

che tali ed 0 esistono:)({ ))((

0

0

nnncgnf

ncnfng

)(nf

)(ncg

0nO(g(n))

Page 10: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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.

Page 11: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 12: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

Notazione asintotica .(limite inferiore asintotico)

} ogniper 0)()(

che tali ed 0 esistono:)({ ))((

0

0

nnncgnf

ncnfng

)(nf

)(ncg

0n

Page 13: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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)

Page 14: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 15: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

Notazione asintotica .(limite asintotico stretto)

)}()()(0

ogniper che tali ed 0,

esistono:)({ ))(())(())((

21

0021

ngcnfngc

nnncc

nfngngOng

)(nf

)(1 ngc

0n

)(2 ngc

Page 16: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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)

Page 17: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 18: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

)(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!

Page 19: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 20: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 21: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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é

Page 22: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

)()( )log(

)()()(lognnk

kh

bOaOnnO

nOnOnO

)()( )log(

)()()(lognnk

kh

bann

nnn

Per 0 < h < k e 1 < a < b :

Page 23: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 24: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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

Page 25: 6132 8 4 5740 7 9 982757404361 4 1 23 5 1 2 3 4 5 6 7 8 9 10 11 12 12 67 891011 29 28 2 82 2 7 72 6 2 62 2 2 1 18 1 7 17 1 6 16 1 2 12 1 1 1 71 7 1 71.

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