Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Riepilogo algoritmi Fibonacci* Numero di linee di codice Occupazione di memoria fibonacci1 Θ(1) Θ(1) fibonacci2 Θ(n) Θ(n) fibonacci3 Θ(n) Θ(n) fibonacci4 Θ(n) Θ(1) fibonacci5 Θ(n) Θ(1) fibonacci6 Θ(log n) Θ(log n) Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Modello di calcolo • Per valutare la complessità di un algoritmo, bisogna prima di tutto stabilire un modello di calcolo di riferimento su cui esso viene eseguito • Macchina a registri (RAM: random access machine) – un programma finito – un nastro di ingresso e uno di uscita – una memoria strutturata come un array (di dimensione infinita) • ogni cella può contenere un qualunque valore intero/reale – un registro detto accumulatore (contiene operandi istruzione corrente) – un registro detto contatore delle istruzioni (contiene indirizzo istruzione successiva) • la RAM è un’astrazione dell’architettura di von Neumann 3 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Macchina a registri 4 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Criterio di costo uniforme • Nel modello a costi uniformi, ogni istruzione ha un costo unitario • Complessità temporale misurata come numero di istruzioni eseguite – istruzione ingresso/uscita (lettura o stampa) – operazione aritmetico/logica – accesso/modifica del contenuto della memoria • Complessità spaziale misurata come numero massimo di celle di memoria della RAM occupate durante l’esecuzione 5 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Dimensione dell’input • Misureremo le risorse di calcolo usate da un algoritmo (tempo di esecuzione / occupazione di memoria ) in funzione della dimensione dell’istanza in input • Esistono due modalità di caratterizzazione della dimensione dell’input: – Quantità di memoria effettiva utilizzata per codificare l’input (ad esempio, numero di bit necessari per rappresentare un valore in input) – Parametro caratterizzante la dimensione dell’input (ad esempio, numero di elementi di una sequenza da ordinare) 6 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Domanda di approfondimento • Qual è la complessità temporale degli algoritmi Fibonacci6, Fibonacci4 e Fibonacci2 in funzione della rappresentazione dell’input? • Abbiamo appena affermato che la complessità temporale viene misurata in funzione della dimensione dell’input; nel caso dei tre algoritmi in questione, l’input è un numero n, che può essere rappresentato usando k=log n bit. Quindi: – Fibonacci6 costa T(n)=Θ(log n)=Θ(k), ed è quindi polinomiale (più precisamente, lineare) nella dimensione dell’input; – Fibonacci4 costa T(n)=Θ(n)=Θ(2k), ed è quindi esponenziale nella dimensione dell’input; k – Fibonacci2 costa T(n)=Θ(n)=Θ(2 ), ed è quindi superesponenziale nella dimensione dell’input. 7 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Notazione asintotica 8 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Notazione asintotica e operazioni dominanti • Complessità temporale e spaziale saranno espresse in notazione asintotica rispetto alla dimensione dell’input • La notazione asintotica è un’astrazione utile per descrivere l’ordine di grandezza di una funzione ignorando i dettagli non influenti, come costanti moltiplicative e termini di ordine inferiore • Ai fini dell’analisi asintotica, sarà sufficiente considerare le cosiddette operazioni dominanti, ovvero quelle che nel caso peggiore vengono eseguite più spesso • Queste si trovano annidate nei cicli più interni dello pseudocodice che descrive l’algoritmo 9 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Notazione asintotica O f(n) = O(g(n)) se due costanti c>0 e n0≥0 tali che f(n) ≤ c g(n) per ogni n ≥ n0 f(n) = ( g(n) ) cg(n) f(n) n0 10 n Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Un caso notevole: i polinomi Sia f(n) = ad nd + ad-1 nd-1 + … + a0 un polinomio di grado d (con ad>0); dimostriamo che f(n)=O(nd) Infatti: f(n)/nd = ad + ad-1 n-1 + … + a0 n-d n0: n n0 ad - |ad-1|n-1 - … - |a0| n-d > 0 Se scegliamo c = ad + |ad-1| + … + |a0| c nd = ad nd + |ad-1| nd+…+ |a0| nd ad nd + |ad-1| nd-1+…+ |a0| ad nd + ad-1 nd-1 + … + a0 n n0 f(n) c nd 11 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Esempi • Sia f(n) = 2n2 + 3n; vogliamo dimostrare che f(n)=O(n2). f(n)/n2 = (2n2 + 3n)/n2 = 2 + 3/n ma 2 + 3/n > 0 per n ≥ 1 (quindi n0=1); Scegliendo c = a2 + |a1| + |a0| = 2+3=5 avremo che 2n2 + 3n ≤ 5n2 per n ≥ n0=1. • f(n) = O(n3) (c=1, n0=3) • f(n) = O(2n) (c=4, n0=3) • Invece, f(n) O(n) 12 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Legame con il concetto di limite fn 0 gn fn O gn fn O gn limn limn fn O gn 13 limn fn 0 gn fn (se esiste) gn Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Notazione asintotica W f(n) = W(g(n)) se due costanti c>0 e n0≥0 tali che f(n) ≥ c g(n) per ogni n ≥ n0 f(n) = W(g(n)) f(n) c g(n) n0 14 n Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Un caso notevole: i polinomi Sia f(n) = ad nd + ad-1 nd-1 + … + a0 un polinomio di grado d (con ad>0); dimostriamo che f(n)=Ω(nd) Infatti: f(n)/nd = ad + ad-1 n-1 + … + a0 n-d n0: n n0 ad - |ad-1|n-1 - … - |a0| n-d > 0 Se scegliamo c = ad - |ad-1| n0-1 - … - |a0 | n0-d c nd = ad nd -|ad-1| nd n0-1 -…- |a0| nd n0-d e poiché per n n0 si ha nd n0-k nd-k c nd ad nd - |ad-1| nd-1-…- |a0| ad nd + ad-1 nd-1 + … + a0 n n0 c nd f(n) 15 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Esempi • Sia f(n) = 2n2 - 5n; vogliamo dimostrare che f(n)= W(n2). f(n)/n2 = (2n2 - 5n)/n2 = 2 - 5/n ma 2 - 5/n > 0 per n ≥ 3 (quindi n0=3); Scegliendo c = a2 - |a1|/n0 - |a0|/n02 = 2-3/3=1 avremo che 2n2 - 3n ≥ 1n2 per n ≥ n0=3. • f(n) = W(n) (c=1, n0=2) • f(n) = W(log n) (c=1, n0=2) • Invece, f(n) W(n3) 16 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Legame con il concetto di limite fn gn fn Wgn limn fn Wgn 17 fn Wgn limn limn fn gn fn (se esiste) gn 0 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Notazione asintotica Q f(n) = Q(g(n)) se tre costanti c1,c2>0 e n0≥0 tali che c1 g(n) ≤ f(n) ≤ c2 g(n) per ogni n ≥ n0 f(n) = Q(g(n)) c2 g(n) f(n) c1 g(n) n0 18 n Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Relazioni tra O, Ω e Θ fn Qg(n) fn Ogn fn Og(n) fn Θgn fn Qg(n) fn Wgn fn Wg(n) fn Qgn fn Qg(n) 19 fn Ωgn e fn Ogn Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Notazione o Data una funzione g(n): N R, si denota con o(g(n)) l’insieme delle funzioni f(n): N R: o(g(n)) = {f(n) : c > 0, n0 tale che n n0 0 f(n) c g(n) } Notare: ogn fn ogn 20 Ogn limn fn 0 gn Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Notazione ω Data una funzione g(n): N R, si denota con ω(g(n)) l’insieme delle funzioni f(n): N R: ω(g(n)) = {f(n) : c > 0, n0 tale che n n0 0 c g(n) f(n) } Notare: gn fn gn 21 Wgn limn fn gn Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Riassumendo … fn Θgn fn Ogn fn Wgn fn c2 gn asintotica mente 0 fn c2 gn asintotica mente fn 0 c1 gn fn ogn fn gn 22 0 c1 asintotica mente limn fn 0 gn limn fn gn Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Analogie 23 O W Q o > Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Graficamente 24 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Proprietà della notazione asintotica Transitività fn Qgn e gn Qhn fn Qhn fn Ogn e gn Ohn fn Ohn fn Wgn e gn Whn fn Whn fn ogn e gn ohn fn ohn fn gn e gn hn fn hn Riflessività fn Qfn fn Οfn fn Wfn Simmetria fn Qgn Simmetria trasposta gn Qfn fn Ogn gn Wfn fn ogn gn fn 25 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Polinomi P(n) = ad nd + ad-1 nd-1 + … + a0 ad > 0 Relazioni asintotiche notevoli Esponenziali an f(n) = an limn d a >1 n P(n) = O(nd), P(n) = W(nd) P(n) = Q(nd) P(n) = O(nk), k≥d, P(n) ≠ O(nk), k<d P(n) = W(nk), k≤d, P(n) ≠ W(nk), k>d an = (nd) an = W(nd) Logaritmi f(n) = logb(n) b>1 limn logb n c nd 0, c, d 1 logb(n) = o(nd) logb(n) = O(nd) Fattoriali f(n) = n! = n*(n-1)*……*2*1 26 n! = o(nn) n! = (an) Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Metodi di analisi 27 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Caso peggiore, migliore e medio • Come detto, misureremo le risorse di calcolo usate da un algoritmo in funzione della dimensione delle istanze • Ma istanze diverse, a parità di dimensione, potrebbero richiedere risorse diverse! Ad esempio, se devo cercare un elemento x in un insieme di n elementi in input, il numero di confronti che farò dipenderà dalla posizione che x occupa nella sequenza. • Distinguiamo quindi ulteriormente tra analisi nel caso peggiore, migliore e medio 28 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Caso peggiore • Sia tempo(I) il tempo di esecuzione di un algoritmo sull’istanza I Tworst(n) = max istanze I di dimensione n {tempo(I)} • Intuitivamente, Tworst(n) è il tempo di esecuzione sulle istanze di ingresso che comportano più lavoro per l’algoritmo • Definizione analoga può essere data per lo spazio 29 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Caso migliore • Sia tempo(I) il tempo di esecuzione di un algoritmo sull’istanza I Tbest(n) = min istanze I di dimensione n {tempo(I)} • Intuitivamente, Tbest(n) è il tempo di esecuzione sulle istanze di ingresso che comportano meno lavoro per l’algoritmo 30 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Caso medio • Sia P(I) la probabilità di occorrenza dell’istanza I Tavg(n) = ∑ istanze I di dimensione n {P(I) tempo(I) } • Intuitivamente, Tavg(n) è il tempo di esecuzione nel caso medio, ovvero sulle istanze di ingresso “tipiche” per il problema • Richiede di conoscere una distribuzione di probabilità sulle istanze 31 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Complessità temporale e spaziale di un algoritmo • Denoteremo con T(n) il tempo di esecuzione dell’algoritmo su una generica istanza di ingresso di dimensione n. Varrà quindi: T(n) ≤ Tworst(n) T(n) ≥ Tbest(n) • Analogamente, per l’occupazione di memoria: S(n) ≤ Sworst(n) S(n) ≥ Sbest(n) 32 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Delimitazioni inferiori e superiori 33 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Delimitazioni superiori (upper bound) Definizione (complessità di un algoritmo) Un algoritmo A ha costo di esecuzione O(g(n)) su istanze di dimensione n e rispetto ad una certa risorsa di calcolo (spazio o tempo), se la quantità f(n) di risorsa sufficiente per eseguire A su qualunque istanza di dimensione n (e quindi in particolare anche nel caso peggiore) verifica la relazione f(n)=O(g(n)). Definizione Un problema P ha una delimitazione superiore alla complessità O(g(n)) rispetto ad una certa risorsa di calcolo (spazio o tempo) se esiste un algoritmo che risolve P il cui costo di esecuzione rispetto a quella risorsa è O(g(n)). 34 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Delimitazioni inferiori (lower bound) Definizione Un algoritmo A ha costo di esecuzione W(g(n)) su istanze di dimensione n e rispetto ad una certa risorsa di calcolo (spazio o tempo), se la quantità f(n) di risorsa necessaria per eseguire A nel caso peggiore (e quindi non è detto che debba essere necessaria per ogni istanza di dimensione n: istanze facili potrebbero richiedere meno risorse!) verifica la relazione fworst(n)= W(g(n)). Definizione (complessità intrinseca di un problema) Un problema P ha una delimitazione inferiore alla complessità W(g(n)) rispetto ad una certa risorsa di calcolo (spazio o tempo) se ogni algoritmo che risolve P ha costo di esecuzione W(g(n)) rispetto a quella risorsa. 35 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Ottimalità di un algoritmo Definizione Dato un problema P con complessità intrinseca W(g(n)) rispetto ad una certa risorsa di calcolo (spazio o tempo), un algoritmo che risolve P è ottimo se ha costo di esecuzione O(g(n)) rispetto a quella risorsa. 36 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Esercizio di approfondimento Sia dato un mazzo di n carte scelte in un universo U di 2n carte, e si supponga di dover verificare se una certa carta xU appartenga o meno al mazzo. Progettare un algoritmo per risolvere tale problema, e analizzarne il costo (in termine di numero di confronti) nel caso migliore, peggiore e medio. 37 Copyright © 2004 - The McGraw - Hill Companies, srl