Note della lezione 3

Transcript

Note della lezione 3
Cosa faremo in questa lezione
Definiremo e studieremo le proprietà delle notazioni
asintotiche Ω e Θ al fine di valutare e confrontare tra di loro
la crescita di funzioni elementari
Confronteremo il comportamento asintotico delle più
comuni funzioni attraverso le notazioni Ω e Θ
Tanti esercizi ...
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 1/22
Ricordiamo: notazione O
Date f : n ∈ N → f (n) ∈ R+ , g : n ∈ N → g(n) ∈ R+ ,
scriveremo
f (n) = O(g(n))
⇔ ∃c > 0, ∃n0 tale che f (n) ≤ cg(n), ∀n ≥ n0
Informalmente, f (n) = O(g(n)) se f (n) non cresce più
velocemente di g(n). Graficamente
cg(n)
f (n)
n0
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 2/22
Uso delle Notazioni Asintotiche
Useremo la notazione asintotica O per dare una
limitazione superiore al numero di operazioni
elementari (complessità) eseguite dagli algoritmi
In vari casi sarà necessario esprimere una limitazione
inferiore alla complessità di algoritmi
In tal caso si userà la notazione Ω
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 3/22
Notazioni Asintotiche: notazione Ω
Date f : n ∈ N → f (n) ∈ R+ , g : n ∈ N → g(n) ∈ R+ ,
scriveremo
f (n) = Ω(g(n))
⇔ ∃c > 0 ∃n0 tale che f (n) ≥ cg(n), ∀n ≥ n0
Informalmente, f (n) = Ω(g(n)) se f (n) cresce almeno
tanto velocemente quanto g(n). Graficamente
f (n)
cg(n)
n0
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 4/22
Bisogna rifare tutto d’accapo per Ω?
No
Perchè vale la Regola della Dualità
f (n) = Ω(g(n)) se e solo se g(n) = O(f (n))
Infatti f (n) = Ω(g(n)) ⇔ f (n) ≥ cg(n) , per costante c
opportuna ed n sufficientemente grande
⇔ g(n) ≤ (1/c)f (n) per costante c opportuna ed n
sufficientemente grande
⇔ g(n) = O(f (n))
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 5/22
Ad esempio, ricordando che :
c = O(1), c = O(log log n), log log n = O(log n),
√
c
log n = O( n),
√
c
n = O(n), n = O(n log n), n log n = O(n2 )
n2 = O(n3 ), nk = O(nk+1 ), nk = O(an ), an = O(n!)
otteniamo che:
n! = Ω(an ), an = Ω(nk ), nk+1 = Ω(nk ), n2 = Ω(n log n)
√
c
n log n = Ω(n), n = Ω( n),
√
c
n = Ω(log n), log n = Ω(log log n)
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 6/22
Ancora
∀a, b > 1
∀a > 1, k > 0
∀k, t > 0
∀k, a, b > 0
a > b ⇒ an = Ω(bn )
an = Ω(nk )
k > t ⇒ nk = Ω(nt )
n1/k = Ω(loga nb )
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 7/22
Utili regole per Ω
1. d(n) = Ω(f (n)) ⇒ ad(n) = Ω(f (n)), ∀ costante a > 0
√
√
Es. n = Ω(log n) ⇒ (1/10) n = Ω(log n)
2. d(n) = Ω(f (n)), e(n) = Ω(g(n)) ⇒ d(n) + e(n) = Ω(f (n) + g(n))
√
√
Es. n = Ω(log n), n = Ω(n) ⇒ n + n = Ω(n + log n)
3. d(n) = Ω(f (n)), e(n) = Ω(g(n)) ⇒ d(n)e(n) = Ω(f (n)g(n))
√
√
√
√
4
Es. n = Ω(log n), n = Ω( n) ⇒ n = Ω( n log n)
4. d(n) = Ω(f (n)), f (n) = Ω(g(n)) ⇒ d(n) = Ω(g(n))
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 8/22
Notazione Θ
Date due funzioni f (n) scriveremo
f (n) = O(g(n))
se f (n) non cresce più velocemente di g(n)
Scriveremo invece
f (n) = Ω(g(n))
se f (n) cresce almeno tanto velocemente di g(n)
Scriveremo infine
f (n) = Θ(g(n))
se f (n) e g(n) crescono alla stessa “velocità”
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 9/22
Notazioni Asintotiche: notazione Θ
Date f : n ∈ N → f (n) ∈ R+ , g : n ∈ N → g(n) ∈ R+ ,
scriveremo
f (n) = Θ(g(n))
⇔ ∃n0 , c1 , c2 > 0 : c1 g(n) ≤ f (n) ≤ c2 g(n), ∀n ≥ n0
Equivalentemente
f (n) = Θ(g(n)) ⇔ f (n) = O(g(n)) e f (n) = Ω(g(n))
c2 g(n)
f (n)
c1 g(n)
n0
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 10/22
Esempi di Uso delle Notazioni O, Ω e Θ
È perfettamente legittimo dire che
√
3
n + n n log n + 10 = O(n3 ),
√
3
ma è più preciso dire che n + n n log n + 10 = Θ(n3 )
È corretto dire che n
1
log n
= O(n),
ma è più preciso dire che
n
1
log n
= 2
log n
log1 n
= 2 = Θ(1)
È quindi una questione di precisione nel linguaggio...
Vedremo in seguito situazioni in cui tale precisione nel
linguaggio è cruciale
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 11/22
Altri esempi
È ovvio che 2n = O(3n ).
Forse meno ovvia è la relazione
2n = O(3n /nk ),
∀k ≥ 1
(1)
Ricordiamo che ∀a > 1, k ≥ 1 vale nk = O(an ), ovvero
(2)
che ∀a > 1, k ≥ 1 ∃c, n0 : nk ≤ can , ∀n ≥ n0
n
n
k
La (1) è vera ⇔ ∃C, m0 : 2 ≤ C 3 /n , ∀n ≥ m0
⇔ ∃C, m0 : nk ≤ C (3n /2n ) , ∀n ≥ m0
⇔ ∃C, m0 : nk ≤ C (3/2)n , ∀n ≥ m0
il che è vero dalla (2)
In generale
an = O(bn /nk )
∀a < b
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 12/22
Ancora altri esempi
Abbiamo visto che
2n = O(3n )
Vale anche
3n = O(2n )?
Proviamo ...
n
3 =
3
2
2
n
n
3
=
2n ≤ c2n ,
2
∀n ≥ n0
Ovviamente falsa, in quanto per ogni costante c,
(3/2)n > c, per n sufficientemente grande.
quindi
In generale
3n 6= O(2n )
an = O(bn ) ma bn 6= O(an ), per a < b
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 13/22
Ancora altri esempi
Cosa possiamo dire circa il comportamento asintotico
del fattoriale
n! = n · (n − 1) · . . . · 2 · 1?
Si ha
n! = n · (n − 1) · . . . · 2 · 1
n
≥ n · (n − 1) · . . . ·
(scrivendo solo i primi n/2 termini)
2
n n2
≥
2
≥ b · an (∀b, a > 0 costanti ed n sufficientemente grande)
Quindi
∀ costante a > 0
an = O(n!) ma n! 6= O(an )
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 14/22
Al limite...
Le regole prima esposte dovrebbero essere sufficienti a
stabilire relazioni asintotiche tra le funzioni più comuni. Se
proprio tutto fallisce possiamo procedere così:
se limn→∞
f (n)
g(n)
= c 6= 0 allora
f (n) = O(g(n)) e g(n) = O(f (n))
se limn→∞
f (n)
g(n)
(ovvero f (n) = Θ(g(n)))
= 0 allora
f (n) = O(g(n)) ma g(n) 6= O(f (n))
se limn→∞
f (n)
g(n)
= ∞ allora
f (n) 6= O(g(n)) ma g(n) = O(f (n))
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 15/22
Esempio
Sia f (n) = log n e g(n) =
abbiamo
√
n. Usando la regola de l‘Hôpital
log n
f (n)
= lim √
lim
n→∞
n→∞ g(n)
n
1/n
√
= lim
n→∞ 1/(2 n)
2
= lim √ = 0
n→∞ n
da cui otteniamo immediatamente
√
log n = O( n)
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 16/22
Prova della prima relazione
Assumiamo limn→∞ f (n)/g(n) = ℓ 6= 0 e sia δ = ℓ e c = 2ℓ. Dalla
definizione di limite, |f (n)/g(n) − ℓ| ≤ δ per n sufficientemente
grande. Ciò significa che f (n)/g(n) ≤ ℓ + δ = c, per n grande
abbastanza. Quindi f (n) ≤ cg(n) per n sufficientemente grande, da
cui f (n) = O(g(n)) .
Il fatto che g(n) = O(f (n)) è automatico, in quanto
lim f (n)/g(n) = ℓ ⇒ lim g(n)/f (n) = 1/ℓ,
n→∞
n→∞
e quindi il precedente ragionamento si applica, mutatis mutandis
con i ruoli di f (n) e g(n) invertiti.
La prova delle altre due relazioni è analoga. Suggeriamo di
svilupparla per familiarizzarsi con i concetti.
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 17/22
Esercizi
Vero o Falso?
3n5 − 16n + 2 = O(n5 )?
3n5 − 16n + 2 = O(n)?
3n5 − 16n + 2 = O(n17 )?
3n5 − 16n + 2 = Ω(n5 )?
3n5 − 16n + 2 = Ω(n)?
3n5 − 16n + 2 = Ω(n17 )?
3n5 − 16n + 2 = Θ(n5 )?
3n5 − 16n + 2 = Θ(n)?
3n5 − 16n + 2 = Θ(n17 )?
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 18/22
Esercizio
Date le seguenti funzioni
√
√
√
log n5 , nlog n , log2 n, 10 n, (log n)n , nn ,n log n,n log3 n,n2 log n, n log n, 10 log log n,3 log n,
ordinarle scrivendole da sinistra a destra in modo tale che la funzione f (n) venga posta a
sinistra della funzione g(n) se f (n) = O(g(n)).
√ √
√
10 log log n, 3 log n, log n5 , log2 n, 10 n, n log n, n log n, n log3 n, n2 log n, nlog n , (log n)n , nn
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 19/22
Ancora esercizi....
Date le seguenti funzioni:
√
n − n log n, log(n!/2n )4 , log log2 n3 , n2 + log n2 , 3n + 5n , n log 3n , n!, 4n2 +
√
6n n, 10n + 3 log log2 n, log log n,
√
√
4n + 20 log n + 3 n, log(n!), 5 · 2n , 5n2 + n log n + n3/2 , 4log n , n log(n + 2)3 , 4n , 8n log 3 n
partizionarle in insiemi disgiunti A1 , A2 , . . . tali che entrambe le seguenti condizioni valgano
1. f (n), g(n) ∈ Ai ⇐⇒ f (n) = Θ(g(n))
2. f (n) ∈ Ai , g(n) ∈ Aj , con i < j ⇐⇒ f (n) = O(g(n)) ma f (n) 6= Θ(g(n))
Innanzitutto partizioniamo in insiemi per cui valga la condizione 1.
√
√
A = {n − n log n, 10n + 3 log log2 n, 4n + 20 log n + 3 n}
√
B = {log(n!/2n )4 , log(n!), n log(n + 2)3 , 8n log 3 n}
√
C = {log log2 n3 , log log n} D = {n2 + log n2 , n log 3n , 4n2 + 6n n,
5n2 + n log n + n3/2 , 4log n }
E = {3n + 5n } F = {n!} G = {5 · 2n } H = {4n }
Ordiniamo adesso in accorso alla condizione 2.
A1 = C A2 = A, A3 = B A4 = D A5 = G A6 = H A7 = E, A8 = F
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 20/22
Ancora esercizi....
Date f (n) e g(n), funzioni asintoticamente non negative,
provare che
max{f (n), g(n)} = Θ(f (n) + g(n))
∀a, b, con b > 0, provare che
(n + a)b = Θ(nb )
Vero o Falso?
2n+1 = O(2n )
22n = O(2n )
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 21/22
Proviamo che (n + a)b = Θ(nb )
Cosa dobbiamo esattamente provare? Occorre provare
che
∃n0 , c1 , c2 > 0 tale che c1 nb ≤ (n + a)b ≤ c2 nb , ∀n ≥ n0
Che c1 nb ≤ (n + a)b è ovvio, basta prendere c1 = 1.
Osserviamo ora che (n + a)b ≤ (n + n)b = (2n)b per n ≥ a,
ovvero
(n + a)b ≤ 2b nb = c2 nb , ∀n ≥ a
.
Università di Salerno – Corso di Algoritmi – Prof. Ugo Vaccaro – Anno Acc. 2014/15 – p. 22/22