190 likes | 538 Views
Curs 8. Paradigma Programare dinamica Studii de caz distanta intre siruri subsecventa crescatoare de lungime maxima Prezentarea formala a paradigmei. Distanta intre siruri – problema. instanta doua siruri a si b de lungime n asupra lui a se pot face operatiile:
E N D
Curs 8 • Paradigma Programare dinamica • Studii de caz • distanta intre siruri • subsecventa crescatoare de lungime maxima • Prezentarea formala a paradigmei
Distanta intre siruri – problema • instanta • doua siruri a si b de lungime n • asupra lui a se pot face operatiile: • modificare: M(i, c) daca ai c • stergere: S(i) • inserare: I(i, c) • iesire • o secventa de operatii de lungime minima care transforma sirul a in b • exemplu • a = “armata”, b = “camara” • “armata” “amata” “camata” “camara” • d[“armata”, “camara”] = 3
Distanta intre siruri – propretati • ordinea operatiilor intr-o secventa optima nu are importanta • “armata” “amata” “camata” “camara” • “armata” “amata” “amara” “camara” • “armata” “carmata” “camata” “camara” • “armata” “carmata” “carmara” “camara” • “armata” “armara” “amara” “camara” • “armata” “armara” “carmara” “camara”
Distanta intre siruri – proprietati (cont.) • exista o secventa optima in care sirurile intermediare au lungimea n • d[a,b] este o metrica: • d[a, a] = 0 • d[a, b] = d[b, a] • d[a, c] d[a, b] + d[b, c]
Distanta intre siruri – model • stare: DES[i,j] = determinarea distantei minime intre subsirurile de lungime i si respectiv j • valoarea asociata unei stari: [i,j] • functia asociata unei stari: d[i, j] = d[a[1..i], b[1..j]] • decizie: • presupunem ca b[j] se obtine prin stergere: DES[i,j] DES[i-1, j] • presupunem ca b[j] se obtine prin modificare: DES[i,j] DES[i-1, j-1] • presupunem ca a[i] se obtine prin inserare: DES[i,j] DES[i, j-1]
Distanta intre siruri – model (cont.) • relatia de recurenta d[0, j] = j, d[i, 0] = i (i, j) d[i, j] = min{d[i-1, j] + 1, d[i-1, j-1] + [i, j], d[i, j-1] + 1} [i, j] = if (a[i] = b[j]) then 0 else 1 • timp: • calculului matricii d: O(n2) • determinarea secventei de operatii: O(n) • spatiu: O(n2)
Distanta intre siruri - exemplu c a m a r a 2 3 4 5 6 a 1 1 2 3 4 5 r 2 2 2 3 3 4 m 3 3 3 3 4 4 a 4 4 3 3 3 4 t 5 5 4 4 3 4 a 6 6 5 5 4 4 0 1 1 2 2 2 3 3 ( M(5,’r’), S(2), ) I(1,’c’)
Distanta intre siruri - variatii • alte operatii: • transpozitia: schimba ordinea a doua caractere adiacente • distanta Levenshtein (de editare) • sunt admise numai inserari, stergeri si inlocuiri • toate operatiile au costul 1 • distanta Hamming • sunt admise numai inlocuirile • costul operatiei este 1 • este finita ori de cate ori |a| = |b| • distanta “episodica” (episode distance) • sunt admise numai inserari • costul operatiei este 1 • distanta este sau |b|-|a| sau
Distanta intre siruri - variatii • distanta data de cea mai lunga subsecventa • sunt admise numai inserari si stergeri • toate operatiile au costul 1 a = “amxbtycsnma” si b = “bancxstymcxn” “amxbtycsnma” “bamxbtycsnma” “baxbtycsnma” “banxbtycsnma” “bancxbtycsnma” “bancxtycsnma” “bancxstycsnma” “bancxstymcsnma” “bancxstymcnma” “bancxstymcxnma” “bancxstymcxna” “bancxstymcxn” = b • (a,x,t,y,c,n) este subsecventa comuna • este cea mai lunga?
Distanta intre siruri - aplicatii • “matching” aproximativ peste siruri (aproximate string matching) • problema: dat un text s de lungime n, un patern p de lungime m, o distanta d() intre siruri si un numar k, sa se determine pozitiile j din textul s astfel incat sa existe i cu d(p, s[i..j]) k • distanta Levenshtein: “string matching with k differences” • distanta Hamming: “string matching with k missmatches” • distanta episodica: “episode matching” (modeleaza cazul cand se cauta o secventa de evenimente intr-o perioada scurta de timp) • cea mai lunga subsecventa comuna: exact ce spune numele • procesul de cautare: • a = p, b = s • trebuie sa modificam alg. a.i. orice pozitie j din text este startul potential al unei potriviri; asta se realizeaza prin setarea d[0,j] = 0
Distanta intre siruri - aplicatii • calculul matricei se face pe coloane • initial: d[i, 0] = i pentru i = 0, …, m • se proceseaza textul caracter cu caracter • presupunem ca la pasul curent se proceseaza sj • coloanaj este actualizata: d[i, j] = if (pi = sj) then d[i-1, j-1] else 1 + min(d[i-1, j], d[i, j-1], d[i-1, j-1]) • pozitiile j pentru care d[m,j] k sunt raportate • de remarcat ca numai ultimele doua coloane sunt necesare
Subsecventa crescatoare maximala – problema • instanta • o secventa de numere intregi a = (a1, a2, …, an) • stergand cateva elemente din a se obtine o subsecventa • o subsecventa pastreaza ordinea relativa a elementelor • exemplu: • a = (9, 3, 15, 12, 7, 4, 13, 6, 8) • subsecventa: (3, 12, 7, 6) • subsecventa crescatoare: ( 3, 7, 13) • iesire: subsecventa crescatoare de lungime maxima • exemplu: exista o subsecventa crescatoare de lungime > 3? • cum se poate rezolva utilizand distanta de editare?
Subsecventa crescatoare maximala – model • a = (9, 3, 15, 12, 7, 4, 13, 6, 8) 1 2 3 4 5 6 7 8 9 • construim un graf G: • varfuri: 0, 1, 2, …, 9 • arce: { (0,i) | i > 0 } { (i,j) | a[i] <= a[j] } 0 1 2 3 4 5 6 7 8 9
Subsecventa crescatoare maximala – model • subsecventa crescatoare = drum in G • subsecventa crescatoare maximala = drum de lungime maxima in G • asociem o matrice de costuri: • c[i, j] = 1 daca i < j si (a[i] <= a[j] sau i = 0) • c[i,j] = - altfel • stare: SCM(i) = subproblema determinarii celui mai lung drum ce se termina in i • L[i] = valoarea optima pentru SCM(i) • PO implica L[i] = L[j] + c[j,i], j predecesorul lui i pe drumul optim • relatia de recurenta: • L[0] = 0 • L[i] = max { L[j] + c[j,i] | j < i }
Subsecventa crescatoare maximala – model • a = (9, 3, 15, 12, 7, 4, 13, 6, 8) 0 1 2 3 4 5 6 7 8 9 L = (0, 1, 1, 2, 2, 2, 2, 3, 3, 4) • extragerea solutiei: • s[4] = 9 • s[3] = 8 • s[2] = 6 • s[1] = 2 • s[0] = 0 • timp de executie: O(n2) • spatiu suplimentar: O(n)
Programare dinamica – prezentare formala • Modelul matematic • probleme de optim • functia obiectiv: optim R(x1, ..., xn) • restrictii: g(x1, ..., xn) ? 0 • decizie: d: s s’ • unei stari s asociem o valoare z si o functie f(z) a.i. daca s corespunde starii initiale atunci f(z) = optim R(x1, ..., xn) • politica: d1: s0 s1, d2: s1 s2, . . . , dn: sn-1 sn,
Programare dinamica – prezentare formala (cont.) • PO conduce la o relatie de recurenta: • daca • d: s s’ (sau d: s’ s) • z val. asociata lui s, T(z,y) val. asociata lui s’, • H algoritmul care calculeaza f(z) conform lui d, atunci, aplicind PO, obtinem f(z) = optimy H(z, y, f(T(z,y)))