Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Algoritmalar II Ders 4 Dinamik Programlama Yöntemi.

Benzer bir sunumlar


... konulu sunumlar: "Algoritmalar II Ders 4 Dinamik Programlama Yöntemi."— Sunum transkripti:

1 Algoritmalar II Ders 4 Dinamik Programlama Yöntemi

2 Introduction to Algorithms MIT Press (Chapter 15)
Dynamic Programming Introduction to Algorithms MIT Press (Chapter 15)

3 Ö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, ...

4 Ö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

5 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)

6 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

7 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

8 Ö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

9 Ö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] }

10 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

11 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

12 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)

13 Örnek X = A, B, C, B, D, A, B Y = B, D, C, A, B, A If xi = yj
if i = 0 or j = 0 c[i, j] = c[i-1, j-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

14 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

15 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)


"Algoritmalar II Ders 4 Dinamik Programlama Yöntemi." indir ppt

Benzer bir sunumlar


Google Reklamları