Algoritmalar II Ders 4 Dinamik Programlama Yöntemi
Introduction to Algorithms MIT Press (Chapter 15) Dynamic Programming Introduction to Algorithms MIT Press (Chapter 15)
Örnek3: En uzun ortak altdizi İki karakter dizisi veriliyor X = x1, x2, …, xm Y = y1, y2, …, yn X ve Y dizilerinin en uzun ortak altdizisini (LCS) bulmak gerekir Örnek.: X = A, B, C, B, D, A, B X dizisinin alt dizileri: Elemanlarının sırası bozulmadan alınmasıdır A, B, D, B, C, D, B, ...
Örnek X = A, B, C, B, D, A, B X = A, B, C, B, D, A, B Y = B, D, C, A, B, A Y = B, D, C, A,B, A B, C, B, A ve B, D, A, B X ve Y dizilerinin en uzun ortak altdizileridir(uzunluk = 4) B, C, A, ortak altdizidir ama X ve Y için en uzun ortak altdizi değil
Brute-Force Çözüm X dizisinin tüm altdizileri için, bu altdizinin Y dizisinin de altdizisi olup olmadığını kontrol et X dizisinin 2m tane altdizisini kontrol etmek gerekir Her altdizi için (n) zaman geçer Önce Y nin ilk harfi, sonra 2. ve s. kontrol edilir İşlem zamanı: (n2m)
Seçim X = A, B, D, E Y = Z, B, E Seçim: durum yukarıdaki gibi ise (E) yi ortak diziye al ve dizilerden sil ve kalan altproblemi çöz X = A, B, D, G Y = Z, B, D Seçim: önce X den son elemanı çıkar kalan altproblemi çöz, sonra da Y için aynı işlemi yap
Notasyonlar X = x1, x2, …, xm dizisi için i. önsöz tanımlayalım i = 0, 1, 2, …, m için Xi = x1, x2, …, xi c[i, j] = Xi = x1, x2, …, xi ve Yj = y1, y2, …, yj dizileirnin en uzun ortak altdizisinin uzunluğu
Özyinelemeli çözüm c[i, j] = c[i - 1, j - 1] + 1 Durum 1: xi = yj Örnek.: Xi = A, B, D, E Yj = Z, B, E xi = yj ise Xi-1 ve Yj-1 için problemi çöz Bunu yapabilmemizin nedeni: optimal çözüm, altproblemlerin de optimal çözümünü içermektedir c[i, j] = c[i - 1, j - 1] + 1
Özyinelemeli çözüm c[i, j] = max { c[i - 1, j], c[i, j-1] } Case 2: xi yj Örnek: Xi = A, B, D, G Yj = Z, B, D 2 problem çözmeliyiz Xi-1 ve Yj için: Xi-1 = A, B, D ve Yj = Z, B, D Xi ve Yj-1 için: Xi = A, B, D, G and Yj = Z, B Bunu yapabilmemizin nedeni: optimal çözüm, altproblemlerin de optimal çözümünü içermektedir c[i, j] = max { c[i - 1, j], c[i, j-1] }
3. LCS uzunluğu hesaplama 0 if i = 0 or j = 0 c[i, j] = c[i-1, j-1] + 1 if xi = yj max(c[i, j-1], c[i-1, j]) if xi yj 1 2 n yj: y1 y2 yn xi 1 x1 first 2 x2 second i m xm j
Ek bilgi b[i, j] matrisi: [i, j] altproblemi için optimal değeri elde etmekiçin hangi seçimin yapıldığını gösterir If xi = yj b[i, j] = “ ” Else, if c[i - 1, j] ≥ c[i, j-1] b[i, j] = “ ” else b[i, j] = “ ” 0 if i,j = 0 c[i, j] = c[i-1, j-1] + 1 if xi = yj max(c[i, j-1], c[i-1, j]) if xi yj 1 2 3 n b & c: yj: A C D F xi 1 A 2 B c[i,j-1] c[i-1,j] i 3 C m D j
LCS-LENGTH(X, Y, m, n) Running time: (mn) for i ← 1 to m do c[i, 0] ← 0 for j ← 0 to n do c[0, j] ← 0 do for j ← 1 to n do if xi = yj then c[i, j] ← c[i - 1, j - 1] + 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 c and b The length of the LCS if one of the sequences is empty is zero Case 1: xi = yj Case 2: xi yj Running time: (mn)
Örnek X = A, B, C, B, D, A, B Y = B, D, C, A, B, A If xi = yj 0 if i = 0 or j = 0 c[i, j] = c[i-1, j-1] + 1 if xi = yj max(c[i, j-1], c[i-1, j]) if xi yj X = A, B, C, B, D, A, B Y = B, D, C, A, B, A 1 2 3 4 5 6 If xi = yj b[i, j] = “ ” Else if c[i - 1, j] ≥ c[i, j-1] b[i, j] = “ ” else b[i, j] = “ ” yj B D C A B A xi 1 A 1 1 1 2 B 1 1 2 1 1 2 3 C 1 2 2 4 B 1 2 3 3 5 D 1 2 3 6 A 1 2 3 4 7 B 1 2 3 4
4.LCS oluşturma b[m, n] den başla ve okları takip et b[i, j] matrisinde durumu ise xi = yj 1 2 3 4 5 6 yj B D C A B A xi 1 A 1 1 1 2 B 1 1 2 1 1 2 3 C 1 2 2 4 B 1 2 3 3 5 D 1 2 3 6 A 1 2 3 4 7 B 1 2 3 4
PRINT-LCS(b, X, i, j) if i = 0 or j = 0 Running time: (m + n) then return if b[i, j] = “ ” then PRINT-LCS(b, X, i - 1, j - 1) print xi elseif b[i, j] = “↑” then PRINT-LCS(b, X, i - 1, j) else PRINT-LCS(b, X, i, j - 1) Initial call: PRINT-LCS(b, X, length[X], length[Y]) Running time: (m + n)