31  Quiz 3 Gözden Geçirme

Dönemin son quiz tekrarı — SRTBOT derin tekrar ve üç gerçek sınav problemi (Lotto, DNA, Tapas)

NotOturum bilgisi

Bu normal bir ders değil — Quiz 3 öncesi toplu tekrar oturumudur. Quiz 3 = DP bloğu; Quiz 1-2 konuları (veri yapıları, çizge) kümülatif “fair game”dir ama doğrudan test edilmez.

31.1 Bu Quiz Review Ne Hakkında?

Bu, Jason Ku ile dönemin son quiz tekrarıdır: Quiz 3, tamamen dinamik programlama (DP) üzerine. Ku önce SRTBOT recursive framework’ünü adım adım tekrar eder, sonra Spring ’18’den üç gerçek sınav/ödev problemini (Lotto, DNA babalık testi, Tapas) baştan sona çözer. Dördüncü problem (Gokemon Po) zaman yetmediği için bırakıldı.

“This is our last quiz review for the term, quiz 3… It’s on dynamic programming… problem sets 7 and 8, and lectures 15 through 18.” — Ku, 0:19

UyarıKapsam — kitap-numara remap

Ku, kapsamı orijinal MIT numaralandırmasıyla anar: “lectures 15 through 18 + problem sets 7 and 8”. Bu kitaptaki karşılığı:

  • Ders 23-27 (L15-L18; araya Ders 25 = PS8 girer) — DP temelleri (SRTBOT, LCS/LIS, Floyd-Warshall, pseudopolinom/subset sum).
  • DP problem oturumları Ders 25 (PS8) ve Ders 29 (PS9) — Ku’nun andığı “PS 7-8”, orijinal MIT numaralandırmasıdır.

Alıntılar birebir korunur (Ku “PS7-8” der); kapsam ifadeleri kitap-numaraya remap edilir.

Bu sayfa beş eksende ilerler: (1) SRTBOT çerçevesinin derin tekrarı, (2) üç gerçek problem tam çözümle (toggle), (3) quiz hazırlığı egzersizleri, (4) sınav stratejisi, (5) toplu cheat sheet.

flowchart TD
    A["Ders 30: Quiz 3 Review"] --> B["SRTBOT çerçevesi<br/>S·R·T·B·O·T derin tekrar"]
    A --> C["Durum genişletme (Lotto)"]
    C --> C1["suffix DP · geçmişi gelecek<br/>kısıtı olarak hatırla · O(n)"]
    A --> D["Çoklu-dizi Boolean DP (DNA)"]
    D --> D1["üç dizi · bağımlı indeks elenir<br/>∨ 4 seçim · O(n⁴)"]
    A --> E["Pseudopolinom knapsack (Tapas)"]
    E --> E1["0/1 knapsack + tatlı sayacı<br/>−∞ taban · O(nks)"]
    A --> F["Sınav stratejisi"]
    F --> F1["söz + matematik · çarp ≠ topla<br/>polinom teşhisi · taban dengesi"]

    classDef root fill:#fef3c7,stroke:#b45309,stroke-width:3px,color:#1f2937
    classDef branch fill:#f3f4f6,stroke:#374151,stroke-width:2px,color:#1f2937
    classDef leaf fill:#ffffff,stroke:#9ca3af,stroke-width:1px,color:#1f2937
    class A root
    class B,C,D,E,F branch
    class C1,D1,E1,F1 leaf
Şekil 31.1: Ders 30’un (Quiz 3 Review) kavram haritası: kök = Quiz 3 Review. Beş dal — (1) SRTBOT çerçevesi: Subproblem, Relation, Topological order, Base case, Original problem, Time; her özyinelemeli algoritmanın iskeleti, DP alt problemler örtüştüğünde memoize ile DAG’a çöker. (2) durum genişletme (Lotto): suffix DP, geçmişi gelecek kısıtı olarak hatırla, offset state, lineer zaman. (3) çoklu-dizi Boolean DP (DNA): üç dizi, bağımlı indeks elenir, dört seçimli OR, kuartik zaman. (4) pseudopolinom knapsack (Tapas): sıfır-bir knapsack artı tam-s tatlı sayacı, eksi sonsuz taban dengesi, k çıplak sayı olduğu için pseudopolinom. (5) sınav stratejisi: söz artı matematik, çarp toplama, polinom teşhisi, taban dengesi, parent pointer. Sonuç: Quiz 3 = SRTBOT disiplini sınavı.
İpucuBuilder Notu — Bu = DP Midterm

Quiz 3, kursun dinamik programlama sınavıdır: alt problem tanımı, ilişki (recurrence), topolojik sıra, taban durum, çözüm kurma ve süre analizi. Veri yapıları Quiz 1’de, çizge algoritmaları Quiz 2’de kaldı; burada tek konu DP’dir.

  • Bu = üçüncü ve son sınav. OMSCS CS 6515 (Graduate Algorithms) ekseninde DP, dersin en ağır blokudur — lisansüstü algoritma sınavlarının yarısı DP üzerinedir. Burada kurulan SRTBOT disiplini (önce alt problemi sözle tam tanımla, sonra recurrence’ı matematikle yaz) doğrudan oraya taşınır.
  • Durum genişletme refleksi. Naif suffix DP kısıtı uygulayamadığında reflekste state ekle (Lotto: offset; Tapas: tatlı sayacı) — bu, “alt probleme bir soru sor” disiplininin en sık sınav uygulamasıdır.
  • Pseudopolinom teşhisi. Runtime’da \(k\) veya \(W\) gibi çıplak sayı görünce “polinom mu?” sorusuna pseudopolinom demek; çözmeden, yalnız runtime’a bakarak yapılan bir teşhistir (subset sum / knapsack imzası).

Tek cümle: Quiz 3, “bu problemi DP ile çöz” demez; “alt problemi sözle tam tanımla (tanımsız parametre = puan yok), recurrence’ı matematikle yaz, topolojik sırayı kanıtla, taban durumları (true + false dengesi) kur, runtime’ı girdi boyutuyla sınıflandır” der.

31.2 SRTBOT Çerçevesi — Derin Tekrar

DP, özyinelemeli (recursive) çerçevenin özel hâlidir: alt problemler birden çok kez kullanılınca, çakışan alt problemleri bir kez hesaplayıp memoize ederiz. Özyineleme ağacı, aynı-değerli düğümler birleşince bir DAG’a çöker; DP tam da alt problemlerin örtüştüğü durumdur.

S — Subproblems (Alt problemler). \(x\) değişkeniyle alt problemleri tanımla: memonun ne döndürdüğü ve ne kadar büyük olduğu. Kritik kural: tanımında görünmeyen parametre kullanırsan yanlış yaparsın.

“if you have parameters in your subproblem that don’t appear in your subproblem definition, you’re doing it wrong.” — Ku (Subproblems)

Sıra (sequence) problemlerinde yaygın seçim: prefix / suffix (tek uçtan karar) veya bitişik alt-dizi (iki uçtan/ortadan karar). Bu sınıfta suffix kullanıyoruz (soldan-sağa okumak kolay); prefix ile birebir aynı — “aynı madalyonun iki yüzü”. Çoklu girdide indeksleri çarpar (her diziden bir prefix/suffix) ve ek durum tutarız (max mı min mi? sıra kimde? çantada ne kadar yer kaldı?).

R — Relate (Bağıntı). Alt problemleri matematiksel ifadeyle ilişkilendir (kesinlik için söz değil, formül). Genelde \(x(\dots) = \max / \min / \sum / \vee / \wedge\) (bir dizi seçim). Strateji: alt problem hakkında bir soru sor (“ilk karakterle ne yapayım?”); cevabı bilseydim daha küçük alt probleme inerdim → polinom sayıda alt problem olduğu için o sorunun tüm cevaplarını lokal kaba kuvvetle dene.

“it’s really important that you write this in math, because it needs to be precise.” — Ku (Recursion)

T — Topological order (Topolojik sıra). “Daha küçük”ün ne demek olduğunu tanımla: bir indeks/parametre hep artar veya azalır (bazen indekslerin toplamı). Bağıntı acyclic ise alt problem grafı DAG’dır → bottom-up hesaplanır, sonsuz döngü olmaz.

B — Base cases (Taban durumlar). Özyinelemenin memo sınırının dışına taştığı her yer için sabit-zamanlı cevap. Taban durum yoksa algoritma sonlu zamanlı bile değildir.

“if you write code without a base case, it’s going to be wrong.” — Ku (Base Cases)

O — Original problem (Özgün problem). Özgün cevabı alt problem(ler)den üret — çoğu zaman tek bir alt problem, bazen hepsinin max’ı (LIS, max subarray). Tam çözüm dizisini geri getirmek için parent pointer sakla (en kısa yoldaki gibi geri yürü).

T — Time (Süre). Genelde alt problem başına işin toplamı; iş her alt problemde aynı sınırlıysa çarp. Alt problem sayısı = her parametrenin değer sayısının çarpımı (toplamı DEĞİL — her biri bağımsız seçilir). İş/alt problem = bağıntıda üzerinde optimize edilen seçim sayısı (branching).

“I multiply those numbers together. A lot of people will maybe say, oh, I add them together. No.” — Ku (Running Time)

31.3 Quiz-tarzı Problemler (Spring ’18, Tam Çözüm)

Aşağıda üç gerçek Spring ’18 problemi var; her birinin çözümünü açmadan önce kendin dene. Üçü, SRTBOT’un üç farklı tekniğini sergiler: durum genişletme (Lotto), çoklu-dizi Boolean DP (DNA), 0/1 knapsack + sayaç (Tapas). Tüm sayılar QR3 motoruyla doğrulanmıştır.

Şekil 31.2 Problem 1’in imza fikrini gösterir: suffix DP’de naif kısıt uygulanamayınca durum genişletme ile “geçmişi gelecek kısıtı olarak hatırla” — sonraki izinli oyun offset’i \(j\) state’e eklenir, \(k\) döngüsü sabit kalır ve algoritma lineer olur.

Şekil 31.2: Lotto — durum genişletme, suffix DP, O(n) lineer (QR3 Problem 1, İMZA figür, Spring-18). 12-gün kazanç şeridi L = [4,9,2,7,3,8,1,6,9,2,5,7]; ardışık HERHANGİ 7 günde en fazla 2 oyun (eşdeğer kısıt: ardışık üç oyun i<j<m için m − i ≥ 7). ÜST panel: optimal oyun günleri amber halka + ✓ (motordan brute-bitmask: günler 1,3,8,11 — kazançlar 9,7,9,7); örnek 7-gün penceresi amber bant, pencerede ≤ 2 oyun. ALT panel: durum x(i, j) = ‘i’de oynadım; sonraki ≥ i+j’ (j ∈ 1..6); geçiş x(i+k, max(1, 7−k)); k ≤ 11’e bakmak yeter (daha ilerisi asla optimal — arada pozitif gün oynanabilirdi). Motordan: lotto(L) = 32 == bitmask brute; memo 57 ≤ 6·12 = 72 (durum genişletme ×6 tanığı). n×6 alt problem × O(11) = O(n) LİNEER.

İfade. \(n\) gün, gün \(i\) kazancı \(L(i)\) (pozitif tam sayı). Ardışık herhangi 7 günde en fazla 2 kez loto oyna. Toplam kazancı maksimize et. Lineer zaman istenir.

Naif deneme. \(x(i) = i\dots n\) günlerinde max kazanç; R: oyna \(L(i) + x(i+1)\) ya da oynama \(x(i+1)\). Sorun: kazançlar pozitif → hep oyna; 7-gün kısıtı uygulanmıyor.

Düzeltme — durum genişletme. Gün \(i\)’de oynadığımı varsay (LIS gibi) ve bir sonraki izinli oyun offset’i \(j\)’yi state’e ekle: \(x(i, j) =\) “i’de oynadım, sonraki izinli oyun \(i+j\)” (\(j \in 1..6\), çünkü asla \(i+6\)’dan ileri kısıtlanamam — daha eski oyunlar daha sağa itemez).

“I’m remembering what happened in the past by describing it as a restriction of something in the future.” — Ku

Çözüm. S: yukarıdaki \(x(i, j)\). R: \(x(i) = L(i) + \max_k\, x(i+k, \text{yeni\_j})\), \(\text{yeni\_j} = \max(1, 7-k)\); \(k =\) bir sonraki oynama günü offset’i. T: \(i\) kesin artar (suffix). B: \(x(n) = L(n)\) (son gün \(L(n)\) kullanılır); \(L(i)\)’yi max dışına alıp \(\cup\, \{0\}\) yazılırsa bağıntı tabana indirgenir. O: \(\max_i x(i, 1)\) (ilk ~sabit).

Karmaşıklık — anahtar. \(k\) döngüsü neden sabit? İki oyun “ortada” sıkışınca: 10 ara eleman → en fazla 11’e kadar bak. Bundan ileri oynamak asla optimal değil (arada pozitif kazançlı bir gün oynanabilirdi). Yani \(n\) alt problem $, O(11) = $ \(O(n)\) lineer.

Kategori (Demaine L18): suffix alt problem + lokal durum genişletme; sabit ama \(> 2\) branching; özgün cevapta alt problemleri birleştirme. “Kavramsal olarak en kolay, implement etmesi en zor” tür.

Notİndeks köprüsü — Lotto prose vs kod

Prosede taban “son gün \(L(n)\)” diye \(1\)-tabanlı anlatılır; motorda (lotto) diziler \(0\)-tabanlıdır, dolayısıyla son gün indeksi \(n-1\) ve \(k\) döngüsü range(j, min(11, n-1-i)+1) ile sınırlanır. Aynı matematik (D25/D29 emsali): \(1\)-tabanlı sınav anlatımı ile \(0\)-tabanlı kod, \(-1\) kaymasıyla birebir örtüşür; motor lotto(L) = 32 değeri her iki okumayı da doğrular.

Şekil 31.3 Problem 2’nin imza fikrini gösterir: üç dizi + C’nin tam bölünmesi; C’deki konum ayrı bir indeks değildir (\(k_i + k_j\)’den türer, bağımlı indeks elenir) ve karar dört seçimli bir OR’dur.

Şekil 31.3: DNA babalık testi — 3-string Boolean DP, O(n⁴) kuartik (QR3 Problem 2, Spring-18). Üç n-uzunluklu DNA dizisi; C, eşit uzunlukta iki ayrık alt-dizilime bölünüp biri A’nın diğeri B’nin alt-dizilimi olabilir mi? ÜST panel (somut örnek n=6): C₁=CGTTAG → EVET, 3+3 bölünme (A-grubu CGT amber → A=CGTACG; B-grubu TAG slate → B=TTAGCA); ikinci örnek C₂=GGGGGG → HAYIR (A’da 2 + B’de 1 = 3 G < 6 gerekli). ALT panel (durum/recurrence): x(i, j, kᵢ, kⱼ); C konumu AYRI İNDEKS DEĞİL, |C| − (kᵢ+kⱼ)’den TÜRER → bağımlı indeks elenir; karar ∨ 4 seçim (Aᵢ eşle / Bⱼ eşle / Aᵢ atla / Bⱼ atla); taban dengesi: true taban x(n,n,0,0)=True VARSA false tabanlar da ŞART (dizi bitti ama kota>0 → False). Motordan: dna_match(A,B,C₁)=True == brute (2ⁿ boyama + is_subsequence D24); C₁ boyaması A→[0,1,2], B→[3,4,5]; tek-uzunluk → False. n⁴ alt problem × O(1) = O(n⁴).

İfade. Üç \(n\)-uzunluklu DNA dizisi \(A\), \(B\), \(C\) (CGTA). Charlie (\(C\)), eşit uzunlukta iki (bitişik olmayan) alt-diziye bölünebiliyorsa eşleşir: biri \(A\)’nın alt-dizisi, diğeri \(B\)’nin alt-dizisi. \(C\)’nin tüm karakterleri kullanılmalı (\(A\), \(B\)’ninkiler değil). Charlie sahte mi? \(O(n^4)\) istenir.

Yaklaşım. LCS’e benzer ama üç dizi + \(C\)’nin tam bölünmesi. Naif (\(i, j, k\) prefix indeksleri) yetmez — \(C\)’nin kaçını \(A\)’ya, kaçını \(B\)’ye verdiğimi bilmem gerek. Durum: \(k_i = C\)’nin \(A\)’ya eşleşecek kalan karakter sayısı, \(k_j = B\)’ye eşleşecek kalan. \(C\)’deki konum bağımsız değil\(k_i + k_j\)’den hesaplanır (\(C\) suffix’inde \(k_i + k_j\) karakter kalmalı).

Çözüm. S: $x(i, j, k_i, k_j) = $ Boolean: \(A\) suffix\((i)\)’den \(k_i\)-uzunlukta + \(B\) suffix\((j)\)’den \(k_j\)-uzunlukta alt-diziyle, \(C\) suffix’inin (uzunluk \(k_i + k_j\)) tüm karakterleri eşleşebilir mi? R (\(\vee\) over 4 seçim): (1) $A_i = $ ilgili \(C\) karakteri ise & \(k_i > 0\): \(x(i+1, j, k_i-1, k_j)\); (2) \(B_j\) eşleşir & \(k_j > 0\): \(x(i, j+1, k_i, k_j-1)\); (3) \(A_i\)’yi atla: \(x(i+1, j, k_i, k_j)\) (\(i < n\)); (4) \(B_j\)’yi atla: \(x(i, j+1, k_i, k_j)\) (\(j < n\)). T: \(i + j\) kesin artar (en az biri artar). B: $x(n, n, 0, 0) = $ true (her şey eşleşti); \(A\) bitti ama \(k_i > 0\)false (ve \(B\) için simetrik). O: \(x(0, 0, n/2, n/2)\); \(n\) çift değilse direkt false.

“If you give us a true base case, you better be giving us some false base cases.” — Ku (Base Cases)

Karmaşıklık. \(i, j \in 0..n\); \(k_i, k_j \in 0..n/2\)\(n^4\) alt problem \(\times\, O(1)\) (4 seçim) = \(O(n^4)\) kuartik. (Gerçek babalık değil — kurgu.)

Şekil 31.4 Problem 3’ün imza fikrini gösterir: çekirdek 0/1 knapsack’ine TAM-s tatlı sayacı eklenir; bu tam-eşitlik kısıtı tabanı ikiye böler ve “kota tutmadı → \(-\infty\)” dengesi \(-\infty\) tabanlarını zorunlu kılar. \(k\) çıplak sayı olduğu için runtime pseudopolinom.

Şekil 31.4: Tapas — 0/1 knapsack + tatlı sayısı, O(nks) pseudopolinom (QR3 Problem 3, İMZA figür, Spring-18). n tabak; tabak i: hacim Vᵢ, kalori Cᵢ, tatlılık sᵢ ∈ {0,1}. En fazla k kalori ye; TAM s tatlı tabak ye; 0/1; doyma için hacmi maksimize et. SOL panel: 5 tabak kartı (V hacim üst, C kalori alt, tatlı rozeti); seçilenler (0,1,4) amber ✶; kalori çubuğu 8’e karşı 3+2+3=8 TAM dolu; tatlı sayacı TAM 2/2; max hacim 15. SAĞ panel: x(i, j, s′) iki seçim (ye / yeme); taban dengesi — true taban x(n,j,0)=0 (yeşilimsi) AMA x(n,j,s′≠0)=−∞ (amber uyarı: kota tutmadı → asla seçilme); imkansiz mini-örnek tapas([5],[2],[0],10,3)=−∞ (tek tatsız tabak + s=3); polinom-teşhis (n+1)(k+1)(s+1) × O(1) = O(nks) PSEUDOpolinom (k çıplak sayı — Ku: subset sum gibi). Motordan: tapas(…) = 15 == bitmask brute; optimal {0,1,4} V=[6,4,5]=15, ΣC=8≤8, Σs=2.

İfade. \(n\) tabak; tabak \(i\): hacim \(V_i\), kalori \(C_i\), tatlılık \(s_i \in \{0, 1\}\). En fazla \(k\) kalori ye; tam \(s\) tatlı tabak ye; aynı tabağı iki kez alma (0/1). Doyma için hacmi maksimize et. \(O(nks)\) istenir.

Önce: polinom mu? Girdi = her tabak için 3 sayı, \(n\) tabak → \(n\), \(s\) polinom; ama \(k\) sadece bir sayı (bir kelimede, üstel büyüklükte olabilir). Yani pseudopolinom (subset sum / knapsack gibi). Sınavda sık sorulur: “runtime polinom mu?” — çözmeden, runtime’a bakıp girdi boyutuyla sınırlanıp sınırlanmadığına bak.

“this is a pseudopolynomial running time. Because k is just a number in my problem, similar to subset sum.” — Ku

Çözüm. S: \(x(i, j, s') = P_i \dots P_n\) tabaklarından, en fazla \(j\) kalori ve tam \(s'\) tatlı ile elde edilebilen max hacim. R (max, 2 seçim): ye → \(V_i + x(i+1, j-C_i, s'-s_i)\) (yalnız \(C_i \le j \wedge s_i \le s'\)); yeme → \(x(i+1, j, s')\) (hep). T: \(i\) kesin artar. B: \(x(n+1, j, 0) = 0\) (menü bitti, tam \(s\) yendi — iyi); $x(n+1, j, s’) = $ \(-\infty\) \(s' \ne 0\) ise (tatlı kotası tutmadı — asla seçilmesin). O: \(x(1, k, s)\).

Karmaşıklık. \((n+1)(k+1)(s+1)\) alt problem $, O(1) = $ \(O(nks)\) pseudopolinom.

Notİndeks köprüsü — Tapas prose vs kod

Prosede taban “\(x(n+1, j, 0)\)” ve özgün cevap “\(x(1, k, s)\)” diye \(1\)-tabanlı yazılır; motorda (tapas) tabaklar \(0\)-tabanlıdır, dolayısıyla taban i == n (tüm tabaklar tüketildi) ve özgün cevap x(0, k, s)’dir. Aynı recurrence (D25/D29 emsali): \(1\)-tabanlı sınav anlatımı, kodda bir indeks kaymasıyla birebir aynı tabloyu üretir; motor tapas(...) = 15 ve imkansız kotada −∞ her iki okumayı da doğrular.

İpucuAtlanan 4. problem — Gokemon Po

Canavar yakala; bir konuma git (ride-share ücreti) + bedava yakala, VEYA uygulama-içi satın al (farklı ücret, konum değişmez). Anahtar: en son nerede olduğumu hatırla → sonraki konuma mesafe. Pseudopolinom değil; konum durumuyla genişletme. Ku zaman yetmediği için bıraktı (transkript 1:09).

31.4 Quiz Hazırlığı Egzersizleri

Egzersiz 1. Lotto’yu prefix alt problemiyle yeniden kur (gün \(i\)’de oynadığımı varsay, önceki izinli oyun). Sonucun suffix versiyonuyla aynı \(O(n)\) olduğunu göster.

Egzersiz 2. DNA probleminde \(C\)’deki konumu neden ayrı bir indeks olarak tutmaya gerek olmadığını (\(k_i + k_j\)’den türediğini) bir örnekle açıkla.

Egzersiz 3. Tapas’ta “tam \(s\) tatlı” kısıtını “en fazla \(s\) tatlı”ya çevirirsen taban durumlar nasıl değişir? Hâlâ \(-\infty\) gerekir mi?

Egzersiz 4. Verilen bir runtime’ın (örn. \(O(nW)\), \(O(n^2)\), \(O(2^n \cdot n)\)) polinom mu pseudopolinom mu üstel mi olduğunu, girdi boyutuna göre sınıflandır.

Egzersiz 5. Üç problemin her birinde “alt problem hakkındaki soru”yu (\(R\) adımı) tek cümleyle yaz (Lotto: sonraki ne zaman oynayayım? DNA: ilk karakteri kime eşleyeyim? Tapas: bu tabağı yiyeyim mi?).

31.5 Sınav Stratejisi (Kapsam Notları)

  • Söz + matematik: \(S\)’yi sözle (memo ne döndürür), \(R\)’yi matematik formülle yaz — iletişim puanın yarısı.
  • Prefix \(\leftrightarrow\) suffix değiştirilebilir; diziyi ters çevir, aynı DP. Bu sınıf suffix kullanır.
  • Alt problem sayısı = parametrelerin çarpımı (toplamı değil). İş/alt problem = branching.
  • Polinom teşhisi: runtime’daki her terimi girdi boyutuyla sınırlayabiliyor musun? \(k / W\) gibi “çıplak sayı” varsa pseudopolinom.
  • Parent pointer: sadece optimum değeri değil, seçimi (hangi gün/tabak/eşleşme) geri getirmek için max’ta hangi alt probleme gittiğini sakla.
  • Taban durum dengesi: \(\vee\)-temelli Boolean DP’de bir true taban varsa, mutlaka false tabanlar da olmalı (yoksa hep true döner).
İpucuBuilder Notu — Pseudopolinom Teşhisi Gerçek-Dünya Refleksi

“Runtime’da çıplak sayı var mı?” sorusu sınıf dışında her yerde işe yarar: bir DP çözümünün \(O(nW)\) olması, \(W\) büyüdükçe (yüksek bütçe, büyük kapasite) pratikte yavaşlayacağı anlamına gelir — subset sum, knapsack, coin change hepsi bu sınıftandır. Mühendislikte refleks: bir runtime gördüğünde “girdi boyutu kaç bit?” diye sor; \(k\) bir kelimede sığan bir sayıysa ama runtime \(k\) ile çarpılıyorsa, girdi \(\log k\) bit iken çalışma \(2^{\log k}\) ile büyür — pseudopolinom. Quiz 3’ün Tapas problemi tam olarak bu refleksi test eder.

31.6 Toplu Cheat Sheet — SRTBOT

Adım Ne yapılır Quiz’de dikkat
S — Subproblems \(x(\dots)\) tanımı: memo ne döndürür, ne kadar büyük Tanımda olmayan parametre = sıfır puan
R — Relate Matematik bağıntı: \(\max / \min / \sum / \vee\) over seçimler Söz değil formül; “soru sor” stratejisi
T — Topological Bir indeks (veya toplam) hep artar/azalır → DAG Acyclic kanıtı yoksa sonsuz döngü
B — Base cases Memo sınırı dışı için sabit-zaman cevap Taban yoksa sonlu zaman bile değil
O — Original Özgün cevabı alt problemden üret (+ parent pointer) Tek alt problem mi, max mı?
T — Time #alt problem (parametre çarpımı) \(\times\) iş/alt problem Çarp, toplama; polinom/pseudopolinom ayrımı

DP alt problem kategorileri (Demaine L18): suffix/prefix (tek-uç karar) · bitişik alt-dizi (iki-uç karar) · çoklu dizi (indeks çarpımı) · durum genişletme (sıra/yön/bütçe/tatlı/konum) · sayıya göre genişletme (pseudopolinom).

31.7 Bu Quiz Review’in Özeti

  1. Quiz 3 = DP bloğu (Ders 23-27; L15-L18); tek konu dinamik programlama, omurga SRTBOT.
  2. SRTBOT çerçevesi: alt problemi sözle tam tanımla, recurrence’ı matematikle yaz, topolojik sırayı kanıtla, taban durumları (true + false dengesi) kur, özgün cevabı üret, süreyi analiz et.
  3. Lotto (durum genişletme): naif suffix kısıt uygulayamayınca offset state ekle; “geçmişi gelecek kısıtı olarak hatırla”; \(O(n)\) lineer.
  4. DNA (çoklu-dizi Boolean DP): üç dizi; bağımlı indeks (\(C\) konumu = \(k_i + k_j\)) elenir; \(\vee\) 4 seçim; true/false taban dengesi; \(O(n^4)\).
  5. Tapas (pseudopolinom knapsack): 0/1 knapsack + tam-\(s\) tatlı sayacı; kota tutmadı → \(-\infty\) taban; \(k\) çıplak sayı → \(O(nks)\) pseudopolinom.
  6. Strateji: söz + matematik, çarp (toplama değil), polinom teşhisi, parent pointer, taban dengesi.
ÖnemliTek Bir Cümle

Quiz 3’te kritik olan: alt problemi sözle tam tanımla (tanımsız parametre = puan yok), bağıntıyı matematikle yaz, topolojik sırayı kanıtla, taban durumları (true + false dengesi) unutma, runtime’ı girdi boyutuyla sınıflandır (polinom mu pseudopolinom mu). Üç gerçek problem üç tekniği gösterdi: durum genişletme (Lotto — “geçmişi gelecek kısıtı olarak hatırla”), çoklu-dizi Boolean DP (DNA — bağımlı indeks elenir), 0/1 knapsack + sayaç (Tapas — pseudopolinom).

31.8 Builder ve OMSCS Bağlantıları

İpucu5 köprü

Bu son tekrar oturumu, “alt problemi sözle tanımla, recurrence’ı matematikle yaz, runtime’ı girdi boyutuyla sınıflandır” disiplinini kurar — köprülerin özeti:

  1. Quiz 3 = DP midterm → OMSCS CS 6515: dinamik programlama, graduate algoritma dersinin en ağır blokudur (sınavların yarısı DP).
  2. Durum genişletme → gerçek sistemde “state machine + bütçe” tasarımı: kalan kapasite, kalan adım, son konum — hepsi DP state’i olur.
  3. Çoklu-dizi DP → biyoinformatik (dizi hizalama), diff/merge araçları, versiyon kontrol — LCS ailesinin pratik karşılıkları.
  4. Pseudopolinom teşhisi → “runtime’da çıplak sayı var mı?” refleksi: knapsack, subset sum, coin change’in pratik yavaşlık sınırı.
  5. SRTBOT iletişim disiplini → mühendislikte “önce problemi net tanımla, sonra çöz”; kod yazmadan önce alt problemi sözle ifade etmek, gerçek refleks.

ÖnemliTek bir şey alıp gideceksen

SRTBOT, her özyinelemeli algoritmanın çerçevesidir; DP, alt problemler örtüştüğünde (memoize → DAG) devreye girer. Quiz 3’te kritik olan: alt problemi sözle tam tanımla (tanımsız parametre = puan yok), bağıntıyı matematikle yaz, topolojik sırayı kanıtla, taban durumları (true + false dengesi) unutma, runtime’ı girdi boyutuyla sınıflandır (polinom mu pseudopolinom mu). Üç gerçek problem üç tekniği gösterdi: durum genişletme (Lotto), çoklu-dizi Boolean DP (DNA), 0/1 knapsack + sayaç (Tapas).