1 / 21

Studieremo alcune tecniche per il progetto di algoritmi e di strutture dati:

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. Programmazione Dinamica .

roddy
Download Presentation

Studieremo alcune tecniche per il progetto di algoritmi e di strutture dati:

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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. Programmazione Dinamica Esempio: taglio delle aste Problema del taglio delle aste E’ data un’asta metallica di lunghezza nche deve essere tagliata in pezzi di lunghezza intera (con un costo di taglio trascurabile). Per ogni lunghezza l= 1,…,n è dato il prezzo pla cui si possono vendere i pezzi di quella lunghezza. Si vuole decidere come tagliare l’asta in modo da rendere massimo il ricavo della vendita dei pezzi ottenuti.

  3. Esempio

  4. Un’asta di lunghezza n può essere tagliata in 2n-1modi 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 4 1+1+2 1+3 1+2+1 2+2 2+1+1 3+1 1+1+1+1

  5. In generale il ricavo massimo rn o è il costo pn dell’asta intera oppure si ottiene effettuando un primo taglio in posizione i e quindi sommando i ricavi massimi del primo e del secondo pezzo, ossia rn=ri+ rn-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 idel primo pezzo per cui rn= pi + rn-i Cut-Road(p, n) ifn == 0 return 0 q = -1 fori =1 ton q = max(q, p[i]+Cut-Road(p, n-i)) returnq

  7. 4 3 2 1 0 2 1 0 1 0 0 1 0 0 0 0 Albero di ricorsione per n = 4 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à 2n. Ripetizione dei sottoproblemi!!

  8. Possiamo ridurre la complessità evitando di risolvere più volte gli stessi problemi. Un primo modo per farlo è dotare l’algoritmo 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) fori = 0ton// inizializza il blocco note r[i] = -1 returnCut-Road-Aux(p, n, r) Cut-Road-Aux(p, j, r) ifr[j]≥ 0// il problema è già stato risolto returnr[j] ifj == 0 q = 0 elseq = -1 fori = 1toj q = max(q, p[i] + Cut-Road-Aux(p, j-i, r)) r[j] = q returnq

  10. Versione bottom-up: Bottom-Up-Cut-Road(p, n) r[0] = 0// il problema più semplice forj = 1 ton q = -1 fori = 1toj q = max(q, p[i] + r[j-i]) r[ j] = q returnr[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 forj = 1ton q = -1 fori = 1 toj ifq < p[i]+r[ j - i] q =p[i]+r[ j - i] s[ j] = i// memorizzo il taglio ottimo r[ j] = q returnreds

  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 whilej > 0 prints[j] j = j- s[j]

  13. Moltiplicazione di matrici L’algoritmo per moltiplicare due matrici A e B di dimensioni pqe qrè: Matrix-Multiply(A, B) fori = 1 toA.rows forj = 1 toB.columns C[i, j] = 0 fork = 1toA.columns C[i, j] = C[i, j] + A[i, k] B[k, j] returnC Esso richiede pqrprodotti scalari

  14. Problema della moltiplicazione di matrici Si deve calcolare il prodotto A1 A2 ... An di n matrici di dimensioni p0p1 , p1p2 , ... , pn-1pn Poiché il prodotto di matrici è associativo possiamo calcolarlo in molti modi.

  15. Esempio: Per calcolare il prodotto A1 A2A3di 3 matrici di dimensioni 2005, 5100, 1005possiamo: a) moltiplicare A1 per A2 (100000 prodotti scalari) e poi moltiplicare per A3 la matrice 200100 ottenuta (100000 prodotti scalari). In totale 200000 prodotti scalari. b) moltiplicare A2 per A3 (2500 prodotti scalari) e poi moltiplicare A1 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 A1 A2...An. Ad esempio per n = 4: (A1(A2(A3A4))) (A1((A2A3)A4)) ((A1A2)(A3A4)) ((A1(A2A3))A4) (((A1A2)A3)A4)

  17. Il numero P(n) di parentesizzazioni possibili del prodotto A1 A2...Andi 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 A1A2...Anpreveda come ultima operazione il prodotto tra la matrice A1..k(prodotto delle prime k matrici A1...Ak) e la matrice Ak+1..n(prodotto delle ultime n-k matrici Ak+1...An). Le parentesizzazioni di A1...Ake di Ak+1...An sono parentesizzazioni ottime per il calcolo di A1..ke di Ak+1..n. Perché?

  19. Passo 2:soluzione ricorsiva Prendiamo come sottoproblemi il calcolo dei prodotti parziali Ai..jdelle matrici Ai ...Aj. Ricordiamo che la generica matrice Ai ha dimensioni pi-1pi . Di conseguenza la matrice prodotto parziale Ai..jè una matrice pi-1pjcon lo stesso numero pi-1 di righe della prima matrice Ai e lo stesso numero pj di colonne dell’ultima matrice Aj .

  20. Se i = jallora Ai..j = Aied m[i,i] = 0. Se i < jallora Ai..j = Ai...Ajsi può calcolare come prodotto delle due matrici Ai..ke Ak+1..jcon kcompreso traiej-1. Il costo di questo prodotto è pi-1 pkpj. Quindi

  21. 35 15 5 10 20 25 p 1 2 3 4 5 6 j A1..1 0 30 35 15 5 10 20 1 2 3 4 5 6 m k A2..2 0 m k A3..3 0 m k A4..4 0 m k A5..5 0 m k A6..6 0 m k p i Passo 3 Esempio A1..2 15750 1 A1..3 7900 1 A1..4 9400 3 A1..5 11900 3 A1..6 15125 3 A13035 A23515 A3155 A4510 A51020 A62025 A2..3 2625 2 A2..4 4375 3 A2..5 7125 3 A2..6 10500 3 A3..4 750 3 A3..5 1500 4 A3..6 5375 3 A4..5 1000 4 A4..6 3500 5 A5..6 5000 5 A3..3A4..6: 0+3500+15525 = 5375 A3..4A5..6: 750+5000+151025 = 9500 A3..5A6..6: 1500+0+152025 = 9000 A4..4A5..6: 0+5000+51025 = 6250 A4..5A6..6: 1000+0+52025 = 3500 A5..5A6..6: 0+0+102025 = 5000 A1..1A2..5: 0+7125+303520 = 28125 A1..2A3..5: 15750+1500+301520 = 26250 A1..3A4..5: 7900+1000+30520 = 11900 A1..4A5..5: 9400+0+301020 = 15400 A2..2A3..5: 0+1500+351520 = 12000 A2..3A4..5: 2625+1000+35520 = 7125 A2..4A5..5: 4375+0+351020 = 11375 A3..3A4..5: 0+1000+15520 = 2500 A3..4A5..5: 750+0+15105 = 1500 A1..1A2..3: 0+2650+30355 = 7900 A1..2A3..3: 15750+0+30155 = 18000 A1..1A2..4: 0+4375+303510 = 14875 A1..2A3..4: 15750+750+301510 = 21000 A1..3A4..4: 7900+0+30510 = 9400 A2..2A3..4: 0+750+351510 = 6000 A2..3A4..4: 2625+0+35510 = 4375 A3..3A4..4: 15510 = 750 A2..2A3..3: 35155 = 2625 A1..1A2..2: 303515 = 15750 A2..2A3..6: 0+5375+351525 = 18500 A2..3A4..6: 2625+3500+35525 = 10500 A2..4A5..6: 750+5000+351025 = 14500 A2..5A6..6: 1500+0+352025 = 19000 A4..4A5..5: 0+0+51020 = 1000 A1..1A2..6: 0+10500+303525 = 36750 A1..2A3..6: 15750+5375+301525 = 32375 A1..3A4..6: 7900+3500+30525 = 15150 A1..4A5..6: 9400+5000+301025 = 21900 A1..5A6..6: 11900+0+302025 = 26900

More Related