1-NotazioneAsintotica CostoComputazionale
1-NotazioneAsintotica CostoComputazionale
1-NotazioneAsintotica CostoComputazionale
A partire da n=n0 la funzione f (n) non sta MAI sopra la funzione c∗g ( n )
Esempio:
Date le funzioni f ( n )=2 n2 +3 n+6 e g ( n )=n2, dimostriamo che 2 n2 +3 n+6 ∈O ( n 2)
Facciamo vedere che esistono due costanti c >0 e n 0 ∈ N
tali che per ogni n ≥ n0 vale la relazione 2 n2 +3 n+6 ≤ c∗n 2
1. Dato che n ≤ n2 , ∀ n ≥ 0
2 2 2
2 n +3 n+6 ≤ 2 n + 3 n + 6
2. Assumendo che n2 ≥ 6, ovvero n=3
2 2 2 2
2 n +3 n+6 ≤ 2 n + 3 n + n
2 2
2 n +3 n+6 ≤ ( 2+3+1 )∗n
2 2
2 n +3 n+6 ≤ 6∗n
Dove 6 è la nostra costante c
1
O-grande : O(⋅) (2/3)
Proposizione : O(n k )
k k−1 k
Per ogni costante k ≥ 1 abbiamo che a k n + ak−1 n +…+ a1 n+ a0 ∈O(n )
Abbiamo che un polinomio di grado massimo k ∈O(nk )
o Esempio:
(
7 n10 +8 n5 +5
n10 ) 8 5
n n → n →+∞
8 5
=7+ 5 + 10 passando per il limite lim 7+ 5 + 10 =7
n n
o Intuizione:
Ogni polinomio di grado massimo k cresce come il polinomio n k (a meno di una
costante moltiplicativa)
Proposizione : O(n)
Dato log n , intendiamo il logaritmo in base 2, quindi log 2 n.
Abbiamo che log n ∈O(n)
o Dimostrazione:
Facciamo vedere che esistono due costanti c >0 e n 0 ∈ N
tali che per ogni n ≥ n0 vale la relazione log n ≤ c∗n
Dimostrazione per Induzione
CASO BASE
Dato che log n ≤ n , ∀ n ≥ 1, prendiamo c=1 e n 0=1
log n=log 1=0 ≤ 1=c∗n
0 ≤ 1→ Vero
IPOTESI INDUTTIVA
log n ≤ n
TESI DA DIMOSTRARE
log (n+1)≤ ( n+1 )
DIMOSTRAZIONE
log (n+1)≤ log (n+ n)
log (n+1)≤ log (2 n)
log (n+1)≤ log 2+log n
log (n+1)≤ ( n+1 ) →Vero , per l ' ipotesi induttiva
Notazioni : O(⋅)
Si possono dimostrare altri risultati che sono riassunti nella seguente tabella:
2
O-grande : O(⋅) (3/3)
Proprietà utili
Proprietà utili per determinare l’ordine di grandezza delle funzioni:
I. Proposizione :
Per ogni costante a> 0 vale che, se f (n)∈ O ( g ( n ) ) allora a∗f (n)∈ O( g(n))
Esempio:
log n ∈O( n)⇒ 7 log n ∈ O(n)
V. Proposizione :
Per ogni coppia di costanti a> 1 e x >0 vale che n x ∈ O(an )
Esempio:
n100 =O(2 n)
3
Omega : Ω(⋅) (1/1)
Definizione:
Date due funzioni f : N → R +¿¿ e g : N → R+¿ ¿ diremo che f (n)∈ Ω(g(n))
se e solo se
Esistono due costanti c >0 e n0 ∈ N tali che f ( n ) ≥ c∗g ( n ) per ogni n ≥ n0.
Proposizione :
f (n)∈ Ω ( g ( n ) ) se e solo se g(n)∈O ( f ( n ) ).
⇔
o Dimostrazione:
f (n )∈ Ω( g (n ))
⇔ ∃c >0 , n0 ≥ 0∨f ( n ) ≥ c∗g ( n ) , ∀ n ≥ n0 per definizione di Ω(⋅)
1 1
⇔ ∃c ' = >0 , n0 ≥ 0∨ ∗f ( n ) ≥ g ( n ) , ∀ n ≥ n0 dividendo ambo ilati per c
c c
⇔ g ( n ) ∈ O ( f ( n ) ) per definizione diO(⋅)
Notazioni : Ω(⋅)
La proposizione precedente permette di enunciare i risultati che sono riassunti nella
seguente tabella:
4
Teta : Θ(⋅) (1/1)
Definizione:
Date due funzioni f : N → R +¿¿ e g : N → R+¿ ¿ diremo che f (n)∈ Θ(g(n))
se e solo se
Esistono tre costanti c 1 , c2 >0 e n0 ∈ N tali che c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) per ogni n ≥ n0.
Esempio:
Per dimostrare che 4 n2 +log n ∈Θ ( n2 ) facciamo vedere che
4 n +log n ∈ Ω ( n ) e 4 n +log n ∈O ( n )
2 2 2 2
4 n2 +log n ∈ Ω ( n 2)
2 2
4 n +log n ≥ 4 n ∀ n ≥1 , c=4
4 n +log n ∈O ( n )
2 2
2 2 2
4 n +log n ≤ 4 n + n≤ 5 n ∀ n≥ 1 , c=5
Abbiamo che:
c 1=4 , c 2=5 , n0=1
5
Costo Computazionale
Siamo interessati a contare il numero di operazioni elementari (assegnamenti e operazioni
logico-aritmetiche) eseguite durante l’esecuzione di un algoritmo.
Analisi del Caso Peggiore (worst case)
È l'analisi più importante e rappresenta un limite superiore (upper bound) per una
qualsiasi istanza di input. Si cerca la funzione più piccola possibile
Analisi del Caso Medio (average case)
È un'analisi spesso difficile da calcolare (qual è il caso medio?).
Distribuzione delle istanze di input.
Analisi del Caso Migliore (best case)
È un'analisi poco significativa e rappresenta limite superiore (upper bound) per una sola
istanza di input (o un sottoinsieme proprio delle istanze).
Introduciamo:
T ( n )=¿ numero massimo di operazioni eseguito dalla porzione di codice, in funzione di n
Esempio 1:
Contiamo gli assegnamenti e le operazioni logico-aritmetiche e troviamo la f (n) più piccola
possibile tale che T ( n ) ∈ O ( f ( n ) ) .
for i=0 to n-1
c := c+1
d := d+1
c := c+d
Costo Computazionale:
CICLO:
Le istruzioni nel corpo del ciclo for sono eseguite n volte. Il corpo del ciclo è costituito da
due istruzioni che svolgono 2 operazioni l'una (4 operazioni in totale).
ISTRUZIONE ESTERNA:
L'istruzione c:=c+d è composta da 2 operazioni.
T ( n )=4 n∗2∈O ( n ) → Lineare
6
Esempio 2:
Contiamo gli assegnamenti e le operazioni logico-aritmetiche e troviamo la f (n) più piccola
possibile tale che T ( n ) ∈ O ( f ( n ) ) .
for i=0 to n-1
for j=i to n-1
x := x+1
x := y+1
Costo Computazionale:
CICLO INTERNO:
Fissato i, le istruzioni nel corpo del for sono eseguite n−1 volte. Il corpo del ciclo è costituito da
una istruzione che svolge 2 operazioni. In un ciclo si hanno 2(n−1) operazioni, calcoliamo quindi il
numero di operazioni per tutte le iterazioni:
i=0 : 2 n operazioni+ ¿
i=1 : 2∗ ( n−1 ) operazioni +¿
i=2 : 2∗ ( n−2 ) operazioni +¿
i=2 : 2∗ ( n−3 ) operazioni +¿
…
i=n-2 : 2∗ ( n− ( n−2 ) ) operazioni +¿
i=n-1 : 2∗ ( n− ( n−1 ) ) operazioni +¿
Da cui raccogliendo il 2:
n
2∗n ( n+ 1 )
2∗( n+ ( n−1 )+ ( n−2 )+ ( n−3 ) + …+ 2+1 )=2 ∑ i= =n(n+1)
i=1 2
CICLO ESTERNO:
L'istruzione y:=y+1 è composta da 2 operazioni e viene eseguita ad ogni iterazione, il ciclo
esterno viene ripetuto esattamente n volte.
T ( n )=n ( n+1 ) +2 n=n +n+2 n=n +3 n ∈O ( n ) →Quadratico
2 2 2
Esempio 3:
Calcolare quante volte viene seguito il ciclo while:
x := 0
y := 1
while y < n+1
x := x+1
y := 2*y
return x
Costo Computazionale:
Prima del while : y=1
1° iterazione : y=2
2° iterazione : y=2∗2
3° iterazione : y=2∗2∗2
…
y -esima iterazione : y=2i
Calcoliamo dopo quanti cicli k abbiamo che 2k +i= y ≥n+ 1> 2k , ovvero calcoliamo se k è stata
l'ultima iterazione del ciclo:
2 ≤ n→ log ( 2 ) ≤ log ( n ) →k ≤ log ( n ) →T ( n ) ∈ O ( log ( n ) ) → Logaritmico
k k
7
Considerazioni Generali
Scansione di una Sequenza di Elementi
n elementi, ciascuno analizzato f (n) volte
per ogni elemento scansionato, max num. operazioni g(n)
T ( n ) ∈ O(n∗f ( n )∗g (n)) SE f ( n ) , g ( n ) ∈O ( 1 ) ⇒T ( n ) ∈O ( n ) → Lineare
8
Algoritmi & Problemi
Costo Computazionale di Algoritmi (worst case)
Per input di dimensione n
O( f (n)) Per NESSUN input l’algoritmo costa PIÙ di f (n) (upper bownd)
Ω(f (n)) ESISTE un input per cui l'algoritmo costa ALMENO f (n) (lower bownd)
Θ( f (n)) L'algoritmo ha costo O( f (n)) e Ω( f (n))