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