Sei sulla pagina 1di 9

Notazione Asintotica

La notazione asintotica ci permette di esprimere limiti superiori e inferiori al costo computazionale di


algoritmi e problemi, consentendoci di:
 Stimare il tempo massimo necessario per l’esecuzione di un algoritmo
 Conoscere la crescita del tempo di esecuzione al crescere della dimensione delle istanze di input
 Confrontare le prestazioni di algoritmi diversi per uno stesso problema
 Stabilire la difficoltà dei problemi

O-grande : O(⋅) (1/3)


 Definizione:
Date due funzioni f : N → R +¿¿ e g : N → R+¿ ¿ diremo che f (n)∈ O(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.

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)

II. Proposizione : Somma di Funzioni


Se d (n) ∈O( f (n)) e e (n)∈O( g(n)) allora d ( n ) +e (n) ∈O ( max { f ( n ) , g ( n ) } )
 Esempio:
log n ∈O ( n ) , √ n∈ O ( n ) ⇒ log n+ √ n ∈O(n)
log n ∈O ( n ) , n ∈O ( n ) ⇒log n+ n ∈ O ( n )
2 2 2

III. Proposizione : Prodotto di Funzioni


Se d (n) ∈O( f (n)) e e (n)∈O( g(n)) allora d ( n )∗e(n)∈O ( f ( n )∗g ( n ) )
 Esempio:
log n ∈O ( √ n ) , √ n∈ O( √ n)⇒ √ n log n ∈O( n)

IV. Proposizione : Transitività


Se d (n) ∈O( f (n)) e f (n)∈ O( g(n)) allora d (n) ∈O( g( n))
 Esempio:
log n ∈O ( √ n ) , √ n∈ O(n)⇒ 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.

A partire da n=n0 la funzione f ( n ) non sta MAI sotto la funzione c∗g ( n )

 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.

A partire da n=n0 la funzione f (n) non sta MAI sopra la funzione c 1 g ( n )


e MAI sotto la funzione c 2 g ( n )

 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

Scansione di Tutte le Coppie


 n elementi nell'insieme, n2 coppie
 ogni coppia analizzata f (n) volte
 per ogni coppia, max num. operazioni g(n)
T ( n ) ∈ O(n ∗f ( n )∗g (n)) SE f ( n ) , g ( n ) ∈O ( 1 ) ⇒T ( n ) ∈O ( n2 ) →Quadratico
2

Scansione di Tutte le Terne


 n elementi nell'insieme, n3 terne
 ogni terna analizzata f (n) volte
 per ogni terna, max num. operazioni g ( n )
T ( n ) ∈ O(n3∗f ( n )∗g (n)) SE f ( n ) , g ( n ) ∈O ( 1 ) ⇒T ( n ) ∈O ( n3 ) →Cubico

Scansione di Tutti i Sottoinsiemi


 n elementi nell'insieme, 2n sottoinsiemi diversi
 ogni sottoinsieme analizzato f ( n ) volte
 per ogni sottoinsieme, max num. operazioni g ( n )
T ( n ) ∈ O(2n∗f ( n )∗g( n)) SE f ( n ) , g ( n ) ∈O ( 1 ) ⇒T ( n ) ∈O ( 2n ) → Esponenziale

Scansione di Tutte le Permutazioni


 n elementi nell'insieme, n ! permutazioni diverse
 ogni permutazione analizzata f (n) volte
 per ogni permutazione, max num. operazioni g ( n )
( n ) ∈O(n!∗f ( n )∗g (n)) SE f ( n ) , g ( n ) ∈O ( 1 ) ⇒ T ( n ) ∈O ( n! ) → Fattoriale

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

Costo Computazionale dei Problemi:


Per input di dimensione n
O( f (n)) Costo computazionale del MIGLIOR algoritmo noto per il problema (upper bound)
Dimostrazione che NESSUN algoritmo per il problema può costare meno di
Ω(f (n))
Ω(f (n)) (lower bound) nel caso peggiore
Esiste un algoritmo ottimo per il problema (tight bound), ovvero l’algoritmo ha un
Θ( f (n))
upper bound uguale al lower bound per il problema

Problemi Facili & Difficili


In base a risultati sul costo computazionale, i problemi possono essere classificati per difficoltà.
La difficoltà dipende dal fatto di essere in grado o meno di trovare un algoritmo efficiente (in
termini di TEMPO) per il problema, non a quanto sia difficile trovare UN algoritmo qualsiasi.

Esiste un algoritmo per il problema di costo polinomiale


Problemi Trattabili
(es. T ( n ) ∈ O ( n k ) , k ≥ 0 )
NON abbiamo un algoritmo di costo polinomiale,
Problemi Presumibilmente Trattabili
ma NON è stato dimostrato che non esiste.
Si può dimostrare che NON esiste un algoritmo per il
Problemi Intrattabili
problema di costo polinomiale.
Si può dimostrare che NON esiste un algoritmo per il
Problemi Irrisolvibili
problema (indipendentemente dal costo).

Potrebbero piacerti anche