Algoritmi e Strutture Dati (Mod. B)

Slides:



Advertisements
Presentazioni simili
Algoritmi e Strutture Dati
Advertisements

Problema dellordinamento Input: Sequenza di n numeri Output: Permutazione π = tale che: a 1 a 2 …… a n Subroutine in molti problemi E possibile effettuare.
Master Bioinformatica 2002: Grafi Problema: cammini minimi da tutti i vertici a tutti i vertici Dato un grafo pesato G =(V,E,w), trovare un cammino minimo.
Programmazione dinamica: problema della sottosequenza più lunga
                      Insertion-Sort
PROGRAMMARE IN PASCAL (le basi)
Algoritmi e Programmazione
Informatica Generale Marzia Buscemi
Hash Tables Indirizzamento diretto Tabelle Hash Risoluzioni di collisioni Indirizzamento aperto.
Programmazione dinamica
Alberi binari di ricerca
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Il problema del dizionario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Usa la tecnica del.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Esercizio 4 Data una stringa P di lunghezza m e definita sullalfabeto, scrivere un programma PERL per calcolare la seguente funzione: PREFIX_FUNCTION:
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. A)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati Introduzione. Gli argomenti di oggi Analisi della bontà degli algoritmi Modello Computazionale Tempo di esecuzione degli algoritmi.
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Trovare il percorso minimo da b ad ogni altro vertice
Algoritmi e strutture dati
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
APPUNTI SUL LINGUAGGIO C
Algoritmi e Strutture Dati
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Fogli elettronici - Spreadsheet
Lalgoritmo MergeSort Applica la strategia del divide et impera Divide: suddivide la sequenza di n elementi data in due sottosequenze di n/2 elementi Impera:
OPERAZIONI CON STRINGHE Le operazioni più interessanti da fare, per ora, con le stringhe sono: determinare la lunghezza della stringa, cioè quanti caratteri.
Metodo della moltiplicazione
Radix-Sort(A,d) // A[i] = cd...c2c1
Studieremo alcune tecniche per il progetto di algoritmi e di strutture dati: Programmazione dinamica Algoritmi golosi Analisi ammortizzata Vedremo poi.
Passo 3: calcolo del costo minimo
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
ND-partizione (A) n   A  somma  0 M  1/2 (  a i ) for i  1 to n do S[i]  choice ({true, false}) if S[i] then somma  somma + a i if somma > M then.
Teoria degli algoritmi e della computabilità Terza giornata: Ricerca e ordinamento ottimi. P vs NP, algoritmi di approssimazione, e il potere della randomizzazione.
PROVA INTERCORSO MOD.B a.a RICORSIONE ESERCIZI A1.1-A1.6.
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Operatori di incremento e decremento
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
Programmazione dinamica Algoritmi golosi Analisi ammortizzata
Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
Algoritmi e Strutture Dati Luciano Gualà
Transcript della presentazione:

Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte III)

Sottosequenza Una sequenza S’=(a1,…,am) è una sotto- sequenza della sequenza S se S’ è ottenuta da S rimuovendo uno o più elementi. Gli elementi rimanenti devono comparire nello stesso ordine nella sequenza risultante, anche se non devono essere necessariamente conti-gui in S. La sequenza nulla (di lunghezza 0) è una sottosequenza di ogni sequenza. Una sequenza è una lista di elementi ma…. … una sottosequenza non è necessariamente una sottolista (poiché deve essere contigua).

Sottosequenza più lunga comune Definizione: Date due sequenze S1=(a1,…,am) e S2=(b1,…,bn), una sottosequenza comune Z di S1 e S2 è una sequenza che è sottosequenza di entrambe le sequenze S1 e S2. Definizione: Date due sequenze S1=(a1,…,am) e S2=(b1,…,bn), la più lunga sottosequenza comune Z (LCS) di S1 e S2 è la sottosequenza comune di S1 e S2 che ha lungezza massima.

Sottosequenza più lunga comune Input 2 sequenze di simboli, S1 e S2 Output Trovare la più lunga sottosequenza comune (LCS) di S1 e S2 Esempio S1 = AAAATTGA S2 = TAACGATA LCS[S1,S2] = AAATA

Soluzione esaustiva Miglioramento possibile: LCS-Esaustivo(X[],Y[]: array di char) l = 0 LCS = Nil /* Enumera tutte le sottosequenza di X */ for each “sottosequenza K di X” do if “K è una sottosequenza di Y” then ls = lunghezza[K] if ls > l then l = ls LCS = K return LCS Miglioramento possibile: Se lunghezza[Y] < lunghezza[X] enumera solo le sotto-sequenze di lunghezza minore o uguale a lunghezza[Y].

Ogni sottosequenza può avere lunghezza k con 0  k  n. Soluzione esaustiva Ma data una sequenza di lunghezza n, quante sono le possibili sottosequenze? Ogni sottosequenza può avere lunghezza k con 0  k  n. Cioè il numero di sottosequenze è pari al numero di possibili sottoinsiemi di elementi distinti di un insieme degli n elementi nella sequenza originaria Soluzione impraticabile!

 Carattedizzazione della soluzione ottima Iniziamo col caratterrizzare la struttura della soluzione ottima. Data una sequenza X=(x1,…,xn), denoteremo con Xi, l’i-esimo prefisso di X, cioè la sotto- sequenza (x1,…,xi). X0 denota la sotto- sequenza nulla. Esempio: X = ABDCCAABD X3 = ABD X6 = ABDCCA

1) xm= yn 2) xm  yn e zk  xm 3) xm  yn e zk  ym ? Z[1,…,k] Y X[1,…,m] Y[1,…,n] X ? Z[1,…,k] 3) xm  yn e zk  ym Y X[1,…,m] Y[1,…,n] X ? Z[1,…,k] X[1,…,m] Y[1,…,n-1] X ? Z[1,…,k]

 Carattedizzazione della soluzione ottima Teorema: Date le due sequenze X=(x1,…,xm) e Y=(y1,…,yn), sia Z=(z1,…,zk) una LCS di X e Y. se xm= yn, allora zk = xn = yn e Zk-1 è una LCS di Xm-1 e Yn-1. se xm  yn e zk  xm, allora Z è una LCS di Xm-1 e Y. se xm yn e zk  yn, allora Z è una LCS di X e Yn-1.

 Carattedizzazione della soluzione ottima Teorema: Date le due sequenze X=(x1,…,xm) e Y=(y1,…,yn), sia Z=(z1,…,zk) una LCS di X e Y. se xm= yn, allora zk = xm = yn e Zk-1 è una LCS di Xm-1 e Yn-1. se xm  yn e zk  xm, allora Z è una LCS di Xm-1 e Y. se xm yn e zk  yn, allora Z è una LCS di X e Yn-1. Dimostrazione: Suponiamo xm= yn ma zk  xm. Poiché Z è una sottosequenza comune di X e Y di lunghezza k, Ma allora concatenando xm a Z otterremmo una sotto-sequenza comune di X e Y di lunghezza k+1. Questo però contraddice l’assunzione che Z sia una LCS di X e Y. Quindi deve essere zk = xm = yn

 Carattedizzazione della soluzione ottima Teorema: Date le due sequenze X=(x1,…,xm) e Y=(y1,…,yn), sia Z=(z1,…,zk) una LCS di X e Y. se xm= yn, allora zk = xm = yn e Zk-1 è una LCS di Xm-1 e Yn-1. se xm  yn e zk  xm, allora Z è una LCS di Xm-1 e Y. se xm yn e zk  yn, allora Z è una LCS di X e Yn-1. Dimostrazione: Quindi deve essere zk = xm = yn Ma allora eliminando dalle 3 sequenze l’ultimo carattere, otteniamo che Zk-1 deve essere una sottosequenza comune di Xm-1 e Yn-1 di lunghezza k-1 Ma Zk-1 è anche una LCS di Xm-1 e Yn-1? (Per assurdo) Supponiamo che esista una sottosequenza comune W di Xm-1 e Yn-1 di lunghezza maggiore di k-1. Allora concatenando zk a W otterremmo ancora una sotto-sequenza comune più lunga di Z, contraddicendo l’ipotesi.

 Carattedizzazione della soluzione ottima Teorema: Date le due sequenze X=(x1,…,xm) e Y=(y1,…,yn), sia Z=(z1,…,zk) una LCS di X e Y. se xm= yn, allora zk = xm = yn e Zk-1 è una LCS di Xm-1 e Yn-1. se xm  yn e zk  xm, allora Z è una LCS di Xm-1 e Y. se xm yn e zk  yn, allora Z è una LCS di X e Yn-1. Dimostrazione: Se xm  yn e zk  xm, allora Z è una LCS di Xm-1 e Yn Infatti, se esistesse una sottosequenza comune W di Xm-1 e Y di lunghezza maggiore di k, allora (essendo xm  yn e zk  xm) W sarebbe pure una sottosequenza comune di Xm e Y. Ma questo contraddice l’ipotesi che Z sia una LCS di X e Y. Se xm  yn e zk  ym, allora Z è una LCS di X e Yn-1 La dimostrazione è simmetrica a quella del punto 2

 Definizione ricorsiva della soluzione ottima c(i,j) = lunghezza della LCS di Xi e Yj. Vogliamo trovare c(m,n) dove m e n sono le lunghezze di X e Y, rispettivamente. c(i,j) = 0 se i=0 o j=0 c(i,j) = ? se i,j  0

1) xm= yn 2) xm  yn e zk  xm 3) xm  yn e zk  ym X[1,…,i] Y[1,…,j] X[1,…,i-1] Y[1,…,j-1] Z[1,…,k] Z[1,…,k-1] 1) xm= yn c(i,j) = c(i-1,j-1) + 1 se i,j > 0 e xi = yj Y X[1,…,i] Y[1,…,j] X[1,…,i-1] X ? Z[1,…,k] 2) xm  yn e zk  xm Y X[1,…,i] Y[1,…,j] Y[1,…,j-1] X ? Z[1,…,k] 3) xm  yn e zk  ym c(i,j) = max { c(i-1,j), c(i,j-1) } se i,j > 0 e xi  yj

 Definizione ricorsiva della soluzione ottima c(i,j) = lunghezza della LCS di Xi e Yj. Vogliamo trovare c(m,n) dove m e n sono le lunghezze di X e Y, rispettivamente.

 Definizione ricorsiva della soluzione ottima RLCS-length(X[]Y[]:array of char;i,j:intero) if i = 0 or j = 0 then return 0 else if X[i]  Y[j] then return max(RLCS-length(X,Y,i,j-1), RLCS-length(X,Y,i -1,j)) return 1 + RLCS-length(b,X,i-1,j-1)

 Definizione ricorsiva della soluzione ottima i,j i,j-1 i-1,j i,j-2 i-1,j-1 i-1,j-1 i-2,j i,j-3 i-1,j-2 i-1,j-2 i-2,j-1 i-2,j-1 i-3,j i-1,j-2 i-2,j-2 i-1,j-3 i-2,j-2 i-1,j-3 i-2,j-2 i-2,j-2 i-3,j-1

 Calcolo del valore della soluzione ottima Utilizziamo due tabelle di dimensione mn c[i,j] conterrà il valore della lunghezza della massima sottosequenza comune dei prefissi Xi e Yj. c[m,n] conterrà quindi lunghezza della massima sottosequenza comune di X e Y. b[i,j] conterrà un “puntatore” alla entry della tabella stessa che identifica il sottoproblema ottimo scelto durante il calcolo del valore c[i,j]. i valori possibili saranno ,  e 

 Calcolo del valore della soluzione ottima Utilizziamo due tabelle di dimensione mn b[i,j] conterrà un “puntatore” alla entry della tabella stessa che identifica il sottoproblema ottimo scelto durante il calcolo del valore c[i,j]. i valori possibili saranno ,  e   punta alla cella con indici i-1,j-1  punta alla cella con indici i-1,j  punta alla cella con indici i,j-1

TACCBT ATBCBD c(i,j) = 0 se i=0 o j=0 T 6 B 5 C 4 3 A 2 1 D j i TACCBT ATBCBD  punta a i-1,j-1  punta a i-1,j  punta a i,j-1 1 1 2 1 2 1 3 2 1 3 2 1 c(i,j) = 0 se i=0 o j=0 c(i,j) = c(i-1,j-1) + 1 se i,j > 0 e xi = yj c(i,j) = max{ c(i-1,j), c(i,j-1) } se i,j > 0 e xi  yj

ABDDBE BEBEDE c(i,j) = 0 se i=0 o j=0 E 6 B 5 D 4 3 2 A 1 j i  punta a i-1,j-1  punta a i-1,j  punta a i,j-1 1 2 1 2 1 2 1 3 2 1 c(i,j) = 0 se i=0 o j=0 c(i,j) = c(i-1,j-1) + 1 se i,j > 0 e xi = yj c(i,j) = max{ c(i-1,j), c(i,j-1) } se i,j > 0 e xi  yj

 Calcolo del valore della soluzione ottima LCS-Length(X[],Y[]: array of char) m = lunghezza[X] n = lunghezza[Y] for i = 1 to m do c[i,0] = 0 for j = 1 to n do c[0,j] = 0 do for j = 1 to n do if xi = yj then c[i,j]=1+c[i-1,j-1] b[i,j] = “” else if c[i-1,j]  c[i,j-1] then c[i,j] = c[i-1,j] b[i,j] = “” else c[i,j] = c[i,j-1] b[i,j] = “” return b e c Inizalizzazione prima riga e prima colonna della marice I carattri finali di Xj e Yj sono identici! I caratteri finali diversi LCS di Xj-1 e Yj è non peggiore LCS di Xj e Yj -1 è migliore

 Calcolo del valore della soluzione ottima LCS-Length(X[],Y[]: array of char) m = lunghezza[X] n = lunghezza[Y] for i = 1 to m do c[i,0] = 0 for j = 1 to n do c[0,j] = 0 do for j = 1 to n do if xi = yj then c[i,j]=1+c[i-1,j-1] b[i,j] = “” else if c[i-1,j]  c[i,j-1] then c[i,j] = c[i-1,j] b[i,j] = “” else c[i,j] = c[i,j-1] b[i,j] = “” return b e c (m+n) (n) (nm)

 Costruzione della soluzione ottima Per costruire la LCS possiamo quindi utilizzare la tabella b[i,j] che contiene i “puntatori” ai sottoproblemi ottimi per ogni coppia di indici i e j. Partiamo dalla entry b[m,n] e procediamo a ritroso seguendo le “frecce” della tabella. Ricordate che LCS-Length assegna b[i,j] =  solo quando xi = yj . Quindi, partendo dalla fine della tabella, ogni volta che in b[i,j] troviamo  sappiamo che xi (=yj) è contenuto nella LCS che cerchiamo. I valori vengono stampati nell’ordine corretto.

 Costruzione della soluzione ottima Print-LCS(b[]: array;X[]: array;i,j: intero) if i = 0 or j = 0 then return if b[i,j] = ”” then Print-LCS(b,X,i-1,j-1) print xi else if b[i,j] = ”” then Print-LCS(b,X,i-1,j) else Print-LCS(b,X,i,j-1)

TACCBT ATBCBD c(i,j) = 0 se i=0 o j=0 T 6 B 5 C 4 3 A 2 1 D j i TACCBT ATBCBD 1 1 2 1 2 1 3 2 1 3 2 1 c(i,j) = 0 se i=0 o j=0 c(i,j) = c(i-1,j-1) + 1 se i,j > 0 e xi = yj c(i,j) = max{ c(i-1,j), c(i,j-1) } se i,j > 0 e xi  yj

TACCBT ATBCBD TCB c(i,j) = 0 se i=0 o j=0 1 2 3 4 5 6 TACCBT ATBCBD TCB T C B A T B C B D 1 T 1 1 1 1 1 2 A 1 1 1 1 1 1 3 C 1 1 1 2 2 2 4 C 1 1 1 2 2 2 5 B 1 1 2 2 3 3 6 T 1 2 2 2 3 3 c(i,j) = 0 se i=0 o j=0 c(i,j) = c(i-1,j-1) + 1 se i,j > 0 e xi = yj c(i,j) = max{ c(i-1,j), c(i,j-1) } se i,j > 0 e xi  yj

ABDDBE BEBEDE c(i,j) = 0 se i=0 o j=0 E 6 B 5 D 4 3 2 A 1 j i 1 2 1 2 1 2 1 3 2 1 c(i,j) = 0 se i=0 o j=0 c(i,j) = c(i-1,j-1) + 1 se i,j > 0 e xi = yj c(i,j) = max{ c(i-1,j), c(i,j-1) } se i,j > 0 e xi  yj

ABDDBE BEBEDE BDE c(i,j) = 0 se i=0 o j=0 1 2 3 4 5 6 BDE B D E B E B E D E 1 A 2 B 1 1 1 1 1 1 3 D 1 1 1 1 2 2 4 D 1 1 1 1 2 2 5 B 1 1 2 2 2 2 6 E 1 2 2 3 3 3 c(i,j) = 0 se i=0 o j=0 c(i,j) = c(i-1,j-1) + 1 se i,j > 0 e xi = yj c(i,j) = max{ c(i-1,j), c(i,j-1) } se i,j > 0 e xi  yj

 Costruzione della soluzione ottima Print-LCS(b[]: array;X[]: array;i,j: intero) if i = 0 or j = 0 then return if b[i,j] = ”” then Print-LCS(b,X,i-1,j-1) print xi else if b[i,j] = ”” then Print-LCS(b,X,i-1,j) else Print-LCS(b,X,i,j-1) Poiché ad ogni passo della ricorsione almeno uno tra i e j viene decrementato, il tempo di esecuzione è pari alla somma delle lunghezze delle due sequenze: (m+n)

Ottimizzazioni possibili La tabella b[i,j] può essere eliminata, risparmia-ndo un . Il valore di c[i,j] dipende solo dai valori c[i-1,j-1], c[i,j-1] e c[i-1,j]. In tempo costante si può quindi determinare quale di questi tre è stato usato, e perchò quale sia il tipo di freccia. (Esercizio 16.3-2) Se ci serve solo calcolare la lunghezza della LCS, possiamo ancora ridurre lo spazio della tabella c[i,j] a due sole righe di lunghezza min{ n , m } Ad ogni istante (cioè per ogni coppia i,j), ci servono i valori c[i-1,j-1], c[i,j-1] e c[i-1,j], che stanno nella riga corrente e in quella precedente. (Esercizio 16.3-4)

Esercizi Esercizi: 16.3-2 16.3-3 16.3-4 Problemi: 16.2 16.3 16.4