Sei sulla pagina 1di 27

Algoritmi e Strutture Dati

Lezione 3
Analisi degli algoritmi
Oggi parleremo di …

Analisi degli algoritmi


 complessità
 iterativi
 ricorsivi (equazioni di ricorrenza)

2
Algoritmo 4: analisi completa

algoritmo Count_4( intero N)  intero


1 sum  0 O(1)
2 for i  1 to N O(N)
3 for j  1 to N O(N2)
4 if i ≤ j then O(N2)
 N(N 1) 
5 sum  sum+1 O   O(N )
2

 2 
6 return sum O(1)

Il tempo di esecuzione è O(N2)


3
Tempi di esecuzione asintotici

Tempo di
Algoritmo Esecuzione Limite asintotico
3 2 7
Count_1 N  N 2 O(N2)
2 2
Count_2 6N+2 O(N)

Count_3 5 O(1)

4
Stima del limite asintotico superiore

Come definire un semplice metodo per stimare il limite


asintotico superiore O del tempo di esecuzione di
algoritmo iterativi
 stabilire il limite superiore per le operazioni elementari
 stabilire il limite superiore per le strutture di controllo.

Ci dà un limite superiore che funge da stima, non


garantisce di trovare la funzione precisa del tempo di
esecuzione.

5
Tempo di esecuzione
Operazioni Semplici

• operazioni aritmetiche (+,*, …)


• operazioni logiche (&&, ||, ….)
• confronti (, , =, …)
• assegnamenti (a  b) senza chiamate di funzione
• operazioni di lettura (read)
• operazioni di controllo (break, continue, return)

T(n) =  (1)  T(n) = O(1)

6
Tempo di esecuzione: ciclo for
Ciclo-for

inizializza O(1)

O(1)
test
g(n)
volte

stabilire g(n) è in corpo O(f(n))


genere semplice

reinizializza O(1)

T(n) = O(g (n)  f (n))


7
Tempo di esecuzione: ciclo while

ciclo-while Bisogna stabilire un limite per


il numero di iterazioni del
ciclo, g(n)
O(1)
test
g(n)
volte

corpo O(f(n))
T(n) = O(g (n)  f (n))

8
Ciclo while: esempio

Ricerca dell’elemento x all’interno di un array A[0…n-1]:

(1) i0
(2) while x  A[i] do
(3) i  i+1

(1) O(1)
test in (2) O(1)
(3) O(1)
iterazioni massimo n
O(ciclo-while) = O(1) + n O(1) = O(n)
9
Tempo di esecuzione: cicli innestati

inizializza O (1)

O (1)
test

T(n) = O(g (n)  f (n))


g(n)
volte ciclo-interno O (f (n))

reinizializza O (1)

10
Cicli innestati: esempio

for i 1 to n do


  O(n )
2
for j 1 to n do
ki+j   O(n)
 

T(n) = O (n  n) = O (n2)

11
Tempo di esecuzione: if-then-else

if-then-else

test

O(f(n)) parte-if parte-else O(g(n))

O (max (f (n), g (n)))


12
if-then-else: esempio

if (A[1][i] = 0) then
for i  1 to n do
for j  1 to n do  
  O ( n )   O(n )
2
A[i][j]  0 
else

for i  1 to n do 
A[i][i]  1   O (n )

if : T(n) = O(n2)
else : T(n) = O(n)

T(n) = max (O(n2), O(n)) = O(n2)


13
Tempo di esecuzione: blocchi

O(f1 (n))

O(f2 (n)) O (f1 (n) + f2 (n) + … + fm (n))

O(f3 (n))
O(max(fi (n)) i = 1, …., m

O(fm (n))

14
Blocchi sequenziali: esempio

for i  1 to n do 
  O (n )
A[1]  0 
for i  1 to n do
for j  1 to n do  
  O (n )  O (n )
2

A[i]  A[i] + A[i]  

T(n) = O (max (f (ciclo-1), f (ciclo-2)))


= O (max (n, n2))
= O (n2)

15
Ordinamento per selezione

algoritmo selectionSort(array A)

for i  0 to n-2 do

 O(n )
min  i 2
for j  i+1 to n-1 do 
  O (n)

if (A[j] < A[min]) then min  j
scambia A[min] con A[i] 

T(n)=O(n2)

16
E per gli algoritmi ricorsivi?

Il tempo di esecuzione è espresso tramite una


equazione di ricorrenza.

Un’equazione di ricorrenza è una funzione


definita in termini di se stessa (Es. fattoriale).

Sono necessarie tecniche specifiche per risolvere


le equazioni di ricorrenza.

17
Algoritmi ricorsivi e complessità

Esempio: Fattoriale

algoritmo fact(intero n)  intero

if (n≤1) then return 1 /* Caso Base */


else return n × fact(n-1) /* Passo Induttivo */

O(1) se n 1
T ( n) 
O(1) T ( n 1) se n 1
18
Soluzione di equazioni di ricorrenza

Il metodo è iterativo
 Si itera la regola induttiva di T(n) in termini di n e del caso base
 Richiede manipolazione delle somme.

19
Soluzione di equazioni di ricorrenza

Base: T(1) = a
Induzione: T(m) = b + T(m-1)

I. Sostituire m per n, n-1, n-2, … finché si ottiene il caso base

1) T(n) = b + T(n-1) sostituire m con n


2) T(n-1) = b + T(n-2) sostituire m con n-1
3) T(n-2) = b + T(n-3) sostituire m con n-2
…..
n-1) T(2) = b + T(1) sostituire m con 2
T(1) = a noto

20
Soluzione di equazioni di ricorrenza
II. Sostituire T(n-1), T(n-2)... fino al caso base e sostituirlo

T(n) = b + T(n-1) =
b + b + T(n-2) = 2×b + T(n-2) =
2×b + b + T(n-3) = 3×b + T(n-3) =
3×b + b + T(n-4) = 4×b + T(n-4) =
……
T(n) = (n-1) × b + T(1)

Inserire il caso base

T(n) = (n-1) × b + a

III. Valutare l’espressione O-grande associata

T(n) = b × n - b + a = O(n) 21
Soluzione di equazioni di ricorrenza
Esempio 1: Fattoriale
algoritmo fact(intero n)  intero

if (n≤1) then return 1 /* Caso Base


else return n*fact(n-1) /* Passo Induttivo

O (1) se n  1
T ( n)  
O (1)  T (n  1) se n  1
Equazione di ricorrenza

Base: T(1) = a
Induzione: T(m) = b + T(m-1) 22
Esempio 1: Analisi del fattoriale

Caso Base: T(0) = O(1)


T(1) = O(1)

Passo Induttivo: O(1) + max(O(1), T(n-1))


O(1) + T(n-1) per n>1

Per il fattorale, l’analisi risulta T(n) = O(n)

23
Esempio 2
T (n)  T (n  1)  n per n  2 con T (1)  1

T (n)  T (n  1)  n T (n  1)  T (n  2)  (n  1)
 T (n  2)  (n 1)  n T (n  2)  T (n  3)  (n  2)
 T (n  3)  (n  2)  (n  1)  n



 T (1)  2  ...  (n  2)  (n  1)  n
 1  2  ...  (n  2)  (n  1)  n
n(n  1)
 T(n)=O(n2)
2
24
Esempio 3
n
T ( n)  T    1 per n  2 con T (1)  0
2
h Ipotesi: n=2h h0
2
T (2 )  T ( )  1
h

2
h 1
 T (2 )  1
h2 h2
 T (2 )  1  1  T (2 )  2
h 3
 T (2 )  3
 E’ la complessità
 dell’algoritmo di ricerca
 binaria!
 T (2 h  h )  h
 T (1)  h
T(n)=O(logn)
 log n
25
Esempio 3

T (n)  O(log n) per n=2h h0

T ( n)  ? per n2h

Si consideri l’intervallo n1<n<n2 tale che n1  2 h , n2  2 h 1


cioè n2  2n1
Poiché T(n) è una funzione crescente di n, T ( n)  O (log n2 )
Inoltre, log n2  log 2n1  log 2n  1  log n

T(n)O(logn) per qualsiasi valore di n


26
Riassumendo …

Calcolo della complessità


 iterativi (metodo iterativo)
 ricorsivi (equazione di ricorrenza).

La prossima volta introdurremo le strutture dati


 array e matrice.

27