La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Programmazione dinamica: problema della sottosequenza più lunga Esempio problema Algoritmo di ricerca esaustiva Caratterizzazione soluzione ottima Algoritmo.

Presentazioni simili


Presentazione sul tema: "Programmazione dinamica: problema della sottosequenza più lunga Esempio problema Algoritmo di ricerca esaustiva Caratterizzazione soluzione ottima Algoritmo."— Transcript della presentazione:

1 Programmazione dinamica: problema della sottosequenza più lunga Esempio problema Algoritmo di ricerca esaustiva Caratterizzazione soluzione ottima Algoritmo ricorsivo Stategia Bottom-up Costruzione soluzione ottima

2 Problema della sottosequenza più lunga Input: vengono dati in ingresso due sequenze x[1…m] e y[1…n] Problema: Cercare una sottosequenza più lunga che sia comune ad entrambe le sequenze. (Longest Common Subsequence, LCS) x: A B C B D A B y: B D C A B A Sottosequenza: una sottosequenza di una sequenza Z è un sottoinsieme strettamente crescente di Z Verso sequenza BCBA= LCS(x,y)

3 Algoritmo di bruta forza Idea: per ogni sottosequenza di x[1…m] si controlla se è una sottosequenza di y[1…n]. Si memorizza la prima sottosequenza comune più lunga trovata. Analisi complessità: Ci vuole tempo O(n) per controllare se una sequenza è sottosequenza di y[1…n] 2 m sottosequenze a partire da x[1…m] (basta pensare ad un vettore binario lungo m, ogni 1 vuol dire che lelemento appartiene alla sottosequenza) Caso Peggiore: O(n 2 m ) tempo esponenziale

4 Soluzione in programmazione dinamica Lo sviluppo di un algoritmo in programmazione dinamica può essere diviso in quattro fasi o passi: 1.Caratterizzazione della struttura di una soluzione ottima. 2.Definizione ricorsiva del valore di una soluzione ottima. 3.Calcolo del valore di una soluzione ottima con una strategia bottom-up. 4.Costruzione di una soluzione ottima a partire dalle informazioni calcolate.

5 Caratterizzazione soluzione ottima Siano X[1…m] e Y[1…n] due sequenze e sia Z[z 1, z 2 …z k ] una LCS (sottosequenza più lunga), allora: 1.Se x m = y n allora x m = y n = z k e Z[z 1, z 2 …z k-1 ] è LCS di X[1…m-1] e Y[1…n-1] 2.Se x m y n allora: a.se x m z k si ha che Z[z 1, z 2 …z k ] è LCS di X[1…m-1] e Y[1…n] b. se y n z k si ha che Z[z 1, z 2 …z k ] è LCS di X[1…m] e Y[1…n-1]

6 Caratterizzazione soluzione ottima Dimostrazione: 1.x m = y n Allora x m = y n = z k. Se non fosse così e x m = y n z k, allora si potrebbe estendere Z con x m = y n … assurdo! Si ha dunque che Z[1…k-1] è sottosequenza lunga k-1 sia di X[1…m-1] sia di Y[1…n-1]. Z[1…k-1] è anche la LCS di X[1…m-1] e di Y[1…n-1]. Se non fosse così ci sarebbe Z[1…t] con t > k-1 LCS di X[1…m-1] e di Y[1…n-1]. Allora Z potrebbe essere esteso con x m = y n, formando una sottosequenza comune a X[1…m] e Y[1…n] lunga t+1 > k … assurdo!

7 Caratterizzazione soluzione ottima Dimostrazione: 2. a. x m z k Z[1…k-1] è anche la LCS di X[1…m-1] e di Y[1…n]. Se non fosse così ci sarebbe Z[1…t] con t > k LCS di X[1…m-1] e di Y[1…n]. Allora Z sarebbe una sottosequenza comune a X[1…m] e Y[1…n] lunga t > k … assurdo! 2. b. y n z k (speculare)

8 Definizione ricorsiva soluzione ottima Siano X[1…i] e Y[1…j] due sequenze e sia Z[z 1, z 2 …z k ] una LCS (sottosequenza più lunga), allora: 1.Se x i = y j allora x i = y j = z k e Z[z 1, z 2 …z k-1 ] è LCS di X[1…i-1] e Y[1…j-1] 2.Se x i y j allora: a.se x i z k si ha che Z[z 1, z 2 …z k ] è LCS di X[1…i-1] e Y[1…j] b. se y j z k si ha che Z[z 1, z 2 …z k ] è LCS di X[1…i] e Y[1…j-1]

9 Definizione ricorsiva soluzione ottima Siano X[1…i] e Y[1…j] due sequenze e sia Z[z 1, z 2 …z k ] una LCS (sottosequenza più lunga) con lunghezza c[i,j], allora: 1 m 1jn i X: Y:

10 Algoritmo ricorsivo Siano X[1…i] e Y[1…j] due sequenze e sia Z[z 1, z 2 …z k ] una LCS (sottosequenza più lunga) con lunghezza c[i,j], allora: LCS(X,Y,i,j) 1. if i =0 and j= 0 2. return 0 3. if x i =y j 4.then return LCS(X,Y,i-1,j-1)+1 5.else return max(LCS(X,Y,i-1,j), LCS(X,Y,i,j-1)) Attenzione: Nel caso x i y j vengono generate due chiamate ricorsive (LCS(X,Y,i-1,j) e LCS(X,Y,i,j-1)) che possono generare sottoproblemi comuni.

11 Algoritmo ricorsivo Caso peggiore: x i y j sempre. Vengono generate due chiamate ricorsive (LCS(X,Y,i-1,j) e LCS(X,Y,i,j-1)) che possono generare sottoproblemi comuni. 3,4 2,4 3,3 1,42,3 1,32,2 2,3 1,32,2 3,2 UGUALI ! Altezza m+n m = 3 n = 4

12 Stategia bottom-up LCS(X,Y) 1. m length[X] 2. n length[Y] 3. for i 1 to m 4. do c[i,0] 0 5. for j 1 to n 6. do c[j,0] 0 7. for i 1 to m 8. do for j 1 to n 9. do if x i =y j 10. then c[i,j] c[i-1,j-1] b[I,j] diag 12.else if c[i-1,j] c[i, j-1] 13. then c[i,j] c[i-1,j] 14. b[I,j] up 15. else c[i,j] c[i,j-1] 16. b[I,j] left

13 Stategia bottom-up ABCBDAB B D C A B A Tempo = Θ(m n) Spazio = Θ(m n) = numero di sottosequenze per cui calcolare c[i,j] e b[i,j]

14 Costruzione di una soluzione ottima ABCBDAB B D C A B A b[i,j] serve per ricavare andando a ritroso la LCS trovata. Ogni diag corrisponde ad un elemento della LCS. LCS = BCBA

15 Costruzione di una soluzione ottima PRINT-LCS(b,X,Y,i,j) 1. if i = 0 or j = 0 2. then return 3. if b[i,j] = diag 4. then PRINT-LCS(b,X,Y,i-1,j-1) 5. print x i 6. elseif b[i,j] = up 7. then PRINT-LCS(b,X,Y,i-1,j) 8. else PRINT-LCS(b,X,Y,i,j-1) Il tempo di esecuzione corrisponde a O(m+n), poiché al peggio deve ogni volta decrementare solo uno dei due valori (i oppure j).


Scaricare ppt "Programmazione dinamica: problema della sottosequenza più lunga Esempio problema Algoritmo di ricerca esaustiva Caratterizzazione soluzione ottima Algoritmo."

Presentazioni simili


Annunci Google