La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 13 - Programmazione dinamica Alberto Montresor Università di Trento This work is licensed under.

Presentazioni simili


Presentazione sul tema: "1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 13 - Programmazione dinamica Alberto Montresor Università di Trento This work is licensed under."— Transcript della presentazione:

1 1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 13 - Programmazione dinamica Alberto Montresor Università di Trento This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.

2 2 © Alberto Montresor Programmazione dinamica Divide-et-impera Tecnica ricorsiva Approccio top-down (problemi divisi in sottoproblemi) Vantaggioso solo quando i sottoproblemi sono indipendenti Altrimenti, gli stessi sottoproblemi possono venire risolti più volte Programmazione dinamica Tecnica iterativa Approccio bottom-up Vantaggiosa quando ci sono sottoproblemi in comune Esempio semplice: il triangolo di Tartaglia

3 3 © Alberto Montresor Coefficienti binomiali Il numero di modi di scegliere k oggetti da un insieme di n oggetti I coefficienti di unequazione di grado n

4 4 © Alberto Montresor Triangolo di Tartaglia Versione ricorsiva Deriva direttamente dalla definizione Domanda Complessità?

5 5 © Alberto Montresor Triangolo di Tartaglia Versione iterativa Basata su programmazione dinamica Domanda Complessità?

6 6 © Alberto Montresor Quando applicare la programmazione dinamica? Sottostruttura ottima E' possibile combinare le soluzioni dei sottoproblemi per trovare la soluzione di un problema più grande PS: In tempo polinomiale! Le decisioni prese per risolvere un problema rimangono valide quando esso diviene un sottoproblema di un problema più grande Sottoproblemi ripetuti Un sottoproblema può occorrere più volte Spazio dei sottoproblemi Deve essere polinomiale

7 7 © Alberto Montresor Programmazione dinamica Caratterizzare la struttura di una soluzione ottima Definire ricorsivamente il valore di una soluzione ottima La soluzione ottima ad un problema contiene le soluzioni ottime ai sottoproblemi Calcolare il valore di una soluzione ottima bottom-up (cioè calcolando prima le soluzioni ai casi più semplici) Si usa una tabella per memorizzare le soluzioni dei sottoproblemi Evitare di ripetere il lavoro più volte, utilizzando la tabella Costruire la (una) soluzione ottima.

8 8 © Alberto Montresor Catena di moltiplicazione di matrici Problema: Data una sequenza di matrici A 1, A 2, A 3, …, A n, compatibili 2 a 2 al prodotto, vogliamo calcolare il loro prodotto. Cosa vogliamo ottimizzare La moltiplicazione di matrici si basa sulla moltiplicazione scalare come operazione elementare. Vogliamo calcolare il prodotto impiegando il numero minore possibile di moltiplicazioni Attenzione: Il prodotto di matrici non è commutativo......ma è associativo: ( A 1 A 2 ) A 3 = A 1 ( A 2 A 3 )

9 9 © Alberto Montresor Catena di moltiplicazione tra matrici 3 matrici:ABC 100x11x100100x1 # MoltiplicazioniMemoria ( A B ) (( A B ) C ) 100×1×100 = ×100×1 = ( B C ) ( A ( B C )) 1×100×1 = ×1×1 =

10 10 © Alberto Montresor Catena di moltiplicazione tra matrici 4 matrici: A B C D 50x1010x4040x30 30x5 ((( A B ) C ) D ) : moltiplicazioni (( A ( B C )) D ) : moltiplicazioni (( A B ) ( C D )) : moltiplicazioni ( A (( B C ) D )) : moltiplicazioni ( A ( B ( C D ))) : moltiplicazioni ((( A B ) C ) D ) : ( A B ) 50×10×40 = (( A B ) C )50×40×30 = (( A B ) C ) D 50×30× 5 =

11 11 © Alberto Montresor Applicare la programmazione dinamica Le fasi principali: Caratterizzare la struttura di una soluzione ottima Definire ricorsivamente il valore di una soluzione ottima Calcolare il valore di una soluzione ottima bottom-up (dal basso verso lalto) Costruzione di una soluzione ottima Nei lucidi successivi: Vediamo ora una ad una le quattro fasi del processo di sviluppo applicate al problema della parentesizzazione ottima

12 12 © Alberto Montresor Parentesizzazione Definizione: Una parentesizzazione P i,j del prodotto A i · A i+1 · · · A j consiste nella matrice A i, se i = j ; nel prodotto di due parentesizzazioni ( P i,k · P k+1,j ), altrimenti. Esempio: ( A 1 ·( A 2 · A 3 )) · ( A 4 ·( A 5 · A 6 )) k =3 Ultima moltiplicazione (A 1 ·(A 2 ·A 3 ))·(A 4 ·(A 5 ·A 6 )) (A 1 ·(A 2 ·A 3 ))(A 4 ·(A 5 ·A 6 )) A1A1 (A 2 ·A 3 )A4A4 (A 5 ·A 6 ) A2A2 A3A3 A5A5 A6A6

13 13 © Alberto Montresor Parentesizzazione ottima Determinare il numero di moltiplicazioni scalari necessari per i prodotti tra le matrici in ogni parentesizzazione Scegliere una delle parentesizzazioni che richiedono il numero minimo di moltiplicazioni Motivazione: Vale la pena di spendere un po' di tempo per cercare la parentesizzazione migliore, per risparmiare tempo dopo Domanda Quante sono le parentesizzazioni possibili? n =3 2, n =4 5, n =5 ???

14 14 © Alberto Montresor Parentesizzazione ottima Definiamo una relazione di ricorrenza P ( n ): numero di parentesizzazioni per n matrici A 1 · A 2 · A 3 ··· A n L'ultima moltiplicazione può occorrere in n-1 posizioni diverse Fissato l'indice k dell'ultima moltiplicazione, abbiamo P ( k ) parentesizzazioni per A 1 · A 2 · A 3 ··· A k P ( n-k ) parentesizzazioni per A k +1 · A k +2 ··· A n P(n) n

15 15 © Alberto Montresor Parentesizzazione ottima Equazione di ricorrenza: Soluzione: n-1-esimo numero catalano Domanda: Più semplicemente, dimostrare che P(n) = Ω(2 n ) Conseguenza: la forza bruta (tentare tutte le possibili parentesizzazioni) non funziona

16 16 © Alberto Montresor Definizioni Denoteremo nel seguito con: A 1 · A 2 · A 3 ··· A n il prodotto di n matrici da ottimizzare c i-1 il numero di righe della matrice A i c i il numero di colonne della matrice A i A[i..j] il prodotto A i · A i+1 ··· A j P[i..j] una parentesizzazione di A[i..j] (non necessariamente ottima)

17 17 © Alberto Montresor Struttura di una parentesizzazione ottima Sia A[i..j] = A i · A i+1 ··· A j una sottosequenza del prodotto di matrici Si consideri una parentesizzazione ottima P [ i..j ] di A [ i..j ] Esiste una ultima moltiplicazione: in altre parole, esiste un indice k tale che P [ i..j ] = P [ i..k ] · P [ k+1.. j ] Domanda: Quali sono le caratteristiche delle due sotto-parti P [ i.. k ] e P [ k+1.. j ] ? ( P[i..k] ) · ( P[k+1..j] ) P[i..k] P[k+1..j] ??

18 18 © Alberto Montresor Struttura di una parentesizzazione ottima Teorema (sottostruttura ottima) Se P [ i..j ] = P [ i..k ] · P [ k+1..j ] è una parentesizzazione ottima del prodotto A [ i..j ], allora P [ i..k ] e P [ k+1..j ] sono parentesizzazioni ottime dei prodotti A [ i..k ] e A [ k+1..j ], rispettivamente. Dimostrazione Ragionamento per assurdo Supponiamo esista un parentesizzazione ottima P' [ i..k] di A [ i..k ] con costo inferiore a P [ i..k ] Allora, P' [ i..k ] · P [ k+1..j ] sarebbe una parentesizzazione di A [ i..j ] con costo inferiore a P [ i..j ], assurdo.

19 19 © Alberto Montresor Struttura di una parentesizzazione ottima In altre parole: Il teorema afferma che esiste una sottostruttura ottima : Ogni soluzione ottima al problema della parentesizzazione contiene al suo interno le soluzioni ottime dei due sottoproblemi Programmazione dinamica: L'esistenza di sottostrutture ottime è una delle caratteristiche da cercare per decidere se la programmazione dinamica è applicabile Prossima fase: Definire ricorsivamente il costo di una soluzione ricorsiva

20 20 © Alberto Montresor Definire ricorsivamente il valore di una soluzione ottima Definizione: sia M[i,j] il numero minimo di prodotti scalari richiesti per calcolare il prodotto A[i,j] Come calcolare M[i,j]? Caso base: i=j. Allora, M [ i, j ] = 0 Passo ricorsivo: i < j. Esiste una parentesizzazione ottima P [ i.. j ] = P [ i.. k ] · P [ k +1.. j ]; sfruttiamo la ricorsione: M [ i, j ] = M [ i, k ] + M [ k +1, j ] + c i -1 · c k · c j Prodotti per P[i..k] Prodotti per P[k+1..j] Prodotto di una coppia di matrici: n. righe: prima matrice n. colonne: ultima matrice

21 21 © Alberto Montresor Definire ricorsivamente il valore di una soluzione ottima Ma qual è il valore di k? Non lo conosciamo ma possiamo provarli tutti! k può assumere valori fra i e j -1 La formula finale: M [ i,j ] = min i k < j { M [ i,k ] + M [ k +1, j ] + c i -1 · c k · c j }

22 22 © Alberto Montresor Esempio L R M [ 1,2 ] = min 1 k < 2 { M [ 1,k ] + M [ k+1,2 ] + c 0 c k c 2 } = M [ 1,1 ] + M [ 2,2 ] + c 0 c 1 c 2 = c 0 c 1 c 2 i \ j

23 23 © Alberto Montresor Esempio L R M [ 2,4 ] = min 2k<4 { M [ 2,k ] + M [ k+1,4 ] + c 1 c k c 4 } = min { M [ 2,2 ] + M [ 3,4 ] + c 1 c 2 c 4, M [ 2,3 ] + M [ 4,4 ] + c 1 c 3 c 4 } i \ j

24 24 © Alberto Montresor Esempio L R M [ 2,5 ] = min 2k<5 { M [ 2,k ] + M [ k+1,5 ] + c 1 c k c 5 } = min { M [ 2,2 ] + M [ 3,5 ] + c 1 c 2 c 5, M [ 2,3 ] + M [ 4,5 ] + c 1 c 3 c 5, M [ 2,4 ] + M [ 5,5 ] + c 1 c 4 c 5 } i \ j

25 25 © Alberto Montresor Esempio L R M[1,5] = min 1k<5 { M[1,k] + M[k+1,5] + c 0 c k c 5 } = min { M [1,1] + M [2,5] + c 0 c 1 c 5, M [1,2] + M [3,5] + c 0 c 2 c 5, M [1,3] + M [4,5] + c 0 c 3 c 5, M [1,4] + M [5,5] + c 0 c 4 c 5 } i \ j

26 26 © Alberto Montresor Esempio L R M [ 1,6 ] = min 1k<6 { M [ 1,k ] + M [ k+1,6 ] + c 0 c k c 6 } = min { M [ 1,1 ] + M [ 2,6 ] + c 0 c 1 c 6, M [ 1,2 ] + M [ 3,6 ] + c 0 c 2 c 6, M [ 1,3 ] + M [ 4,6 ] + c 0 c 3 c 6, M [ 1,4 ] + M [ 5,6 ] + c 0 c 4 c 6, M [ 1,5 ] + M [ 6,6 ] + c 0 c 5 c 6 } i \ j

27 27 © Alberto Montresor Calcolo bottom-up del valore della soluzione Passiamo ora al terzo passo della programmazione dinamica: calcolare in modo bottom-up il valore della soluzione ottima Ma la definizione ricorsiva di M[i,j] suggerisce di utilizzare un approccio ricorsivo top-down per risolvere il problema: Lanciamo il problema sulla sequenza completa [1, n ] Il meccanismo ricorsivo individua i sottoproblemi da risolvere Proviamo... male non fa ;-) Input: un array c [0.. n ] con le dimensioni delle matrici, c [0] è il numero di righe della prima matrice c [ i ] è il numero di colonne della matrice A i

28 28 © Alberto Montresor Soluzione ricorsiva top-down Domanda: Complessità risultante?

29 29 © Alberto Montresor Critica all'approccio top-down Alcune riflessioni La soluzione ricorsiva top-down è Ω(2 n ) Non è poi migliore dell'approccio basato su forza bruta! Qual è il problema? Il problema principale è che molti problemi vengono risolti più volte 1…4 1…1 2…4 1…2 3…4 1…3 4…4 1…1 2…2 3…4 2…3 4…4 3…3 4…4 1…1 2…3 1…2 3…3 4…42…23…32…23…3 1…12…2

30 30 © Alberto Montresor Calcolare la soluzione ottima in modo bottom-up E' interessante notare che il numero di possibili problemi è molto inferiore a 2 n uno per ogni scelta di i e j (con 1 i j n): Ogni sottoproblema È risolvibile utilizzando le soluzioni dei sottoproblemi che sono state eventualmente già calcolate e memorizzate nell'array Idea chiave della programmazione dinamica: Mai calcolare più di una volta la soluzione ad un sottoproblema Sottoproblemi con i j Sottoproblemi con i = j

31 31 © Alberto Montresor Calcolare la soluzione ottima in modo bottom-up Lalgoritmo parentesizzazione() prende in ingresso un array c [0.. n ] con le dimensioni delle matrici c [0] è il numero di righe della A 1 c [ i ] è il numero di righe della matrice A i +1 il numero di colonne della matrice A i utilizza (e ritorna) due matrici n · n ausiliarie: M [ i,j ] che contiene i costi minimi dei sottoproblemi A [ i..j ] S [ i,j ] che contiene il valore di k che minimizza il costo per il sottoproblema

32 32 © Alberto Montresor Algoritmo h varia sulle diagonali sopra quella principale i e j assumono i valori delle celle nella diagonale h Calcola tutti i possibili valori e conserva solo il più piccolo L

33 33 © Alberto Montresor L R L R M [1,4] = min 1 k 3 { M [1, k ] + M [ k +1,4] + c 0 c k c 4 } = min { M [1,1] + M [2,4] + c 0 c 1 c 4, M [1,2] + M [3,4] + c 0 c 2 c 4, M [1,3] + M [4,4] + c 0 c 3 c 4 } = min { * 8 * 3, * 4 * 3, * 2 * 3 } = min { 280, 332, 218 } = L R L R L R cici i L R i M[ ] i \ j

34 34 © Alberto Montresor M [1,4] = min 1 k 3 { M [1, k ] + M [ k +1,4] + c 0 c k c 4 } = min { M [1,1] + M [2,4] + c 0 c 1 c 4, M [1,2] + M [3,4] + c 0 c 2 c 4, M [1,3] + M [4,4] + c 0 c 3 c 4 } = min { * 8 * 3, * 4 * 3, * 2 * 3 } = min { 280, 332, 218 } = cici i S[ ] L R i \ j

35 35 © Alberto Montresor Calcolare la soluzione ottima in modo bottom-up Considerazioni sull'algoritmo Costo computazionale: O ( n 3 ) Nota Lo scopo della terza fase era calcolare in modo bottom-up il valore della soluzione ottima Questo valore si trova in M [1, n ] Per alcuni problemi E' anche necessario mostrare la soluzione trovata Per questo motivo registriamo informazioni sulla soluzione mentre procediamo in maniera bottom-up

36 36 © Alberto Montresor Costruire una soluzione ottima Possiamo definire un algoritmo che costruisce la soluzione a partire dall'informazione calcolata da parentesizzazione(). La matrice S ci permette di determinare il modo migliore di moltiplicare le matrici. S [ i,j ]= k contiene infatti il valore k su cui dobbiamo spezzare il prodotto A [ i.. j ] Ci dice cioè che per calcolare A [ i.. j ] dobbiamo prima calcolare A [ i.. k ] e A [ k +1.. j ] e poi moltiplicarle tra loro. Ma questo è un processo facilmente realizzabile tramite un algoritmo ricorsivo

37 37 © Alberto Montresor Costruire una soluzione ottima

38 38 © Alberto Montresor Costruire una soluzione ottima

39 39 © Alberto Montresor Esempio di esecuzione L R A 1…6 = A 1…k × A k+1…6 = A 1…3 × A 4…6 A 1…3 = A 1…k × A k+1…3 =A 1 × A 2…3 A 4…6 = A 4…k × A k+1…6 =A 4..5 × A 6 A 2…3 = A 2…k × A k+1…3 = A 2 × A 3 A 4…5 = A 4…k × A k+1…5 =A 4 × A 5 A 1…6 = ( ( A 1 ( A 2 A 3 ) ) ( ( A 4 A 5 ) A 6 ) ) S[ ] i \ j

40 40 © Alberto Montresor Numeri di Fibonacci Definiti ricorsivamente F (0) = F (1) = 1 F ( n ) = F ( n -2)+ F ( n -1) Un po' di storia Leonardo di Pisa, detto Fibonacci Utilizzati per descrivere la crescita di una popolazione di conigli (!) In natura: Pigne, conchiglie, parte centrale dei girasoli, etc. In informatica: Alberi AVL minimi, Heap di Fibonacci, etc.

41 41 © Alberto Montresor Implementazione ricorsiva Complessità computazionale Soluzione T(n) = O(2 n )

42 42 © Alberto Montresor Implementazione iterativa f [ ]f [ ] 43210n Complessità In tempo: O ( n ) In spazio: O ( n ) Array di n elementi

43 43 © Alberto Montresor Implementazione iterativa - risparmio memoria F2F n F1F1 F0F Complessità In tempo: O ( n ) In spazio: O ( 1 ) 3 variabili

44 44 © Alberto Montresor Zaino Input Un intero positivo C - la capacità dello zaino n oggetti, tali che loggetto i -esimo è caratterizzato da: un profitto p i e un volume v i, entrambi interi positivi Problema trovare un sottoinsieme S di {1,..., n } di oggetti tale che il volume totale non superi la capacità massima e il profitto totale sia massimo

45 45 © Alberto Montresor Zaino Caratterizzazione del problema P ( i, c ) è il sottoproblema dato dai primi i oggetti da inserire in uno zaino con capacità c Il problema originale corrisponde a P ( n, C ) Teorema - sottostruttura ottima Sia S ( i, c ) una soluzione ottima per il problema P ( i, c ) Possono darsi due casi: Se i S ( i, c ), allora S ( i, c )-{ i } è una soluzione ottima per il sottoproblema P ( i -1, c - v i ) Se i S ( i, c ), allora S ( i, c ) è una soluzione ottima per il sottoproblema P ( i 1, c ) Dimostrazione per assurdo

46 46 © Alberto Montresor Zaino Tabella per programmazione dinamica D [ i, c ] contiene il profitto massimo ottenibile per il problema P ( i, c ) Alcune considerazioni Costo di un algoritmo di programmazione dinamica bottom-up: O ( nC ) Non è detto che tutti i problemi debbano essere risolti

47 47 © Alberto Montresor Memoization Memoization (annotazione) Tecnica che fonde l'approccio di memorizzazione della programmazione dinamica con l'approccio top-down di divide-et-impera Quando un sottoproblema viene risolto per la prima volta, viene memorizzato in una tabella ogni volta che si deve risolvere un sotto-problema, si controlla nella tabella se è già stato risolto precedentemente SI: si usa il risultato della tabella NO:si calcola il risultato e lo si memorizza In tal modo, ogni sottoproblema viene calcolato una sola volta e memorizzato come nella versione bottom-up

48 48 © Alberto Montresor Zaino annotato Note sulla soluzione è un valore speciale per indicare che un certo problema non è stato risolto Gli elementi della tabella D sono inizializzati con il valore

49 49 © Alberto Montresor Discussione su memoization Caso pessimo Nel caso pessimo, è comunque O ( nC ) Quando si verifica? Inizializzazione E necessario inizializzare D - costo O ( nC ) Se il costo dellinizializzazione è asintoticamente inferiore al costo di ricombinare i risultati, si ottiene un guadagno Altrimenti: è possibile utilizzare una tabella hash Complessità pseudo-polinomiale La complessità O( nC ) è polinomiale nella dimensione dellinput?

50 50 © Alberto Montresor Bioinformatica DNA Una stringa di molecole chiamate basi Solo quattro basi: Adenina, Citosina, Guanina, Timina Esempi Due esempi di DNA: AAAATTGA, TAACGATAG Date due sequenze, è lecito chiedersi quanto siano simili Una è sottostringa dell'altra? Distanza di editing: costo necessario per trasformare una nell'altra La più lunga sottosequenza (anche non contigua) comune ad entrambe

51 51 © Alberto Montresor Caratterizzazione del problema Definizione Una sequenza T è una sotto-sequenza di P se T è ottenuta da P rimuovendo uno o più elementi Alternativamente: T è definito come il sottoinsieme degli indici l'insieme di elementi di P che compaiono anche in T Gli elementi rimanenti devono comparire nello stesso ordine, anche se non devono essere necessariamente contigui in P Esempio P = AAAATTGA, T = AAATA Nota La sequenza nulla è una sotto-sequenza di ogni sequenza

52 52 © Alberto Montresor Caratterizzazione del problema Definizione: Date due sequenze P e T, una sequenza Z è una sottosequenza comune di P e T se Z è sottosequenza sia di P che di T Scriviamo Z CS ( P, T ) Common Subsequence, o CS Definizione: Date due sequenze P e T, una sequenza è una sottosequenza comune massimale di P e T, se Z CS ( P, T ) e non esiste una sequenza W CS ( P, T ) tale che | W | > |Z| Scriviamo Z LCS ( P, T ) Longest Common Subsequence, o LCS

53 53 © Alberto Montresor Caratterizzazione del problema Problema LCS Input: due sequenze di simboli, P e T Output: Trovare la più lunga sottosequenza Z comune a P e T Esempio P = AAAATTGA T = TAACGATA LCS ( P, T ) = ???? Prima di provare con la programmazione dinamica, proviamo di forza bruta...

54 54 © Alberto Montresor Risoluzione tramite enumerazione Domanda: Quante sono le sotto-sequenze di P?

55 55 © Alberto Montresor Caratterizzazione della soluzione ottima Data una sequenza P=(p 1, …, p n ): denoteremo con P ( i ) l i -esimo prefisso di P, cioè la sotto-sequenza ( p 1, …, p i ) Esempio: P = ABDCCAABD P (0) denota la sotto-sequenza nulla P (3) = ABD P (6) = ABDCCA

56 56 © Alberto Montresor Caratterizzazione della soluzione ottima Teorema (Sottostruttura ottima) Date le due sequenze P =( p 1,…, p m ) e T =( t 1, …, t n ), sia Z =( z 1,…,z k ) una LCS di P e T 1. p m = t n z k = p m = t n e Z ( k -1) LCS ( P ( m - 1), T ( n -1) ) 2. p m t n e z k p m Z LCS ( P ( m -1), T ) 3. p m t n e z k t n Z LCS ( P, T ( n -1) ) Dimostrazione

57 57 © Alberto Montresor Dimostrazione Punto 1 Supponiamo per assurdo che z k p m = t n Si consideri W=Zp m. Allora W CS ( P,T ) e | W | > | Z |, assurdo Quindi z k = p m = t n Supponiamo per assurdo che Z ( k -1) LCS ( P ( m -1), T ( n -1) ) Allora esiste W LCS ( P ( m -1), T ( n -1) ) tale che | W | > | Z ( k -1)| Quindi Wp m CS ( P, T ) e | Wp m | > | Z |, assurdo P[1,…,m-1] T[1,…,n-1] Z[1,…,k-1] a a a P[1,…,m] T[1,…,n] Z[1,…,k]

58 58 © Alberto Montresor Dimostrazione Punto 2 (Punto 3 simmetrico) Se z k p m, allora Z CS ( P ( m -1), T ) Per assurdo ipotizziamo che Z LCS ( P ( m -1), T ) allora esiste W LCS ( P ( m -1), T ) tale che: | W | > | Z | Allora è anche vero che W LCS ( P, T ), contraddicendo l'ipotesi b P [1,…, m ] T [1,…, n ] a ? Z [1,…, k ] P [1,…, m -1] T [1,…, n ] b ? Z [1,…, k ]

59 59 © Alberto Montresor Cosa ci dice il teorema? Se p m = t n, dobbiamo risolvere un sottoproblema LCS ( P ( m -1), T ( n -1) ) La definizione ricorsiva è la seguente: LCS ( P, T ) = LCS ( P ( m -1), T ( n -1) ) p m Se p m t n, dobbiamo risolvere due sottoproblemi LCS ( P ( m -1), T ) LCS ( P, T ( n -1) ) A questo punto, dobbiamo scegliere la LCS più lunga fra le 2 La definizione ricorsiva è la seguente: LCS ( P, T ) = longest( LCS ( P ( m -1), T ), LCS ( P, T ( n -1) ) )

60 60 © Alberto Montresor LCS basato su programmazione dinamica Definiamo una tabella per memorizzare la lunghezza dei vari sottoproblemi di LCS: D [0... m, 0... n ] tabella di ( m+ 1 ) · ( n +1) elementi, dove | P | = m, | T | = n D [ i, j ] lunghezza della LCS di P ( i ) e T ( j ) Goal finale: Calcolare D[ m, n ] lunghezza della LCS di P e T Formulazione ricorsiva

61 61 © Alberto Montresor LCS basato su programmazione dinamica Definiamo una tabella per memorizzare informazioni necessarie ad ottenere la stringa finale B [0... m, 0... n ] tabella di ( m +1) · ( n +1) elementi, dove | P | = m, | T | = n B [ i, j ] puntatore alla entry della tabella stessa che identifica il sottoproblema ottimo scelto durante il calcolo del valore D [ i, j ] Valori possibili: deriva da i-1,j-1 deriva da i-1,j deriva da i,j-1

62 62 © Alberto Montresor ATBCBD T A C C B T i j deriva da i-1,j-1 deriva da i-1,j deriva da i,j-1 TACCBT ATBCBD

63 © Alberto Montresor BEBEDE A B D D B E i j deriva da i-1,j-1 deriva da i-1,j deriva da i,j-1 ABDDBE BEBEDE

64 64 © Alberto Montresor Calcolo del valore della soluzione ottima

65 © Alberto Montresor BEBEDE A B D D B E i j deriva da i-1,j-1 deriva da i-1,j deriva da i,j-1 ABDDBE BEBEDE

66 66 © Alberto Montresor ATBCBD T A C C B T i j deriva da i-1,j-1 deriva da i-1,j deriva da i,j-1 TACCBT ATBCBD

67 67 © Alberto Montresor Alcune ottimizzazioni La matrice B può essere eliminata: Il valore di D [ i, j ] dipende solo dai valori D [ i -1, j -1], D [ i, j -1] e D [ i -1, j ]. In tempo costante si può quindi determinare quale di questi tre è stato usato, e perciò quale sia il tipo di freccia Se ci serve solo calcolare la lunghezza della LCS, possiamo ridurre la tabella D[i,j] a due sole righe di lunghezza min{ n, m } Ad ogni istante (cioè per ogni coppia i, j ), ci servono i valori D [ i -1, j -1], D [ i, j -1] e D [ i -1, j ] Esercizio

68 68 © Alberto Montresor Stampa della soluzione ottima Costo computazionale A ogni passo, almeno uno fra i e j viene decrementato: θ( m + n )

69 69 © Alberto Montresor LCS e diff diff Esamina due file di testo, e ne evidenzia le differenze a livello di riga. Lavorare a livello di riga significa che i confronti fra simboli sono in realtà confronti fra righe, e che n ed m sono il numero di righe dei due file Ottimizzazioni diff è utilizzato soprattutto per codice sorgente; è possibile applicare euristiche sulle righe iniziali e finali per distinguire le righe - utilizzo di hash table

70 70 © Alberto Montresor String matching approssimato Input una stringa P = p 1 ··· p m ( pattern ) una stringa T = t 1 ··· t n ( testo ), con m n Definizione Un occorrenza k-approssimata di P in T, con 0 k m, è una copia della stringa P nella stringa T in cui sono ammessi k errori (o differenze) tra caratteri di P e caratteri di T, del seguente tipo: (1) i corrispondenti caratteri in P e in T sono diversi ( sostituzione ) (2) un carattere in P non è incluso in T ( inserimento ) (3) un carattere in T non è incluso in P ( cancellazione ) Problema: Trovare unoccorrenza k -approssimata di P in T per cui k sia minimo.

71 71 © Alberto Montresor Esempio Input questoèunoscempio unesempio Domanda Qual è il minimo valore k per cui si trova una occorrenza k-approssimata? A partire da dove? Con quali errori?

72 72 © Alberto Montresor Sottostruttura ottima Definizione Tabella D [0... m, 0... n ], i cui elementi D [ i,j ] contengono il minimo valore k per cui esiste una occorrenza k -approssimata di P ( i ) in T ( j ) D[i,j] può essere uguale a D [ i -1, j -1], se p i = t j avanza su entrambi i caratteri (uguali) D [ i -1, j -1]+1, se p i t j avanza su entrambi i caratteri (sostituzione) D [ i -1, j ]+1avanza sul pattern (inserimento) D [ i, j -1]+1avanza sul testo (cancellazione)

73 73 © Alberto Montresor Sottostruttura ottima Definizione Tabella D [0... m, 0... n ], i cui elementi D [ i,j ] contengono il minimo valore k per cui esiste una occorrenza k -approssimata di P ( i ) in T ( j ) Ricordate che cerchiamo il minimo:

74 74 © Alberto Montresor Ricostruzione della soluzione finale Si noti che: D [ m,j ] = k se e solo se cè unoccorrenza k -approssimata di P in T che termina in t j la soluzione del problema è data dal valore di D [ m, j ] più piccolo, per 0 j n

75 75 © Alberto Montresor Algoritmo String matching approssimato Domanda : complessità?

76 76 © Alberto Montresor String matching approssimato Variante dello string matching approssimato: Distanza di editing (Distanza di Levenshtein) Date due stringhe, vogliamo conoscere il numero minimo di operazioni (sostituzione, inserimento, cancellazione) necessarie per trasformare una nellaltra (o viceversa, visto che inserimento e cancellazione sono simmetriche) Esempio: distanza fra google e yahoo ? Algoritmo? Come (e se) dobbiamo modificare le condizioni iniziali? Come (e se) dobbiamo modificare la definizione ricorsiva?

77 77 © Alberto Montresor Insieme indipendente di intervalli pesati Input Siano dati n intervalli distinti [ a 1, b 1 [,..., [ a n,b n [ della retta reale, aperti a destra, dove allintervallo i è associato un peso w i, 1 i n. Definizione Due intervalli i e j si dicono digiunti se: b j a i oppure b i a j Output: Trovare un insieme indipendente di peso massimo, ovvero un sottoinsieme di intervalli tutti disgiunti tra di loro tale che la somma dei pesi degli intervalli nel sottoinsieme sia la più grande possibile Esempio: Prenotazione di una sala conferenza in un hotel aiai bibi ajaj bjbj

78 78 © Alberto Montresor Pre-elaborazione Per poter applicare la programmazione dinamica, è necessario effettuare una pre-elaborazione Ordiniamo gli intervalli per estremi finali non decrescenti b 1 b 2 b n Per ogni intervallo i, sia p i = j il predecessore di i, dove j < i è il massimo indice tale che [ a j, b j [ è disgiunto da [ a i, b i [ (se non esiste j, allora p i = 0) Teorema sottostruttura ottima Sia P [ i ] il sottoproblema dato dai primi i intervalli e sia S [ i ] una sua soluzione ottima di peso D [ i ] Se lintervallo i-esimo non fa parte di tale soluzione, allora deve valere D [ i ] = D [ i 1], dove si assume D [0] = 0; altrimenti, deve essere D [ i ] = w i + D [ p i ]

79 79 © Alberto Montresor Definizione ricorsiva Definizione ricorsiva del peso di una soluzione ottima D [ n ] è il problema originario Costo della procedura risultante O( n log n ) per lordinamento O( n log n ) per il calcolo degli indici p i O( n ) per il riempimento della tabella O( n ) per la ricostruzione della soluzione Esercizio: Scrivere algoritmo per il calcolo degli indici p i

80 80 © Alberto Montresor Codice


Scaricare ppt "1 © Alberto Montresor Algoritmi e Strutture Dati Capitolo 13 - Programmazione dinamica Alberto Montresor Università di Trento This work is licensed under."

Presentazioni simili


Annunci Google