Ricominciamo da quanto fatto Riflettiamo su quanto fatto Problemi incontrati Algoritmi Max Subarray Stable Matching n2 possibilità n! possibilità ~n operazioni ~n2 operazioni Problemi incontrati Algoritmo Brute Force Algoritmi Max Subarray Stable Matching n2 possibilità n! possibilità Algoritmo Brute Force ~n operazioni ~n2 operazioni Migliore Algoritmo visto Migliore Algoritmo visto Es. di Ordine di crescita. Di quanto aumenta il running time se la taglia ~nlog(n) operazioni dell’input raddoppia? ・~n2 ~n2 operazioni Stime ragionevoli del comportamento dei programmi. Dal confronto dei running time dei programmi corrispondenti dice che il running time aumenta di un fattore 4 - n1 = 10 --> n2 = 20 Q. In che senso queste funzioni stimano abbastanza bene il comportamento reale? Q. Perché ci accontentiamo di tali stime? ・~n dice che il running time aumenta di un fattore 2 ・~n! dice che il running time aumenta di un fattore > nn - n1 = 10 --> n2 = 20 Forniscono l’ordine di crescita asintotica del running time 2 (n1)2 = 100, (n2)2 = 400 = 4x(n1)2 - n1 = 10 --> n2 = 20 (n2) = 2x(n1) n1! = 10x9x...x2x1 n2! = 20x19x...x11x10! Un criterio di efficienza Un criterio di efficienza Dicotomia tipica tra esponenziale e polinomiale. Proprietà di crescita desiderabile. Se la taglia dell’input raddoppia, il running 3 time dovrebbe peggiorare di un fattore costante C (indipendente dalla taglia Esiste un algoritmo naturale che prova tutte le possibili soluzioni (brute dell’input) force) ・in molti casi esistono 2n possibilità (o di più) per un input di taglia n. ・un tale algoritmo è, in pratica, inaccettabile ・l’ordine di crescita del running time è 2n Def. Un algoritmo è polinomiale (tempo polinomiale) se vale la proprietà di crescita di cui sopra. - se l’input raddoppia il running time cresce del quadrato Esistono costanti c > 0 e d > 0 tali che su ogni input di taglia n, il running time è quello di scegliamo c = 2d al più c nd passi computazionali elementari Proprietà di crescita desiderabile. Se la taglia dell’input raddoppia, il running time dovrebbe peggiorare di un fattore costante C (indipendente dalla taglia dell’input) 4 5 Running time polinomiale Notazioni Asintotiche: O (o-grande), Ω (omega), e Θ (teta) Diremo che un algoritmo è efficiente se il running time è polinomiale. Prossimo passo. valutare e confrontare l’ordine di crescita asintotico di funzioni elementari. Esistono costanti c > 0 e d > 0 tali che Uso finale. stima della velocità di crescita di funzioni che esprimono le su ogni input di taglia n, il running time è quello di risorse consumate da un algoritmo rispetto alla taglia dell’input al più c nd passi computazionali elementari Perché analisi asintotica. ・Perché di solito usiamo gli algoritmi per risolvere istanze di taglia Perché proprio questa definizione?. Tale scelta funziona in pratica! grande ・In pratica, gli algoritmi polinomiali sviluppati fino ad ora hanno costanti ・Perché le istanze piccole potrebbero essere una sorta di eccezione ed esponenti piccoli. ・ rispetto al comportamento tipico di un algoritmo Superare la barriera esponenziale dell’algoritmo esaustivo (brute force) Vogliamo poter ragionare come segue: Algo A cresce come f(n) rivela elementi strutturali del problema (fa capire di più). Algo B cresce come g(n) f(n) cresce meno velocemente di g(n) Q. Quale running time considerereste più efficiente 20 n100 oppure n1 + 0.02 ln n ? quindi A è più efficiente di B 6 Perché un tale approccio dovrebbe funzionare? 7 Notazione O-grande (Big-Oh notation) Usata per limitare superiormente il tasso di crescita Def. Date due funzioni (asintoticamente non negative) f(n) e g(n) c · g (n) f(n) è O( g (n)) [scritto anche f(n) = O( g (n)) ] f(n) se esistono constanti c > 0 e n0 ≥ 0 tali che f(n) ≤ c · g(n) per ogni n ≥ n0. n0 Ex. f(n) = 32n2 + 17n + 1. scegliendo c = 50, n ・f(n) è O(n2). ・f(n) è anche O(n3). ・f(n) non è O(n) né O(n log n). 0 =1 ・log n è O(n) ・(log nk)m è O(na) per ogni k, m e a > 0 ・nk è O(an) per ogni k e a ・an è O(n!) per ogni a 8 n [es. (log n10)7 è O(n0.0001) ] [es. n1000 è O(0.0001n) ] 9 1 Asymptotic Growths 1a a d nd + Dim. d a d nd + a d 2 d 1n d 1 |ad |nd + |ad (|ad | + |ad 1 |n 1| Logaritmi e polinomi = cn d d 1 + · · · + |a1 | + |a0 |) n 1 |n 1| d 1 + · · · + |a1 |n + |a0 | + · · · + |a1 | + |a0 |) nd 10 Da cui otteniamo ✓mk ↵ ◆k ↵ ↵ mk mk mk⇥ log2 n↵ = ↵ log2 n k log2 nm di =m log n= ⇥ dn k k 2m Limiti asintotici alcune funzioni log n n = cn ↵ ⇥kdelementari ↵ ↵ 2 ↵ Da cui otteniamo k mk ✓ ◆k ponendo c = ↵ ⇥ d mk ↵ Logaritmi: la base non conta, solo logk2 nmcambia ⇥ d la ncostante. = cn↵ ↵ Nota che la base del logaritmo non cambia nulla tranne la costante in quanto k ponendo c = mk ↵ ⇥d logb n loga n = logb a 0 ↵ ↵ mk ↵ mk mk log2 nm = m log2 n = ⇥ log2 n = log2 n k ⇥ dn k ↵ k ↵ ↵ ↵ ↵ mk ↵ mk mk m logotteniamo ⇥ log2 n = log2 n k ⇥ dn k 2 n = m log2 n = Da cui k ) ◆k↵ ↵ c = (mkd/α) k✓ ↵ da cui otteniamo (ponendo mk logk2 nm ⇥ d n↵ = cn↵ Da cui otteniamo ✓ ↵ ◆k mk k m log ⇥ d n↵ = cn↵ k2 n ponendo c = mk ↵ ↵ ⇥d ponendo c = mk ↵ ⇥d k 11 Dominio. Il dominio delle funzioni è quello dei numeri naturali { 0, 1, 2, … }. ・a volte restringeremo ad un sottinsieme dei naturali ・altre volte estenderemo ai reali Sappiamo che esistono n0 n e c tali che k k Funzioni non-negative. Quando si usa la notazione O-grande, assumiamo n0 per . Quindi anche n n nn00 sisihaha ogni n vale n0 . Quindi valeche ancheper che ogni per ogni che le funzioni siano (asintoticamente) nonnegative. otteniamo che n n ⌘log⇣ alognna n ⌘loga n n an = nn a nn loga n = n loga a nk . k = n aloglog log an loga n loga n a = a 1 ・Se scriviamo f (n) = O(n3) = g(n). ・Allora (!?!), f (n) = g(n). Proviamoeche per ogni a Per > 1 ogni e k > 0a si>ha = O(a ) 0, nk è O(a n). Esponenziali polinomi. 1 enkogni k n> ⇣ an = a d 1 Errori da evitare. Sia f (n) = 5n3 e g (n) = 3n2 . Proviamo che per a > 1 e ed k >esponenziali 0 si ha n1k = O(an ) 3 ogni polinomi Sappiamo che esistono n0 e c tali che quindi per ogni n > n0 + · · · + |a1 |n + |a0 | 1 f(n) = O( g (n)) invece di f(n) ∈ O( g (n)). polinomi ed esponenziali per ogni n d 1 Uso del segno uguale. O( g (n)) è un insieme di funzioni, ma spesso si scrive 1 1 n loga n d 1 Abusi di notazione quindi, in termini di crescita asintotica, quanto dimostriamo per logb(n) vale Dim. Sia n0 il minimo n tale log chea n 1 |n Dim Proviamola. k logk2 nm = (log2 nm ) = O(n↵ ) Meno evidente potrebbe essere la seguente relazione, valida per ogni m, k, ↵ > Proviamola. 0, k logk2 nm = (log2 nm ) = O(n↵ ) ↵ ↵ mk ↵ mk mk Proviamola. log2 nm = m log2 n = ⇥ log2 n = log2 n k ⇥ dn k ↵ k ↵ ↵ 3 |ad |nd + |ad 1. Per induzione su n Dim. Per Possiamo dimostrare n = 1 abbiamo log2 n per = 0 induzione 1 = n. che per ogni n > 0, vale log n ≤ cn PrimaAssumendolo mostriamo che logper cn per ogni nn =1.i Per 2 n vero + 1 induzione su n PerPern=1 lognnn= = 00i, <ponendo 11 = n = 1abbiamo abbiamo log = nn. 2 Assumendolo ninduttiva i, ponendo = i +log 1 (n-1) ≤ c (n-1), otteniamo Assumendo pervero ipotesi che n valga logper 2 n = log2 (i + 1) 1 + log2 i 1 + i = n. log n = log (n-1+1) ≤ 1 + log (n-1) ≤ 1 + c(n-1) ≤ c n log2 n = log2 (i + 1) 1 + log2 i 1 + i = n. Meno evidente potrebbe essere la seguente relazione, valida per ogni m, k, ↵ > 0, k k mla seguente mrelazione, Meno evidente potrebbelog essere valida ogni m, k, ↵ > n =k,(log O(n↵(log ) nmper Logaritmi e polinomi. Per2 ogni m, 2αn >)0,=vale )k is O(n α). 0, k Proviamola. logk2 nm = (log2 nm ) = O(n↵ ) d Meno evidente potrebbe valida ogni m, k, ↵ > log2 nessere = logla2 (iseguente + 1) 1relazione, + log2 i 1 + iper = n. anche per loga(n) siaPrima inLogaritmi base 2 2 polinomi mostriamo chee log 2 n cn per ogni n + · · · + |a1 |n + |a0 | Prima mostriamo che log2 n cn per ogni n 1. Per induzione su n 2 n =Logaritmi Per 1 abbiamo log ne=polinomi 0 1 = n. quindi n0 = 1 e c = |ad| +2... + |a0| soddisfano la definizione Assumendolo vero per n i, ponendo n = i + 1 Prima mostriamo che log2 n cn per ogni n 1. Per induzione su n Per n = log 1 abbiamo log n = 0 1 = n. 2 n = log2 (i2+ 1) 1 + log2 i 1 + i = n. Assumendolo vero per n i, ponendo n = i + 1 0, + · · · + a1 n + a0 d d + · · · + a1 n +=a0 cn |ad |nd + |ad (|ad | + |ad d 1 = cnd 2 Logaritmi polinomi Logaritmi e polinomi. eAbbiamo log n = O(n)--- assumiamo che il logaritmo = a0 + a1 n + … + ad nd con ad > 0. Allora, f(n) è O(nd). d 1 Polinomi + · · · + a1 n + a0 1n 1n d ·1· · + |a1 | + |a0 |) nd |add 11|n |+ ad n + ad 1 n + · · · + a1 n + a0 |ad(|a |ndd |++|a + · · · + |a1 |n + |a0 | cn| d+ |a | + · · · + |a | + |a |) nd Limiti asintotici di alcune funzioni elementari = (|a October 16, 2014 Limiti asintotici di alcune funzioni elementari October 16, 2014 1Polinomi. Polinomi Sia f(n) Polinomi a d nd + a d =n IMPORTANTE. OK ad abusi di notazione; attenzione agli eccessi erronei! n . 12 13 Ieri abbiamo introdotto la notazione O-grande (Big-Oh notation) Notazione Ω (Big-Omega notation) Usata per limitare superiormente il tasso di crescita Per Limiti inferiori. f(n) è Ω( g (n)) se esistono costanti c > 0 e n0 ≥ 0 tali che f(n) ≥ c · g (n) per ogni n ≥ n0. Def. Date due funzioni (asintoticamente non negative) f(n) e g(n) c · g (n) f(n) è O( g (n)) [scritto anche f(n) = O( g (n)) ] Ea. f(n) = 32n2 + 17n + 1. ・f(n) è sia Ω(n2) che Ω(n). ・f(n) non è Ω(n3) né Ω(n3 log n). f(n) se esistono constanti c > 0 e n0 ≥ 0 tali che f(n) ≤ c · g(n) per ogni n ≥ n0. n0 Ex. f(n) = 32n2 + 17n + 1. f(n) c · g (n) per c = 32, n0 = 1 n n0 scegliendo c = 50, n = 1 ・f(n) è O(n2). ・f(n) è anche O(n3). ・f(n) non è O(n) né O(n log n). ・c è O(1) (ogni costante è “equivalente” ad 1) ・log n è O(n) [es. (log n10)7 è O(n0.0001) ] ・(log nk)m è O(na) per ogni k, m e a > 0 k n [es. n1000 è O(0.0001n) ] ・n è O(a ) per ogni k e a n ・a è O(n!) per ogni a n Uso. La notazione O servirà per esprimere limiti superiori alle risorse usate 0 da un algoritmo. La notazione Ω servirà per esprimere limiti inferiori alle risorse usate da un algoritmo. Affermazioni da evitare. Ogni algoritmo di ordinamento basato su confronti richiede almeno O(n log n) confronti nel caso peggiore. 14 Ω() e O() sono duali 15 Notazione Dualità. Θ (Theta-notation) Limiti inferiori e superiori. f(n) è Θ( g (n)) se esistono costanti c1 > 0, c2 > 0, n0 ≥ 0 ・f(n) è Ω( g (n)) se e solo se g(n) è O(f(n)) tali che c1 · g (n) ≤ f(n) ≤ c2 · g (n) for all n ≥ n0. c2 · g (n) f(n) basta notare che f(n) = Ω( g (n)) se e solo se esistono costanti c, n0 > 0 Es. f(n) = 32n2 + 17n + 1. con c = 32, c ・f(n) is Θ(n2). 3). f(n) non è Θ(n) né Θ(n ・ tali che f(n) ≥ c g(n) 1 quindi se e solo se, per c’ = 1/ c, vale g(n) ≤ c’ f(n) cioè g(n) = O( f (n)) c1 · g(n) 2 = 50, n0 = 1 n0 ・c = O(1) ・loglog n = O(log n) ・log n = O(n) ・(log nk)m = O(na) per ogni k, m e a > 0 ・nk = O(an) per ogni k e a ・an = O(n!) per ogni a ・c = Ω(1) ・log n = Ω(log n) ・n = Ω(log n) ・na = Ω(log nk)m per ogni k, m e a > 0 ・an = Ω(nk) per ogni k e a ・n! = Ω(an) per ogni a n Uso. L’algoritmo maxsubarray3 esegue Θ(n log n) operazioni su un array di n elementi. Nota. f(n) è Θ( g (n)) se e solo se valgono entrambe ・f(n) è O( g (n)) ・f(n) è Ω( g (n)) 16 17 Regole Utili (le mostriamo per O, ma valgono anche per Ω e Θ) Regole Utili (le mostriamo per O, ma valgono anche per Ω e Le costanti non contano. Θ) Somma e transitività per O ・Se f (n) = O(g(n)) allora a f(n) = O(g(n)), per ogni costante a > 0 ・Es. log n = O(n) allora anche 10 log n = O(n) ・Se f(n) = O(g(n)), d(n) = O(e(n)), e g(n) = O(e(n)) allora f(n) + d(n) = O(e(n)) ・Es. log n = O(√n), 3n2 = O(n2) allora anche log n + 3n2 = O(n2) Somme. ・Se e(n) = O(g(n)), f (n) = O(h(n)), allora e(n) + f(n) = O(g(n) + h(n)) ・Es. log n = O(√n), 3n2 = O(n2) allora anche log n + 3n2 = O(√n + n2) Somma e transitività per Ω ・Se f(n) = Ω(g(n)), d(n) = Ω(e(n)), e g(n) = O(e(n)) allora - f(n)+d(n) = Ω(g(n)) e anche f(n)+d(n) = Ω(e(n)) Prodotti. ・Se e(n) = O(g(n)), f (n) = O(h(n)), allora e(n) f(n) ・Es. log n = O(√n), 3n2 = O(n2) allora anche ・Es. √n = Ω(log n), n log n = Ω(n) = O(g(n) h(n)) 3n2log n = O(n2√n) allora - √n + n log n = Ω(n) - √n + n log n = Ω(log n) Transitività. ・Se f(n) = O(g(n)), g(n) = O(h(n)), allora f(n) = O(h(n)) ・Es. log n = O(√n), √n = O(n/log n) allora anche log n = O(n/log n) 18 Altri metodi utili per verificare ordini crescita Proposizione. Se nlim 19 Notazione O-grande per funzioni a più variabili f (n) = c > 0 , allora f (n) è Θ(g(n)). g(n) Limiti superiori. T(m, n) è O( f (m, n)) se esistono costanti c > 0, m0 ≥ 0, e n0 ≥ 0 tali che T(m, n) ≤ c · f (m, n) per ogni n ≥ n0 e m ≥ m0. DIM. Per definizione di limite, esiste n0 tale che per ogni n ≥ n0 Es. T(m, n) = 32mn2 + 17mn + 32n3. 1 f (n) c < < 2c 2 g(n) ・T(m, n) è sia O(mn2 + n3) che O(mn3). ・T(m, n) non è O(n3) né O(mn2). ・Quindi, f (n) ≤ 2 c g(n) per ogni n ≥ n0, il ché implica f (n) è O(g(n)). ・Analogamente, f (n) ≥ ½ c g(n) per ogni n ≥ n0, quindi f (n) is Ω(g(n)). Proposizione. Se lim n Esempi di uso. Visita per ampiezza di un grafo (breadth-first search) cammino minimo tra due vertici in un grafo diretto. f (n) = 0, allora f (n) è O(g(n)). g(n) 20 21 Analisi di complessità di un algoritmo Tempo di esecuzione: operazioni elementari Ci concentriamo sulla risorsa TEMPO Numero di operazioni elementari eseguite ・tempo di esecuzione in funzione della taglia dell’input ・operazioni aritmetiche, confronto tra elementi, seguire un puntatore, etc. ・assumiamo che ogni operazione elementare richieda tempo Θ(1) Tempo di esecuzione ・numero di operazione elementari eseguite sull’istanza ・quale istanza? Calcolo della complessità (di tempo) ・operazioni di assegnamento di variabili: costo Θ(1) ・istruzioni condizionali (if ... then ... else): costo pari al tempo del test (in genere Θ(1)) più il costo dell’alternativa più costosa Taglia dell’input ・ ・istruzioni di iterazione (loop while, repeat, for) : costo pari alla somma su come la misuriamo? tutte le iterazioni del costo delle istruzioni eseguite nell’iterazione Funzione della taglia dell’input ・useremo le notazioni asintotiche Funzioni ricorsive ・analisi delle ricorrenze (lo vedremo quando servirà) - esempio: maxsubarray2 (albero di ricorsione) 22 23 Tempo di esecuzione: Quale istanza usiamo Tempo di esecuzione: analisi alternativa - caso medio Il running time di un algoritmo può dipendere dalla forma dell’input Worst case. Limiti al running time per ogni input di taglia n. ・es. ordinare una lista già ordinata ・cercare un elemento scorrendo una lista Es. Trovare il massimo di n elementi richiede al massimo n confronti. - l’elemento è il primo Caso Medio. Expected running time per un input random di taglia n. - l’elemento non è presente Problemi. quale distribuzione di probabilità va considerata? Worst case. Limiti sul running time che valgono per ogni input di taglia n. ・In genere coincide con l’efficienza verificata in pratica. ・Punto di vista pessimistico! perchè dovremmo ignorare il caso pessimo? Eccezioni. Esistono alcuni algoritmi esponenziali usati in pratica perché le istanze che determinano il caso pessimo (esponenzialità) sembrano essere rare. simplex algorithm 24 25 Taglia dell’input Riassumendo Numero di elementi che lo costituiscono L’algoritmo A ha complessità (di tempo) T(n) = O(n2) significa: ・l’input è un array o una lista: il numero di elementi ・l’input è un grafo: il numero di vertici e il numero di archi ・moltiplicazione di matrici: le dimensioni delle matrici ・A non richiede al più tempo cn2 per dare l’output, - per un opportuna costante c - per ogni input di taglia n sufficientemente grande Il numero di bit che servono per rappresentare l’input L’algoritmo A ha complessità (di tempo) T(n) = Ω(n2) significa: ・moltiplicazione tra due numeri ・A richiede tempo almeno cn2 prima di fornire l’output - per un opportuna costante c e - per almeno un input di taglia n sufficientemente grande Relazione tra le due misure ・Assumendo che - ogni elemento dell’input entri in una parola di memoria Sottintendiamo il caso peggiore in entrambe le affermazioni ・Il limite superiore si estende a tutti i casi ・il limite inferiore garantisce tutti i casi ・non significa che ogni caso necessita almeno del tempo dato come limite - ogni istruzione macchina richieda tempo costante ・in generale esiste una relazione tra le due misure che è data dalla taglia della parola di memoria che si utilizza inferiore 26 27 Esempi ed esercizi Esempi ed esercizi Utilizzando la notazione Θ si stimi la complessità dei seguenti stralci di Utilizzando la notazione Θ si stimi la complessità dei seguenti stralci di codice: codice: 1. for i = 1 to 2n 4. if x è pari then i = n while i ≥ 1 do x = x-1 else x = x+1, i = i/2 x = x+2 2. 5. j = n while j ≥ 1 do for i = 1 to 3n for i = 1 to j for j = 9 to n x = x + i - 1 x = x + 1 3. j = j/2 for i = 1 to n for j = 1 to i for k = j to i x = x + 1 28 29 a n n a n= n a0log = n log . = anche a a che per per ogni . aQuindi vale ogni n a n0 n si ha per ogni n0 . Quindi vale anche ogni n nn0 si ha ⇣ n che ⌘logper 4 calcolare progressioni geometriche Per un qualche ↵ 6=n 1 Vogliamo n an n loga n a = a nk . = aloga n loga n = n loga n 4 progressioni ⇣ n ⌘logageometriche n n n ↵ 6= 1 Vogliamo n Per un n k nX Alcune autili matematiche =relazioni a logaqualche = n loga n nk . = aloga n logacalcolare j Per un qualche ↵ 6= 1 Vogliamo calcolare ↵ 4 progressioni geometrichek Esempi ed esercizi Utilizzando la notazione Θ si stimi la complessità dei seguenti stralci di 4 Otteniamo codice: 6. (↵ i = n while i ≥ 1 do for j = 1 to n progressioni geometriche ↵j per calcolare qualche ↵ 6= 1Otteniamo Vogliamo kPer un ・ k kvogliamocalcolare X X X Otteniamo j=0 k kj k 1) ↵j = ↵j+1 ↵ X X X j+1 k k (↵ k ↵j k X X X 1) = ↵ ↵j j=0 j=0 XOtteniamo j=0 j j+1 j j (↵ 1) ↵ = j=0 ↵ ↵↵ j=0 j=0 n+1 0 1 k j=0 ↵ X k ↵ = ↵1 +j=0 ↵2 + ·X ·k· + j=0 ↵n + ↵ ↵n n X 1 2 j=0 j=0 = j j+1 ↵ k X + ↵ +j · · · + ↵ + ↵n+1 ↵0 ↵1 ↵n = n n 2 0 ↵ n+1 1 0 2 1 ↵++↵↵ ·n+1 · · +1↵n↵+ ↵↵ ↵ = ↵1 +(↵↵2 1) + ·=· ·↵+↵1↵+ + · · ·↵+ ↵n 0 2↵ ↵ + j=0 j=0 j=0 = ↵ + ↵ + ·n+1 · · + ↵n0 + ↵n+1 ↵1 + ↵2 + · · · + ↵n 1 2 n 1 2↵ Otteniamo n+1 0 = n+1 ↵ + ↵ + · · · + ↵ + ↵ ↵ ↵ + ↵ +n · · · + ↵n 1 2 n n+1 0 1 = ↵ ↵ = ↵ = 1. ↵=+ ↵↵n+1 + ··· + ↵ ↵ ↵ ↵0↵ =+↵↵n+1 1. n+1 0 ↵ = ↵↵2n+1 k k= ↵ = X k1 + ↵ + · · · 1. + ↵n + ↵n+1 ↵0 ↵1 + ↵2 + · · · + ↵n X X j+1 j Da cui(↵ si ottiene 1) ↵j = kDa ↵cui si=ottiene ↵n+1↵ ↵0 = ↵n+1k 1. Da cui si ottiene n+1 X n+1 X ↵ j=0X k 1 1 j=0 j=0 j ↵n+1 ↵ 1j = ↵ = quindi Da cui ↵ j ・ si ottiene ↵ = 1 2 n k n+1 0 1 1 n ↵ 1 ↵ = j=0 ↵ + ↵ + · · · + ↵ + ↵ ↵ 1 n+1 ↵ ↵ ↵ x = x + 1 i = i/2 7. X j=0 k ↵j X Sommatorie potenze (progressioni) Per un qualchesuccessive ↵ 6= 1 Vogliamo calcolare j ↵ j=0 i = 2 while i < n do j=0 i = i * i x = x + 1 30 Per ↵ < 1 abbiamo Esempi ed esercizi Esempi ed esercizi X j=0↵ ↵j = 1 2 ↵1 + · · · + ↵nj=0+ ↵n+1↵ ↵1 0 ↵1 + ↵2 + · · · + ↵n Per ↵↵ < 1+abbiamo Per ↵ < 1 abbiamo Per ↵ = < 1 abbiamo n+1 =kPer↵↵n+1 ↵0 X = 1.kn+1 < 1 abbiamo k ↵ n+1 1 ↵n+1 X 1 X ↵ j 1 ↵ j j ↵ ==⇥(1) = ⇥(1) ↵ = Per α < 1,↵otteniamo quindi k = =X ⇥(1) ・ n+1 1 ↵ 1j j=0↵1 ↵ 1 ↵ j=0 Da cui -si ottiene ↵ = = ⇥(1) j=0 il numeratore è < 1k X j=0 ↵n+1 1 1 ↵ n+1 poichè 0 < 1 ↵ 1 euna 1↵n+1 ↵j è= poichè 0 <è <una 1 e costante. 1 ↵ è una costante. ↵costante n+1 il denominatore poichè 0 < 1 ↵ < 1 poichè e 1 0↵<è 1una↵n+1 costante. 1 costante. < 1 e 1 ↵↵è una j=0 k X 31 ↵n+1 = ⇥(1) 1 ↵algoritmo Valutare la complessità del seguente j=0 Valutare la complessità del seguente algoritmo poichè 0 < 1 Algoritmo (A[1,...n] for i = 1 to n ↵n+1 < 1 e 1 ↵j = 1 ↵ è una costante. Moltiplica (y, z) 2 x = 0 B[i] = A[i] 2 2 while z >2 0 do for i = 1 to n if z è dispari then x = x+y j = n y = 2*y while j > i do z = z/2 // troncato all’intero B[i] = B[i] + A{i] return x j = j - 1 for i = 1 to n t = t + B[i] 2 32 33 Altri esempi - O(n3) Altri esempi Insiemi disgiunti. Dati n insiemi S1, …, Sn ognuno un sottinsieme di Insieme Independente di taglia k. Dato un grafo, esistono k nodi tali che 1, 2, …, n, esiste una coppia di insiemi disgiunti? nessuna coppia tra essi è unita da un arco? Soluzione. Per ogni coppia di insiemi, verifica se sono disgiunti. Soluzione. Enumera tutti i sottinsiemi di k nodi. k is a constant foreach subset S of k nodes { check whether S in an independent set foreach set Si { if (S is an independent set) foreach other set Sj { report S is an independent set foreach element p of Si { } determine whether p also belongs to Sj } } ・Verificare se S, (|S| = k) è indipendente richiede tempo O(k2). (perché?) ・numero sottinsiemi di taglia k = nk = n(n k(k1)(n 1)(k2) ·2)· · ·(n· · 1k + 1) ・O(k2 nk / k!) = O(nk). if (no element of Si belongs to Sj) report that Si and Sj are disjoint } } nk k! polinomiale per k=17, ma sicuramente poco pratico 34 Tempo Esponenziale Insieme Independente. Dato un grafo, qual è la massima cardinalità di un insieme indipendente? Soluzione. Enumera tutti i sottinsiemi e verifica se sono indipendenti. S* ← φ foreach subset S of nodes { check whether S in an independent set if (S is largest independent set seen so far) update S* ← S } } Tempo O(n2 2n) : Il numero di sottinsiemi di un insieme di n elementi è 2n 36 35