Tecniche Algoritmiche: divide et impera Una breve presentazione F. Damiani - Alg. & Lab. 04/05
Divide et impera (o Divide and conquer) Per regnare occorre tenere divisi i nemici e trarne vantaggio F. Damiani - Alg. & Lab. 04/05
Divide et impera Tecnica top-down: 1. Dividi l istanza del problema in due o più sottoistanze 2. Risolvi ricorsivamente il problema sulle sottoistanze 3. Ricombina la soluzione dei sottoproblemi allo scopo di ottenere la soluzione globale Esempi: ricerca binaria, mergesort, quicksort F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)
Divide et impera - Schema generale Divide-et-impera (P, n) if n k then risolvi direttamente else dividi P in sottoproblemi P 1, P 2,,P h di dimensione n 1, n 2,, n h risp. for i 1 to h do Divide-et-impera (P i, n i ) combina i risultati di P 1,, P h per ottenere quello di P F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Divide et impera - Complessità Il costo dell algoritmo è di solito costante per i casi in cui la soluzione viene costruita direttamente; per i casi in cui non è immediata, il costo può essere espresso come somma di h + 2 costi: il costo di dividere il problema nei sottoproblemi il costo di combinare i risultati dei sottoproblemi per ottenere il risultato del problema gli h costi delle soluzioni dei sottoproblemi T(n) = c n k = D(n) + C(n) + Σ i=1..h T(n i ) n > k F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
E relativamente semplice esprimere la complessità con una relazione di ricorrenza. Puo essere però piuttosto complicato risolvere la relazione di ricorrenza. Abbiamo esaminato tre modi per trovare la soluzione: metodo iterativo metodo di sostituzione metodo principale F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Il metodo iterativo Sviluppare la ricorrenza ed esprimerla come somma di termini che dipendono solo da n e dalle condizioni al contorno. Per risolvere la ricorrenza si applicano le tecniche per limitare le sommatorie (puo essere utile disegnare l albero della ricorsione) Esempio: consideriamo l equazione T(n) = 4T(n/2) + n T(n) = n + 4T(n/2) = n + 4 ( n/2 + 4 T(n/4)) = n + 2n + 4 2 (n/4 + 4 T(n/8) ) = n + 2n + 4n + 4 3 (n/8 + 4 T(n/16) ) = n + 2n + + 2 lgn-1 n + 2 lgn T(1) = n (1 + 2 + + 2 lgn-1 ) + n Θ(1) = n (2 lgn -1) + Θ(n) = n 2 -n + Θ(n) 2 F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Alberi di ricorsione ( variante del metodo iterativo) Esempio: disegnamo l unfolding della ricorrenza T(n) = n + 4T(n/2) T(n) n T(n/2) T(n/2) T(n/2) T(n/2) F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
n n n/2 n/2 n/2 n/2 2n lgn n/4 n/4 n/4 n/4 n/4 n/4 n/4 n/4 n/4 n/4 n/4 n/4 n/4 n/4 n/4 n/4 4n 2 lgn Θ(1) Totale: lgn-1 n Σ 2 i + 2 lgn Θ(1) = n (n - 1) + n Θ(1) = Θ(n 2 ) i=0 F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Il metodo di sostituzione Ipotizza un limite asintotico, e verifica l ipotesi con una dimostrazione per induzione. Esempio T(n) = 4T(n/2) + n Per provare che T(n) = O(n 3 ) mostriamo che esistono c ed n 0 : T(n) c n 3 per tutti gli n n 0 Supponendo T(k) c k 3 per tutti i k < n, si ottiene T(n) = 4T(n/2) + n 4c(n/2) 3 + n = cn 3 - (c/2 n 3 -n) cn 3 per c 2 e n 1 Nota: T(1) deve essere c 1 3 F. Damiani - Alg. & Lab. 04/05
Esempio (continua): proviamo che T(n) = O(n 2 ) Cerchiamo di dimostrare che T(n) c n 2 per tutti gli n n 0 Supponendo T(k) c k 2 per tutti i k < n, si ottiene T(n) = 4T(n/2) + n 4c(n/2) 2 + n = cn 2 + n cn 2 per nessun c 0 Dobbiamo modificare l ipotesi, consideriamo: T(n) c n 2 - d n, d 1 T(n) = 4T(n/2) + n 4 (c(n/2) 2 - d(n/2)) + n = cn 2-2dn + n = c n 2 d n - (d n - n) cn 2 -dn Si può scegliere d = 1. F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Bisogna fare attenzione alle condizioni al contorno (non è sempre scontato che esse siano limitate da c f(n)) Ad esempio supponiamo di aver dimostrato per la ricorrenza T(n) = 2 T( n/2 ) + n che T(n) c n lgn e sia T(1) = 1 Allora non si ottiene T(1) c 1 lg1 per nessun c, essendo lg1 = 0 La difficoltà può essere superata ricordando che la notazione asintotica richiede di dimostrare T(n) c n lgn per gli n n 0, dove n 0 è una costante. Consideriamo allora T(2) e T(3), in quanto per n > 3, la relazione non dipende più da T(1). T(2) = 4 c 2 lg2 T(3) = 5 c 3 lg3 Basta scegliere c 2 F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Un inconveniente del metodo di sostituzione è che non esiste una regola per trovare la soluzione corretta per ogni ricorrenza. Di solito bisogna provare più tentativi, ma se la ricorrenza è simile ad una di cui si conosce la soluzione, si può provare la stessa soluzione. Ad esempio: T(n) = 2T( n/2 + 15) + n Intuitivamente per n grande la differenza tra n/2 e n/2 + 15 non è molto significativa. Si può perciò tentare con la soluzione T(n) = O(n lgn), che sappiamo risolvere la ricorrenza T(n) = 2T( n/2 ) + n. F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Esercizio: dimostriamo che la ricorrenza T(n) = 2T ( n/2 + 15) + n appartiene all insieme O(n lgn) Proviamo T(n) c n lgn (n) = 2T ( n/2 + 15) + n (per n > 30, n/2 + 15 < n) 2 (c (n/2 + 15) lg(n/2 + 15)) + n = 2 (c ((n + 30)/2) lg ((n + 30)/2)) + n = c (n + 30) lg ((n + 30)/2)) + n = c (n + 30) lg (n + 30) c (n + 30) lg2 + n = c (n + 30) lg (n + 30) c (n + 30) + n = c n lg (n + 30) + c 30 lg (n + 30) c n c 30 + n c n lg (5 n/4) + c 30 lg (5 n/4) + n c n c 30 (per n > 120 = c n (lg n + lg 3 lg 4) + c 30 (lg n + lg 3 lg 4) + n c n c 30 = c n lg n + c (lg 5 2) n + c 30 lg n + c 30 (log 5 2) + n c n c 30 = c n lg n + c 30 lg n + n c (3 log 5) n c 30 (3 log 5) = c n lg n + c 30 (lg n + log 5 3) (c (3 log 5) + 1) n c n lg n (per c=1 e n suff. grande) F. Damiani - Alg. & Lab. 04/05
Il metodo principale Teorema Master (versione semplificata) Siano a 1, b > 1 e c 0 delle costanti. T(n) sia definita dalla seguente ricorrenza: T(n) = a T(n/b) + Θ(n c ) dove n/b rappresenta n/b oppure n/b. Allora T(n) è asintoticamente limitato nel modo seguente: 1. se c < log b a allora T(n) = Θ(n log b a ) 2. se c = log b a allora T(n) = Θ(n c lgn) 3. se c > log b a allora T(n) = Θ(n c ) F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Consideriamo un semplice esempio Per le equazioni di ricorrenza: 1. T 1 (n) = 4 T(n/2) + n 2. T 2 (n) = 4 T(n/2) + n 2 3. T 3 (n) = 4 T(n/2) + n 3 Si applicano rispettivamente i casi 1, 2 e 3 del teorema principale. Si ha allora: 1. T 1 (n) = Θ(n 2 ) 2. T 2 (n) = Θ(n 2 lgn) 3. T 3 (n) = Θ(n 3 ) F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Proviamo a interpretare le complessità ottenute Caso 1. T 1 (n) = 4 T(n/2) + n = Θ(n 2 ) si applica se il costo della divisione in sottoproblemi e della costruzione della soluzione a partire da quella dei sottoproblemi (n c ) è trascurabile rispetto al costo della soluzione dei sottoproblemi stessi (a T(n/b)). Caso 2. T 2 (n) = 4 T(n/2) + n 2 = Θ(n 2 lgn) si applica se il costo della divisione in sottoproblemi e della costruzione della soluzione a partire da quella dei sottoproblemi (n c ) è analogo al costo della soluzione dei sottoproblemi stessi (a T(n/b)). Caso 3. T 3 (n) = 4 T(n/2) + n 3 = Θ(n 3 ) si applica se il costo della divisione in sottoproblemi e della costruzione della soluzione a partire da quella dei sottoproblemi (n c ) è il fattore dominante. F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Un esempio di uso del teorema principale Il tempo di calcolo per l algoritmo DI-Massimo-Ricorsivo soddisfa la ricorrenza: T(n) = 2 T(n/2) + Θ(1) a = b = 2 c = 0 < 1 = log b a Caso 1 del teorema principale: T(n) = Θ(n log 2 2 ) = Θ(n) Il costo della divisione in sottoproblemi e della costruzione della soluzione a partire da quella dei sottoproblemi (n c ) è trascurabile rispetto al costo della soluzione dei sottoproblemi stessi (a T(n/b)). F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Ancora un esempio di uso del teorema principale Il tempo di calcolo per l algoritmo Merge-Sort soddisfa la ricorrenza: T(n) = 2 T(n/2) + Θ(n) a = b = 2 c = 1 = log b a Caso 2 del teorema principale: T(n) = Θ(n c lgn) = Θ(n lgn) l costo della divisione in sottoproblemi e della costruzione della soluzione a partire a quella dei sottoproblemi (n c ) è analogo al costo della soluzione dei ottoproblemi stessi (a T(n/b)). F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Un case study F. Damiani - Alg. & Lab. 04/05
Problema: moltiplicazione di interi di grandezza arbitraria Moltiplicare o sommare due numeri non sempre è un operazione eseguibile in tempo costante: se i numeri occupano più di una parola di memoria, anche le operazioni elementari potrebbero richiedere tempo superiore a O(1) Moltiplicare due numeri a n cifre, secondo un algoritmo che conosciamo fin dalla scuola elementare, richiede tempo O(n 2 ): possiamo fare di meglio? F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)
Rappresentazione decimale di interi a n cifre Idea: dividiamo X e Y a metà: X 1 (Y 1 ) = n/2 cifre più significative di X (Y) X 0 (Y 0 ) = n/2 cifre meno significative di X (Y) F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)
Divisione del problema F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)
Osservazioni Moltiplicare un numero per 10 k = shift a sinistra delle cifre del numero di k posizioni Somma di due numeri di k cifre: tempo O(k) La moltiplicazione di due numeri a n cifre si riduce quindi a: quattro moltiplicazioni di numeri a n/2 cifre un numero costante di operazioni implementabili in tempo O(k) F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)
Equazione di ricorrenza La soluzione è Θ(n 2 ) dal Teorema Master Cosa abbiamo guadagnato? F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)
Ridurre il numero di moltiplicazioni Detti: si ha F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)
Analisi Eseguiamo tre moltiplicazioni e un numero costante di somme e shift log 2 3 La soluzione è Θ(n ) = Θ(n 1.59 ) dal Teorema Master F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)
Conclusione Divide et impera: varie applicazioni: ricerca binaria, mergesort, quicksort, moltiplicazione di interi di grandezza arbitraria, moltiplicazione di matrici, F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)