27  Dinamik Programlama 3: Floyd-Warshall, Parantezleme

Subproblem expansion derinliği: alt probleme bir koordinat ekleyerek geçmişi/state’i hatırlamak — Floyd-Warshall vertex-prefix APSP ile ilk k düğümü kullan ve E terimini V’ye çevir O(V³), parantezlemede son işlemi (kök) tahmin et ve negatifler için min/max genişlet O(n³), parmaklamada hangi parmakla başladığını state olarak taşı O(n·F²)

NotOturum bilgisi

Bu, DP ünitesinin üçüncü dersidir. Ders 24 çoklu girdi, alt problem kısıtı ve genişletmeyi tanıttı; bu ders subproblem expansion’ı derinleştirir: alt probleme bir kısıt/koordinat ekleyerek geçmişi/state’i hatırlamak. Dört örnek — Bellman-Ford (DP olarak), Floyd-Warshall (yeni APSP, \(O(V^3)\)), aritmetik parantezleme (kök tahmini + min/max), piyano parmaklama (state = parmak). Tarihsel not: DP’yi 1950’lerde Bellman icat etti; “programming” eski anlamıyla optimizasyon, “dynamic” ise her aşamada farklı davranan yerel kaba kuvvet.

27.1 Bu Derste Ne Var?

DP serisinin 3/4’ü (Erik Demaine). Tema: subproblem expansion (alt problem genişletme) — alt probleme bir kısıt/durum koordinatı ekleyerek “geçmişi/state’i hatırlamak”.

“we can always add subproblems to make the next step easier.” — Demaine, 2:55

Üç ana fikir:

  1. Floyd-Warshall — alt problemi “yalnız ilk \(k\) düğümü kullanarak” kısıtla → \(O(V^3)\) (\(E\) faktörünü \(V\)’ye çevirir).
  2. Kökü tahmin et — parantezleme/ifade ağacında son işlem (kök) en kolay tahmin edilebilir özelliktir → substring alt problemleri.
  3. State = koordinat — piyano parmaklamada “hangi parmakla başladım” durumunu alt problem koordinatına taşı.
flowchart TD
    A["Ders 26 (L17): Dinamik Programlama 3 — Floyd-Warshall, Parantezleme"] --> BF["Bellman-Ford = DP"]
    BF --> BFa["δ-alt-k: en fazla k kenar kısıtı<br/>k indeksi çevrimliyi çevrimsize çevirir; O(V·E)"]
    A --> FW["Floyd-Warshall — vertex-prefix APSP"]
    FW --> FWa["d(u,v,k) = yalnız ilk k düğüm<br/>min İKİ terim O(1) → O(V³); köşegen<0 tanığı"]
    A --> VS["FW vs Johnson"]
    VS --> VSa["yoğun → FW (5 satır); seyrek → Johnson (V² log V)<br/>negatif çevrimde ikisi de AYNI tanık"]
    A --> PR["Parantezleme — kök tahmini"]
    PR --> PRa["son işlem (kök) tahmin et → substring<br/>negatif için HEM min HEM max; O(n³)"]
    A --> PI["Piyano parmaklama — state = parmak"]
    PI --> PIa["zorluk d dört parametreli; başlangıç parmağı koordinatı<br/>sonraki parmağı tahmin et; O(n·F²)"]

    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 BF,FW,VS,PR,PI branch
    class BFa,FWa,VSa,PRa,PIa leaf
Şekil 27.1: Ders 26’nın (L17) kavram haritası: kök = Dinamik Programlama 3 (Demaine) — DP serisinin 3/4’ü; tek tema SUBPROBLEM EXPANSION, yani alt probleme küçük bir koordinat/kısıt ekleyerek geçmişi ve state’i hatırlamak. Dört dal — (1) Bellman-Ford DP olarak: δ-alt-k aslında en fazla k kenar kısıtlı bir DP’dir, k indeksi çevrimli grafı çevrimsize çevirir, son kenarı tahmin et, O eşittir V çarpı E; bu k_edge_distances motorunun ta kendisidir. (2) Floyd-Warshall vertex-prefix APSP: alt problem d(u,v,k) yalnız ilk k düğümü ara-düğüm kullanır, k. düğümü ekleyince yol ya geçmez ya BİR KEZ geçer yani min İKİ terim O(1) iş, V küp alt problem çarpı O(1) eşittir O(V küp), negatif çevrim tanığı köşegen d(v,v) sıfırdan küçük. (3) FW karşı Johnson: yoğun grafta FW basit beş satır kod, seyrek grafta Johnson V kare log V kazanır, ikisi de negatif çevrimde AYNI tanığı verir. (4) Parantezleme kök tahmini: son yapılan işlem en kolay tahmin edilen özellik, kökü seç sol ve sağ substring ayrışır; negatif sayılarda iki yanı maksimize çöker çünkü negatif çarpı negatif eşittir büyük pozitif, çözüm her substring için HEM min HEM max sakla, n küp. (5) Piyano parmaklama state eşittir parmak: zorluk d dört parametreli, alt problemi başlangıç parmağıyla kısıtla, sonraki parmağı tahmin et, n F kare. Birleştirici tema: küçük state’i alt problem sayısıyla çarp, geçişleri yerel kaba kuvvetle tara — neredeyse her problemin her yönünü yakalarsın.
İpucuBuilder Notu — Floyd-Warshall = transitif kapanış / ağ analizi

Floyd-Warshall yalnız APSP mesafe matrisi vermez; ağırlıkları “var/yok” boole’e indirgersen aynı \(O(V^3)\) üçlü döngü transitif kapanışı (reachability — “hangi düğümden hangi düğüme ulaşılır?”) hesaplar. Bu yüzden ağ analizi, sosyal-ağ erişilebilirliği ve derleyici veri-akışı analizinde temel araçtır: dense çizgede 5 satır kod, in-place, basit. Asimptotik olarak Johnson kadar iyi değildir (\(V \cdot E\) seyrek çizgede kazanır), ama dense (\(E \sim V^2\)) veya küçük çizgede pratik üstünlük FW’dedir.

  • İleriye → Floyd-Warshall: APSP mesafe matrisi, transitif kapanış (reachability), ağ analizi; dense çizgede pratik.
  • İleriye → parantezleme: derleyici ifade optimizasyonu, matris-zincir çarpımı (matrix chain), sözdizimi ağacı.
  • İleriye → parmaklama: MIDI/müzik teknolojisi, dizilim hizalama, durum-makinesi DP’leri.
  • Geriye → Bellman-Ford (Ders 18): \(\delta_k\) aslında bir DP alt-problem kısıtıdır.

Tek cümle: Alt probleme bir koordinat ekleyerek “state” hatırlarsın: Floyd-Warshall “ilk \(k\) düğümü kullan” der (\(O(V^3)\)), parantezleme “son işlem hangisi?” diye kökü tahmin eder (negatifler için min+max), parmaklama “hangi parmak” durumunu taşır — hepsi subproblem expansion.

27.2 1. DP 3/4: Subproblem Expansion

DP 2’de para oyununda alt problemi 2 katına (kim başlıyor) çıkarmıştık. Bu ders, bu fikri derinleştirir: alt probleme kısıt/koordinat ekleyerek geçmişi hatırlamak. Hatırlatma: alt problemleri tanımla (prefix/suffix/substring; çoklu girdide çarpım), “çözümün hangi özelliğini bilsem işim biterdi?” sorusunu kaba kuvvetle dene, DAG + topolojik sıra, taban, orijinal, süre.

“we can always add subproblems to make the next step easier.” — Demaine, 2:55

Bu derste bu refleksi dört kez izleriz: Bellman-Ford’u bir DP olarak yeniden okuruz; Floyd-Warshall’da “yalnız ilk \(k\) düğüm” kısıtını ekleriz; parantezlemede “son işlem hangisi?” diye kökü tahmin ederiz; parmaklamada “hangi parmak” durumunu taşırız. Her seferinde alt problem sayısını küçük bir faktörle çarpar, recurrence’ı sadeleştiririz.

27.3 2. Bellman-Ford DP Olarak

Bellman-Ford (Ders 18) aslında bir DP’dir. S: $_k(s, v) = $ en fazla \(k\) kenarlı en kısa \(s \to v\) yol (kısıt: \(k\)). R:

\[\delta_k(s, v) = \min\bigl( \delta_{k-1}(s, v),\; \min\{\, \delta_{k-1}(s, u) + w(u, v) : (u,v) \text{ gelen kenar} \,\} \bigr)\]

Son kenar \((u, v)\)’yi tahmin et; yol \(\le k\) kenarsa, kalanı \(\le k-1\) kenar → \(\delta_{k-1}\). \(k\) indeksi çevrimli grafı (\(G\)) çevrimsize çevirir: \(k\) artan sırada referanslar hep \(k-1\)’e → acyclic. O: \(\delta_{V-1}(s, v)\). Süre: \(\sum_k \sum_v (\text{gelen kenar}) = O(V \cdot E)\).

Şekil 27.2 bu DP’yi motor üzerinde somutlaştırır: D21 örneğinin (a,b,c,d) \(\delta_k(a, v)\) tablosu — satırlar \(k = 0 \ldots 3\), sütunlar \(v\). Satırdan satıra düşen hücreler (amber ok) “bir kenar daha eklendi” demektir; son satır \(\delta_3\) tam olarak klasik Bellman-Ford sonucudur (\(\{a{:}0, b{:}{-2}, c{:}1, d{:}0\}\)). Kritik gözlem: motorun k_edge_distances fonksiyonu bu tablonun ta kendisidir — Bellman-Ford’un DP iskeleti.

Şekil 27.2: Bellman-Ford bir DP’dir — δₖ(a, v) alt-problem tablosu (L17 §2 + D18 köprüsü). Sol bölge: satırlar k=0..3, sütunlar v=a,b,c,d; her hücre δₖ (∞ soluk). Satırdan satıra DÜŞEN hücreler amber ok (‘δₖ < δₖ₋₁ → bir kenar daha eklendi, yeni gevşeme’). Son satır δ₃ amber kesik çerçeve = klasik Bellman-Ford sonucu (sonlu). Sağ kutu: SRTBOT eşlemesi (S = δₖ en fazla k kenar kısıtı = k koordinatı; R = kal ya da bir kenar gevşet; T = k artan çevrimliyi acyclic yapar; O = δ_{V−1} SSSP cevabı). Alt rozet: alt-problem genişletmesi ×V → O(V·E); motor k_edge_distances BU tablonun ta kendisi. Veri MOTORDAN (assert): k_edge_distances(build_fw_example, ‘a’, 3); son satır == bellman_ford_classic; tab[0..3] birebir; düşüşler k=1 {b,c}, k=2 {c,d}, k=3 yok.

27.4 3. Floyd-Warshall: Vertex-Prefix APSP

Yeni bir tüm-çiftler en kısa yol (APSP) algoritması. Johnson kadar asimptotik iyi değil ama çok basit ve dense çizgede mükemmel: \(O(V^3)\). Fikir — farklı bir subproblem expansion.

Düğümleri \(1 \ldots V\) numarala. S: \(d(u, v, k) = u \to v\) en kısa yol, yalnız \(\{u, v, 1 \ldots k\}\) düğümlerini ara-düğüm olarak kullanarak.

Bu, “en fazla \(k\) kenar” kısıtından farklı bir kısıt: “yalnız ilk \(k\) düğüm”. Bu, pahalı “tüm gelen düğümler üzerinde döngü”yü (\(E\) terimi) ortadan kaldırır.

27.5 4. Floyd-Warshall Recurrence ve O(V³)

Çalışılan Örnek. \(d(u, v, k)\)’yı hesapla: \(k\). düğümü ekleyince iki seçenek — yol \(k\)’dan geçmez ya da geçer:

\[d(u, v, k) = \min\bigl( d(u, v, k-1),\; d(u, k, k-1) + d(k, v, k-1) \bigr)\]

İlk terim: \(k\)’yı kullanma. İkinci: \(u \to k\) (ilk \(k-1\) ile) \(+ \; k \to v\) (ilk \(k-1\) ile) — basit yol olduğundan \(k\) bir kez geçilir. Min yalnız iki terim\(O(1)\) iş! T: \(k\) artan (üçlü iç içe döngü \(k, u, v\)). B: \(d(u, v, 0) = 0\) (\(u=v\)) / \(w(u, v)\) (kenar varsa) / \(\infty\) (yoksa). O: \(d(u, v, V)\). Süre: \(V^3\) alt problem \(\times\, O(1) = O(V^3)\).

Şekil 27.3 recurrence’ı motorun \(5\) ardışık \(d\)-matrisi üzerinde gösterir (taban \(\to k = a, b, c, d\)): her adımda bir önceki matrise göre değişen hücreler amber vurgulanır. Örneğin \(k = b\) adımında \((a, c){:}\,4 \to 1\) ve \((a, d){:}\,\infty \to 0\) — çünkü artık \(a \to b \to c\) ve \(a \to b \to d\) yolları açılır. Son matris üç bağımsız yoldan doğrulanır: \(\text{FW} = \text{johnson} = V \times \text{Bellman-Ford}\) (üç-yol tanığı, 60 rastgele çizgede de tutar), ve köşegen \(d(v,v) = 0\) (negatif çevrim yok).

Şekil 27.3: Floyd-Warshall: d(u, v, k) evrimi — taban → k = a, b, c, d (Demaine L17 §3-4 İMZA). 5 mini-matris dizisi (4×4 d matrisi); her adımda bir önceki adıma göre DEĞİŞEN hücreler amber vurgulu + sağ-üst köşede ‘k yoluyla’ rozeti, köşegen 0 koyu, ∞ soluk; matrisler arası ‘k yoluyla’ okları. k=b adımında (a,c):4→1 ve (a,d):∞→0 (yol b’den geçer). Altta recurrence kutusu d(u,v,k) = min(d(u,v,k−1), d(u,k,k−1)+d(k,v,k−1)) — İKİ terim, yol k’dan ya geçmez ya BİR KEZ geçer → hücre başına O(1). Sağ rozet: V³ × O(1) = O(V³); FW == johnson == V × BF (üç-yol tanığı). Veri MOTORDAN (assert): floyd_warshall_steps(build_fw_example); 5 adım (taban + k=a..d); steps[2] (a,c)=1, (a,d)=0; final == floyd_warshall == johnson == brute_apsp; fw_negative_cycle(final) == [].

27.6 5. Floyd-Warshall vs Johnson

  • Floyd-Warshall: her zaman \(O(V^3)\). Dense çizgede (\(E \sim V^2\)) Johnson ile aynı (\(V \cdot E \sim V^3\)), ama daha basit (5 satır).
  • Johnson: \(O(V^2 \log V + V \cdot E)\). Seyrek çizgede çok daha iyi (\(V^2 \log V\)).

Kural: çizgenin dense olduğunu önceden biliyorsan (veya küçükse) Floyd-Warshall; seyrek/karışıksa Johnson (seyreklikten kazanır). Negatif olmayan ağırlıkta \(V \times\) Dijkstra da bir seçenektir.

İki algoritma negatif çevrim karşısında da aynı tanığı verir: APSP, negatif çevrimi olan bir çizgede tanımsızdır (mesafe \(-\infty\)’a düşer). Floyd-Warshall bunu köşegende yakalar (\(d(v, v) < 0\)); Johnson süpernode-Bellman-Ford adımında \(-\infty\) görür ve None döndürerek iptal eder. Şekil 27.4 hem seçim haritasını (yatay FW \(O(V^3)\) vs artan Johnson eğrisi) hem de bu ortak teşhisi gösterir: build_bf_example çizgesinde (\(b \to c \to d \to b = -2\) çevrim) FW köşegeni \(\{b, c, d\}\) düğümlerini negatif işaretler, Johnson None döner — köşegen \(< 0 \Leftrightarrow\) Johnson iptali, 60 rastgele çizgede de birebir.

Şekil 27.4: APSP seçim: seyrek → Johnson, yoğun → FW (5 satır), negatif çevrimde ikisi de AYNI tanık (Demaine L17 §5; Johnson algoritmasının kendisi Ders 21/L14, Ku). SOL panel seçim haritası: x = kenar yoğunluğu E (seyrek V’den yoğun V²’ye), y = süre; Floyd-Warshall yatay O(V³) (amber, E’den bağımsız), Johnson eğri O(V² log V + V·E) (slate, E ile artar); kesişim E ≈ V²; seyrek bölge ‘Johnson KAZANIR’, yoğun bölge ‘~eşit’; ‘FW = 5 satır kod’ rozeti. SAĞ panel negatif-çevrim teşhisi: build_bf_example çizgesi (çevrim b→c→d→b = (−4)+3+(−1) = −2), çevrim düğümleri {b,c,d} amber ‘d(v,v)<0’ rozetli; iki teşhis kutusu — Floyd-Warshall köşegen d(v,v)<0 → {b,c,d}; Johnson Bellman-Ford → −∞ → None (APSP İPTAL); ⟺ köprüsü ‘köşegen < 0 ⟺ Johnson iptali’ (60 rastgele çizgede çapraz tanık). Veri MOTORDAN (assert): floyd_warshall(build_fw_example) == johnson == brute_apsp; fw_negative_cycle == []; floyd_warshall(build_bf_example) köşegen<0 düğümleri == fw_negative_cycle == [‘b’,‘c’,‘d’]; johnson(build_bf_example) is None.

27.7 6. Aritmetik Parantezleme: Kökü Tahmin Et

Problem. Formül \(a_0 \star_1 a_1 \star_2 \ldots a_{n-1}\) (\(\star = +\) veya \(\times\), \(a_i\) tamsayı). Parantezleri istediğin gibi yerleştirip sonucu maksimize et. Örnek: \(7 + 4 \times 3 + 5 \to ((7+4) \times (3+5)) = 88\).

İfade bir ağaçtır; en kolay tanımlanabilir özellik kök \(=\) son yapılan işlem.

“guess which operation, star i, is evaluated last — or, in other words, at the root.” — Demaine, 30:51

Kök \(\star_k\)’yı tahmin et → solu (prefix) ve sağı (suffix) ayrışır; ama prefix-of-suffix gerektiğinden alt problem substring olmalı (prefix+suffix karışımı → daima substring).

Şekil 27.5 bu fikri motor üzerinde gösterir: kazanan ağaç \(((7 + 4) \times (3 + 5)) = 88\) — kök \(k = 2\) (yani \(\times\)), sol substring \((7+4) = 11\), sağ substring \((3+5) = 8\), \(11 \times 8 = 88\) (Demaine’le birebir). Soldan-sağa naif değerlendirme (\(((7+4) \times 3) + 5 = 38\)) sub-optimaldir. Sağdaki substring tablosu \(x(i, j, \max)\) üçgenini (\(10\) hücre) ve kök-seçim oklarını gösterir; brute-force \(4\) farklı parantezleme değeri (\(\{24, 38, 39, 88\}\)) verir, max \(= 88\).

Şekil 27.5: Parantezleme: kök-tahmini (SON işlem) → O(n³) DP (Demaine L17 §6 İMZA, 30:51). SOL panel kazanan ifade ağacı: kök × (amber, ‘kök = SON işlem’), sol + = (7+4)=11, sağ + = (3+5)=8, üst rozet 11 × 8 = 88; alt köşede alternatif KÖTÜ ağaç (((7+4)×3)+5) üstü çizik ‘soldan-sağa = 38 ✗ sub-optimal’. SAĞ panel substring tablosu x(i,j,max): üçgen yerleşim 10 hücre (satır = başlangıç i, sütun = uzunluk j−i, taban x(i,i+1)=aᵢ), (0,4)=88 amber hedef; kök-seçim okları (0,4) ← (0,2) ve (2,4) (son işlem k=2 bölünmesi); alt rozet 4² substring × 2 opt × O(4) kök = O(n³), 4ⁿ olası parantezleme polinomda taranır (brute: 4 farklı değer, max=88). Veri MOTORDAN (assert): build_paren_example == ([7,4,3,5],[+,*,+]); paren_reconstruct == (‘((7 + 4) × (3 + 5))’, 88); choice[(0,4,max)] kök k=2 (×); xmax[(0,2)]=11, xmax[(2,4)]=8, 11×8=88; brute_paren_values max=88, 4 farklı değer; soldan-sağa=38 brute kümesinde.

27.8 7. Negatif Sayılar: Min/Max Genişletmesi

Çalışılan Örnek — neden min de gerek. Sayılar negatif olabilirse, “maksimize için iki yanı maksimize et” çöker: iki negatif sayının çarpımı pozitif büyük olur. Örn. \(7 + (-4) \times 3 + (-5)\).

“when we take a product of two negative numbers, we get a positive number.” — Demaine, 34:50

Çözüm: subproblem expansion — hem min hem max sakla. S: \(x(i, j, \mathrm{opt})\), \(\mathrm{opt} \in \{\min, \max\} = a[i..j)\) alt-ifadesinin opt değeri.

“If I can solve max and min, I’ll know the entire range that I could get.” — Demaine, 35:38

Şekil 27.6 bu işaret-çevirme mantığını motor üzerinde gösterir: kazanan ağaç \((7 + ((-4) \times (3 + (-5)))) = 15\). Kritik adım, sağ alt-ifade \((3 + (-5)) = -2\)’nin minimize edilmesidir; çünkü \((-4) \times (-2) = +8\) büyük pozitif verir ve \(7 + 8 = 15\). “İki yanı da maksimize et” stratejisi burada çöker — onun yerine her substring için \([\min, \max]\) çifti (aralık aritmetiği) saklanır, çarpımda dört kombinasyon denenir.

Şekil 27.6: Negatif sayılar: min/max genişletmesi (Demaine L17 §7-8, 34:50). Kazanan ağaç (7 + ((−4) × (3 + (−5)))) = 15: kök +, sol yaprak 7, sağ alt-ağaç × (‘işaret çevirme’, amber, (−4)·(−2) = +8), onun sağı + ‘min’ rozetli ((3+(−5)) = −2 MİNİMİZE edildi). KRİTİK SEZGİ: max’ı büyütmek için sağ alt-ifadeyi minimize et çünkü negatif × negatif = pozitif büyük; ‘7 + 8 = 15’. Sağ kutu ‘Neden HEM min HEM max?’: iki yanı da maksimize ÇÖKER (Demaine 34:50), pozitif büyük için EN KÜÇÜK (en negatif) çarpan gerekir → her substring için HEM min HEM max sakla (×2 expansion), çarpımda 4 kombinasyon (min·min, min·max, max·min, max·max). Alt not: aralık aritmetiği [min, max] çifti substring’in TÜM ulaşılabilir değerlerini sınırlar. Veri MOTORDAN (assert): build_paren_negative_example == ([7,−4,3,−5],[+,*,+]); paren_reconstruct == (‘(7 + ((-4) × (3 + (-5))))’, 15); xmin[(2,4)] == −2; (−4)·(−2) = 8; 7+8 = 15; choice[(0,4,max)]=(1,min,max); choice[(1,4,max)]=(2,min,min); brute_paren_values max=15.

27.9 8. Parantezleme Recurrence ve O(n³)

R: kök \(k\)’yı + sol/sağ için \(\mathrm{opt}_L, \mathrm{opt}_R\)’yi kaba kuvvetle dene:

\[x(i, j, \mathrm{opt}) = \mathrm{opt} \text{ over } \{\, x(i, k, \mathrm{opt}_L) \star_k x(k, j, \mathrm{opt}_R) : i < k < j,\; \mathrm{opt}_L, \mathrm{opt}_R \in \{\min, \max\} \,\}\]

(Min/max için \(4\) kombinasyon — çarpımda işaretler karışık, hepsini dene; toplamda yalnız min-min/max-max gerekir.) T: \(j - i\) artan (substring). B: \(x(i, i+1, \mathrm{opt}) = a_i\). O: \(x(0, n, \max)\). Süre: \(n^2\) substring \(\times\, 2\) (opt) \(\times\, O(n)\) (\(k\)) \(= O(n^3)\). (\(4^n\) parantezlemeyi polinomda tarıyoruz — subproblem expansion sayesinde.)

Bu, Şekil 27.5 ve Şekil 27.6’in formel özetidir: kökü tahmin etmek substring alt problemlerini doğurur (\(O(n^2)\) tane), her birinde \(\min/\max\) ikilemesi (\(\times 2\)) ve \(k\) taraması (\(O(n)\)) vardır.

27.10 9. Piyano Parmaklama: State = Parmak

Problem. Nota dizisi \(t_0 \ldots t_{n-1}\), \(F\) parmak. Geçiş zorluğu \(d(t, f, t', f')\) (notayı \(t\)’yi \(f\) parmağıyla, sonra \(t'\)’yü \(f'\) ile çalmanın zorluğu). Toplam zorluğu minimize edip her notaya parmak ata.

Çalışılan Örnek — state expansion. Naif suffix yetmez: \(d\) dört parametreli, “şu anki parmağı” bilmeden iki nota arası zorluğu hesaplayamayız. Çözüm: alt problemi başlangıç parmağıyla kısıtla.

S: \(x(i, f) = t_i\)’yi \(f\) parmağıyla başlayarak sonek \(t_i \ldots t_{n-1}\)’i çalmanın min toplam zorluğu (alt problem \(\times F\) genişletmesi). R: bir sonraki parmak \(f'\)’yü tahmin et:

\[x(i, f) = \min \text{ over } f' \;\{\, x(i+1, f') + d(t_i, f, t_{i+1}, f') \,\}\]

O: \(\min_f x(0, f)\). Süre: \(n \cdot F\) alt problem \(\times\, O(F) = O(n \cdot F^2)\) (\(F\) sabit → doğrusal).

Şekil 27.7 örneği motor üzerinde çözer: \(6\) notalık melodi \([60, 64, 62, 67, 65, 60]\), \(F = 5\). Min toplam zorluk \(6\), optimal atama \([0, 2, 0, 4, 2, 0]\) (\(0\)-indeksli; \(1\)-indeksli gösterimde \(1./3./1./5./3./1.\) parmak), \(F^n\) kaba kuvvet de \(6\) verir. Alt panel \(x(i, f)\) tablosunu (\(6 \times 5\)) ve kazanan zincir oklarını gösterir. Bu örnek sentetik bir zorluk fonksiyonu kullanır (default_difficulty $= | - | + $ ters-yön cezası \(2\)); dersin gerçek \(d\)’si soyuttur — buradaki amaç state-genişletmesini somutlaştırmaktır, gerçek parmaklama tavsiyesi değil.

Şekil 27.7: Piyano parmaklama: state = parmak DP (Demaine L17 §9 İMZA, 1:03:09). ÜST panel: 6 nota zaman-çizgisi (y = perde 60-67) + seçilen parmak rozetleri (motor assign’dan, 0-indeksli +1 gösterim, yani 1./3./1./5./3./1. parmak) + ardışık geçiş maliyetleri d (sentetik default_difficulty), Σd = 2+0+1+0+3 = 6. ALT panel: x(i,f) tablosu (6 nota × 5 parmak) motor değerleriyle; kazanan hücre zinciri amber oklar; O = min_f x(0,f) = 6 işareti; recurrence kutusu x(i,f) = min_{f₂} [x(i+1,f₂) + d(tᵢ,f,tᵢ₊₁,f₂)], taban x(n−1,f)=0; O(n·F²) rozeti (state = parmak ×F genişletme); Demaine 1:03:09 ‘state sayısı küçükse alt problemi state ile ÇARP’. NOT: d SENTETİK örnek-fonksiyon (dersin d’si soyut). Veri MOTORDAN (assert): build_piano_example == ([60,64,62,67,65,60], 5); piano_fingering → (6, [0,2,0,4,2,0]); brute_fingering == 6; geçiş maliyetleri trans == [2,0,1,0,3], Σ=6; tablo satırları motordan birebir.

27.11 10. Genelleme: Çoklu Nota, Gitar

State’i istediğin kadar zenginleştirebilirsin — yeter ki state sayısı küçük olsun.

“with subproblem expansion, I can capture almost any aspect of a problem that I want.” — Demaine, 1:03:03

Aynı anda çoklu nota → \(t^F\) state ($t = $ anlık maks nota); gitar → ayrıca “hangi tel” seçimi. Her durumda: state’i alt problem koordinatına ekle, geçişleri \(d\) ile yakala.

“As long as the number of states… is small, I can just multiply the number of subproblems by that state.” — Demaine, 1:03:09

(Bu, çizge çarpımıyla da yapılabilir ama DP metodik bir yol verir.) Şekil 27.7’in tek parmaklı state’i bu genelin en sade hâlidir: \(F\) küçük olduğundan \(\times F\) genişletme doğrusal kalır; çoklu nota/gitar eklenince state çarpan büyür ama yine polinom kaldığı sürece DP çalışır.

27.12 Bu Dersin Özeti

  1. Subproblem expansion \(=\) alt probleme kısıt/koordinat ekleyip “state” hatırlamak.
  2. Bellman-Ford DP: \(\delta_k\) (en fazla \(k\) kenar) kısıtı → çevrimliyi çevrimsize çevirir; \(O(V \cdot E)\).
  3. Floyd-Warshall: $d(u,v,k) = $ yalnız ilk \(k\) düğüm; min iki terim → \(O(V^3)\) (dense’te iyi).
  4. Floyd-Warshall vs Johnson: dense → FW (basit); sparse → Johnson (hızlı).
  5. Parantezleme: kökü (son işlem) tahmin et → substring; negatif için min+max; \(O(n^3)\).
  6. Piyano parmaklama: state = başlangıç parmağı; \(\times F\) genişletme; \(O(n \cdot F^2)\).
  7. Genel ilke: küçük state’i alt problem koordinatına ekle, geçişleri kaba kuvvetle tara.
ÖnemliTek Bir Cümle

Subproblem expansion, alt probleme bir koordinat ekleyerek geçmişi/state’i hatırlatır: Floyd-Warshall “ilk \(k\) düğümü kullan” (\(O(V^3)\)), parantezleme “son işlem hangisi?” (min+max, \(O(n^3)\)), parmaklama “hangi parmak” (\(O(n \cdot F^2)\)) — küçük state’i çoğalt, geçişleri tara.

27.13 Kontrol Soruları

Cevap: $d(u, v, k) = $ “\(u \to v\) en kısa yol, yalnız \(\{u, v, 1 \ldots k\}\) düğümlerini ara-düğüm olarak kullanarak”. \(k\). düğümü eklerken yol ya \(k\)’dan geçmez (\(= d(u, v, k-1)\)) ya da geçer (\(= d(u, k, k-1) + d(k, v, k-1)\), çünkü basit yolda \(k\) bir kez kullanılır ve iki parça da yalnız ilk \(k-1\) düğümü kullanır). Bu iki olasılık tüm durumları kapsar → min iki terimli\(O(1)\) özyineleme-dışı iş. \(V^3\) alt problem \(\times\, O(1) = O(V^3)\). (Bellman-Ford’da “tüm gelen kenarlar üzerinde döngü” \(E\) terimi getirirdi; “ilk \(k\) düğüm” kısıtı bunu \(V\)’ye çevirir.)

Cevap: Floyd-Warshall her zaman \(O(V^3)\); Johnson \(O(V^2 \log V + V \cdot E)\). Dense çizgede (\(E \sim V^2\)) ikisi de \(\sim V^3\) ama Floyd-Warshall çok daha basit (5 satır) — onu tercih et (veya çizge küçükse). Seyrek çizgede (\(E \sim V\)) Johnson \(V^2 \log V\)’ye iner, Floyd-Warshall hâlâ \(V^3\) harcar → Johnson çok daha iyi. Kural: dense/küçük biliyorsan FW; seyrek/karışıksa Johnson (seyreklikten kazanır).

Cevap: İfade bir ağaçtır; “ilk işlem” karmaşık (ortada çarpım yapınca üç parça kalır) ama kök = son işlem kolayca tahmin edilir — kökü seçmek soldaki ve sağdaki alt-ifadeleri (substring’ler) doğal ayırır. Negatif sayılar için “maksimize \(=\) iki yanı maksimize” çöker: iki büyük negatif sayının çarpımı büyük pozitif olur. Yani bazen alt-ifadeyi minimize etmek (çok negatif yapmak) genel maksimumu artırır. Çözüm: her substring için hem min hem max sakla (subproblem expansion \(\times 2\)); çarpımda dört min/max kombinasyonunu dene.

Cevap: Zorluk fonksiyonu \(d(t, f, t', f')\) dört parametreli — iki nota arası geçişin zorluğu, hem şu anki parmağa (\(f\)) hem sonraki parmağa (\(f'\)) bağlı. Naif $x(i) = $ “sonek \(t_i \ldots\)’i en az zorlukla çal” tanımında, recurse ederken şu anki parmağı bilmediğimizden \(d\)’yi hesaplayamayız. Çözüm: alt problemi başlangıç parmağıyla kısıtla — $x(i, f) = $ “\(t_i\)’yi \(f\) ile başlayarak…”. Artık \(f\) bilinir; sonraki parmak \(f'\)’yü kaba kuvvetle dener, \(d(t_i, f, t_{i+1}, f')\)’yi hesaplayabiliriz. Alt problem sayısı \(\times F\) (sabit) → \(O(n \cdot F^2)\), \(F\) sabitse doğrusal.

27.14 Egzersizler

Egzersiz 1. Floyd-Warshall’ı küçük bir ağırlıklı çizgede elle çalıştır: \(d(u,v,k)\) tablosunu \(k = 0 \ldots V\) için doldur.

Egzersiz 2. Floyd-Warshall’ı Python’da yaz (üçlü iç içe döngü); \(O(V^3)\) olduğunu ve dense’te \(V \cdot E\)’ye denk geldiğini göster.

Egzersiz 3. Aritmetik parantezlemeyi \(7 + (-4) \times 3 + (-5)\) üzerinde \(x(i,j,\min/\max)\) tablosuyla elle çöz; en büyük sonucu bul.

Egzersiz 4. Parantezleme recurrence’ında neden min/max’in \(4\) kombinasyonunu denemenin yeterli olduğunu (aralık aritmetiği) açıkla.

Egzersiz 5. Piyano parmaklamayı iki notalık akorlara genişlet: state’in \(t^F\)’ye çıktığını ve sürenin \(O(n \cdot t^{2F})\) olduğunu göster.

27.15 Sonraki Ders İçin Hazırlık

UyarıSonraki: Ders 27 (L18) — Dinamik Programlama 4 (pseudopolinom, DP FİNALİ)

Ders 27 (L18): Dinamik Programlama 4 (pseudopolinom). Erik Demaine ile, DP serisinin finali: integer alt problemler ve pseudopolinom zaman. Rod cutting ve subset sum örnekleriyle, \(n \cdot T\) gibi sürelerin neden “polinom değil ama yeterince iyi” olduğunu görür, tüm DP tekniklerini diagonal bir bakışla toparlarız. DP ünitesi Ders 24-27 (L16-L18) boyunca sürer ve Ders 30 = Quiz 3 Gözden Geçirme ile özetlenir.

Ders 27 Öncesi Yapılacak:

  • Bu dersin egzersizlerini, özellikle Egzersiz 1 (Floyd-Warshall) ve 3 (parantezleme) çöz.
  • Floyd-Warshall, parantezleme ve parmaklamanın SRTBOT’unu ezberden yaz.
  • Ana cümleyi tekrar oku: “Küçük state’i alt problem koordinatına ekle; geçişleri kaba kuvvetle tara.”

27.16 Anahtar Kavramlar (Cheat Sheet)

Kavram Tanım Sayfada
Subproblem expansion Alt probleme kısıt/koordinat ekle; state hatırla Böl. 1
Bellman-Ford DP \(\delta_k\) (en fazla \(k\) kenar); çevrimli → çevrimsiz; \(O(V \cdot E)\) Böl. 2
Floyd-Warshall $d(u,v,k) = $ ilk \(k\) düğüm; min 2 terim; \(O(V^3)\) Böl. 3-4
FW vs Johnson dense → FW (basit); sparse → Johnson Böl. 5
Parantezleme Kökü (son işlem) tahmin et → substring Böl. 6
Min/max genişletme Negatif çarpım için hem min hem max sakla Böl. 7-8
Parmaklama \(x(i,f)\); state = parmak; \(O(n \cdot F^2)\) Böl. 9
Genel ilke Küçük state → koordinat; geçişleri tara Böl. 10

27.17 Builder ve OMSCS Bağlantıları

İpucu6 köprü

Bu dersin üç tekniği — vertex-prefix APSP, kök tahmini + min/max, state genişletmesi — ML, derleyici ve sistem mühendisliğindeki çok sayıda araca bağlanır; köprülerin özeti:

  1. Floyd-Warshall → APSP mesafe matrisi, transitif kapanış (reachability), ağ analizi; ağırlıkları boole’e indirgersen aynı üçlü döngü erişilebilirliği verir.
  2. Parantezleme → derleyici ifade optimizasyonu, matris-zincir çarpımı (matrix chain multiplication — hangi sırada çarpınca en az skaler çarpma?), sözdizimi ağacı kurma.
  3. Min/max genişletmearalık aritmetiği; optimizasyonda alt sınır + üst sınır birlikte; soyut-yorumlama (abstract interpretation) ve sağlamlık (robustness) analizleri.
  4. Piyano/gitar parmaklamaMIDI/müzik teknolojisi, dizilim hizalama, durum-makinesi DP’leri (her geçişte küçük bir state taşı).
  5. State = koordinat → durum-augmentasyonu; OMSCS CS 6515’te DP tasarımının kalbi — “bariz alt problem yetmiyorsa hangi koordinatı eklerim?” refleksi (state = koordinat).
  6. DP = Bellman icadı → optimizasyon tarihi; “programming” \(=\) optimizasyon (LP/IP ile aynı kök); “dynamic” \(=\) aşama-aşama yerel kaba kuvvet.

ÖnemliTek bir şey alıp gideceksen

Subproblem expansion, DP’nin en güçlü silahıdır: alt probleme küçük bir koordinat ekleyerek geçmişi/state’i hatırlarsın. Floyd-Warshall “yalnız ilk \(k\) düğümü kullan” der ve \(E\) terimini \(V\)’ye çevirip \(O(V^3)\) verir. Parantezleme “son işlem (kök) hangisi?” diye sorar ve negatifler için hem min hem max saklar. Parmaklama “hangi parmakla başladım” durumunu taşır. Tek formül: küçük state’i alt problem sayısıyla çarp, geçişleri yerel kaba kuvvetle tara — neredeyse her problemin her yönünü yakalarsın.