Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoEdda Grasso Modificato 10 anni fa
1
Studieremo alcune tecniche per il progetto di algoritmi e di strutture dati: Programmazione dinamica Algoritmi golosi Analisi ammortizzata Vedremo poi alcuni tipi di strutture dati importanti per le applicazioni: B-alberi Strutture dati per insiemi disgiunti
2
Esempio: taglio delle aste Problema del taglio delle aste E data unasta metallica di lunghezza n che deve essere tagliata in pezzi di lunghezza intera (con un costo di taglio trascurabile). Per ogni lunghezza l = 1,…,n è dato il prezzo p l a cui si possono vendere i pezzi di quella lunghezza. Si vuole decidere come tagliare lasta in modo da rendere massimo il ricavo della vendita dei pezzi ottenuti. Programmazione Dinamica
3
Esempio l 12345678910 plpl 1589 17 202430 Lunghezza asta nRicavo massimo r n Suddivisione ottima 111 252 383 4102+2 5132+3 6176 7181+6 o 2+2+3 8222+6 9253+6 103010
4
Unasta di lunghezza n può essere tagliata in 2 n-1 modi distinti in quanto abbiamo una opzione tra tagliare o non tagliare in ogni posizione intera 1,…,n-1. Ad esempio per n = 4 abbiamo i seguenti 8 modi Suddivisioni 41+1+2 1+31+2+1 2+22+1+1 3+11+1+1+1
5
In generale il ricavo massimo r n o è il costo p n dellasta intera oppure si ottiene effettuando un primo taglio in posizione i e quindi sommando i ricavi massimi del primo e del secondo pezzo, ossia r n = r i + r n-i Quindi Osserviamo che la soluzione ottima del problema di ottiene da soluzioni ottime di sottoproblemi. Diciamo che il problema ha sottostruttura ottima.
6
Otteniamo una struttura ricorsiva più semplice se invece di scegliere la posizione i di un primo taglio intermedio scegliamo la lunghezza i del primo pezzo per cui r n = p i + r n-i Cut-Road(p, n) if n == 0 return 0 q = -1 for i =1 to n q = max(q, p[i]+Cut-Road(p, n-i)) return q
7
Albero di ricorsione per n = 4 0 001 0 012 3 4 001 201 Lo stesso problema di dimensione 2 viene risolto due volte, quello di dimensione 1 quattro volte e quello di dimensione 0 otto volte. Questo spiega la complessità 2 n. Ripetizione dei sottoproblemi!!
8
Possiamo ridurre la complessità evitando di risolvere più volte gli stessi problemi. Un primo modo per farlo è dotare lalgoritmo di un blocco note in cui ricordare le soluzioni dei problemi già risolti: metodo top-down con annotazione. Un secondo modo per farlo è calcolare prima i problemi più piccoli memorizzandone le soluzioni e poi usare tali soluzioni per risolvere i problemi più grandi: metodo bottom-up.
9
Versione top-down con annotazione: Memoized-Cut-Road(p, n) for i = 0 to n // inizializza il blocco note r[i] = -1 return Cut-Road-Aux(p, n, r) Cut-Road-Aux(p, j, r) if r[j] 0 // il problema è già stato risolto return r[j] if j == 0 q = 0 else q = -1 for i = 1 to j q = max(q, p[i] + Cut-Road-Aux(p, j-i, r)) r[j] = q return q
10
Versione bottom-up: Bottom-Up-Cut-Road(p, n) r[0] = 0 // il problema più semplice for j = 1 to n q = -1 for i = 1 to j q = max(q, p[i] + r[j-i]) r[ j] = q return r[n]
11
Versione bottom-up estesa per calcolare la soluzione ottima e non solo il suo valore Extended-Bottom-Up-Cut-Road( p, n) r[0] = 0 for j = 1 to n q = -1 for i = 1 to j if q < p[i]+r[ j - i] q = p[i]+r[ j - i] s[ j] = i // memorizzo il taglio ottimo r[ j] = q return r ed s
12
La seguente procedura calcola e stampa la soluzione ottima: Print-Cut-Road-Solution( p, n) (r, s) = Extended-Bottom-Up-Cut-Road( p, n) j = n while j > 0 print s[j] j = j - s[j]
13
Moltiplicazione di matrici Esso richiede p q r prodotti scalari Lalgoritmo per moltiplicare due matrici A e B di dimensioni p q e q r è: Matrix-Multiply(A, B) for i = 1 to A.rows for j = 1 to B.columns C[i, j] = 0 for k = 1 to A.columns C[i, j] = C[i, j] + A[i, k] B[k, j] return C
14
Problema della moltiplicazione di matrici Si deve calcolare il prodotto A 1 A 2... A n di n matrici di dimensioni p 0 p 1, p 1 p 2,..., p n-1 p n Poiché il prodotto di matrici è associativo possiamo calcolarlo in molti modi.
15
Esempio: Per calcolare il prodotto A 1 A 2 A 3 di 3 matrici di dimensioni 200 5, 5 100, 100 5 possiamo: a) moltiplicare A 1 per A 2 (100000 prodotti scalari) e poi moltiplicare per A 3 la matrice 200 100 ottenuta (100000 prodotti scalari). In totale 200000 prodotti scalari. b) moltiplicare A 2 per A 3 (2500 prodotti scalari) e poi moltiplicare A 1 per la matrice 5 5 ottenuta (5000 prodotti scalari). In totale 7500 prodotti scalari.
16
Vogliamo trovare il modo per minimizzare il numero totale di prodotti scalari. In quanti modi possiamo calcolare il prodotto? Tanti quante sono le parentesizzazioni possibili del prodotto A 1 A 2... A n. Ad esempio per n = 4: (A 1 (A 2 (A 3 A 4 ))) (A 1 ((A 2 A 3 ) A 4 )) ((A 1 A 2 ) (A 3 A 4 )) ((A 1 (A 2 A 3 )) A 4 ) (((A 1 A 2 ) A 3 ) A 4 )
17
Il numero P(n) di parentesizzazioni possibili del prodotto A 1 A 2... A n di n matrici si esprime ricorsivamente come segue: Si può dimostrare che P(n) cresce in modo esponenziale. Quindi, tranne per valori di n molto piccoli, non è possibile enumerare tutte le parentesizzazioni.
18
Passo 1: struttura di una parentesizzazione ottima Supponiamo che una parentesizzazione ottima di A 1 A 2... A n preveda come ultima operazione il prodotto tra la matrice A 1..k (prodotto delle prime k matrici A 1... A k ) e la matrice A k+1..n (prodotto delle ultime n-k matrici A k+1... A n ). Le parentesizzazioni di A 1... A k e di A k+1... A n sono parentesizzazioni ottime per il calcolo di A 1..k e di A k+1..n. Perché?
19
Passo 2: soluzione ricorsiva Di conseguenza la matrice prodotto parziale A i..j è una matrice p i-1 p j con lo stesso numero p i-1 di righe della prima matrice A i e lo stesso numero p j di colonne dellultima matrice A j. Prendiamo come sottoproblemi il calcolo dei prodotti parziali A i..j delle matrici A i... A j. Ricordiamo che la generica matrice A i ha dimensioni p i-1 p i.
20
Se i = j allora A i..j = A i ed m[i,i] = 0. Se i < j allora A i..j = A i... A j si può calcolare come prodotto delle due matrici A i..k e A k+1..j con k compreso tra i e j-1. Il costo di questo prodotto è p i-1 p k p j. Quindi
21
Passo 3 Esempio A 1 30 35 A 2 35 15 A 3 15 5 A 4 5 10 A 5 10 20 A 6 20 25 i 165432 123456123456 A 1..1 0 A 2..2 0 A 3..3 0 A 4..4 0 A 5..5 0 A 6..6 0 j 30 35 15 5 10 20 p 35252010515p mkmk mkmk mkmk mkmk mkmk mkmk A 1..2 15750 1 A 2..3 2625 2 A 3..4 750 3 A 4..5 1000 4 A 5..6 5000 5 A 1..3 7900 1 A 2..4 4375 3 A 3..5 1500 4 A 4..6 3500 5 A 1..4 9400 3 A 2..5 7125 3 A 3..6 5375 3 A 1..5 11900 3 A 2..6 10500 3 A 1..6 15125 3 A 1..1 A 2..2 : 30 35 15 = 15750A 2..2 A 3..3 : 35 15 5 = 2625A 1..1 A 2..3 : 0+2650+30 35 5 = 7900 A 1..2 A 3..3 : 15750+0+30 15 5 = 18000 A 3..3 A 4..4 : 15 5 10 = 750A 2..2 A 3..4 : 0+750+35 15 10 = 6000 A 2..3 A 4..4 : 2625+0+35 5 10 = 4375 A 1..1 A 2..4 : 0+4375+30 35 10 = 14875 A 1..2 A 3..4 : 15750+750+30 15 10 = 21000 A 1..3 A 4..4 : 7900+0+30 5 10 = 9400 A 4..4 A 5..5 : 0+0+5 10 20 = 1000A 3..3 A 4..5 : 0+1000+15 5 20 = 2500 A 3..4 A 5..5 : 750+0+15 10 5 = 1500 A 2..2 A 3..5 : 0+1500+35 15 20 = 12000 A 2..3 A 4..5 : 2625+1000+35 5 20 = 7125 A 2..4 A 5..5 : 4375+0+35 10 20 = 11375 A 1..1 A 2..5 : 0+7125+30 35 20 = 28125 A 1..2 A 3..5 : 15750+1500+30 15 20 = 26250 A 1..3 A 4..5 : 7900+1000+30 5 20 = 11900 A 1..4 A 5..5 : 9400+0+30 10 20 = 15400 A 5..5 A 6..6 : 0+0+10 20 25 = 5000A 4..4 A 5..6 : 0+5000+5 10 25 = 6250 A 4..5 A 6..6 : 1000+0+5 20 25 = 3500 A 3..3 A 4..6 : 0+3500+15 5 25 = 5375 A 3..4 A 5..6 : 750+5000+15 10 25 = 9500 A 3..5 A 6..6 : 1500+0+15 20 25 = 9000 A 2..2 A 3..6 : 0+5375+35 15 25 = 18500 A 2..3 A 4..6 : 2625+3500+35 5 25 = 10500 A 2..4 A 5..6 : 750+5000+35 10 25 = 14500 A 2..5 A 6..6 : 1500+0+35 20 25 = 19000 A 1..1 A 2..6 : 0+10500+30 35 25 = 36750 A 1..2 A 3..6 : 15750+5375+30 15 25 = 32375 A 1..3 A 4..6 : 7900+3500+30 5 25 = 15150 A 1..4 A 5..6 : 9400+5000+30 10 25 = 21900 A 1..5 A 6..6 : 11900+0+30 20 25 = 26900
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.