Algoritma tasarımı · 36 / 53
LCS, LIS, knapsack ve subset DP
Anla → iz sür → uygula → gerekçelendir
2 dk okuma · uygulama için ayrıca zaman ayırLCS'de dp[i][j], iki prefix'in en uzun ortak alt dizisinin boyudur. Son karakter eşitse diagonal+1; değilse üst/sol maksimumu. Subsequence bitişik olmak zorunda değildir; substring başka problemdir. Edit distance insert/delete/replace maliyetlerini son karara göre kurar.
0/1 knapsack tek boyuta sıkıştırıldığında capacity ters yönde gezilir; ileri gezmek aynı öğeyi birçok kez kullanıp unbounded varyanta dönüşebilir. LIS için tails[i], i+1 uzunluktaki artan alt dizinin mümkün en küçük son değeridir. tails listesi gerçek LIS olmak zorunda değildir; parent indeksleri reconstruction sağlar.
Subset DP state'i bir bitmask ve son düğümle tanımlar. TSP dp[mask][last] her visited subset için optimum maliyeti tutar. Tree DP çocukları birleştirir; DAG DP topological sıra kullanır. DP optimizasyonları (divide-and-conquer optimization, Knuth, convex hull trick) belirli monotonluk/convexity koşulları ister; her recurrence'a uygulanamaz.
Adım adım iz sürme
[3,1,2,5,4] tails dönüşümü [3]→[1]→[1,2]→[1,2,5]→[1,2,4]; length3. Strict artış için lower_bound kullan.
Maliyet ve varsayımlar
LCS O(nm); LIS O(n log n); 0/1 knapsack O(nW); subset TSP O(n²2ⁿ).
Çalıştırılabilir örnek
Python 3 ile çalıştır. Assert küçük bir örneği denetler; genel doğruluk ispatı değildir. Bazı ileri örnekler özellikle küçük model veya referans oracle'dır; tam üretim uygulaması değildir.
from bisect import bisect_left
def lis_length(a):
tails=[]
for x in a:
i=bisect_left(tails,x)
if i == len(tails): tails.append(x)
else: tails[i]=x
return len(tails)
assert lis_length([3,1,2,5,4]) == 3
assert lis_length([2,2,2]) == 1KAVRADIĞINI KONTROL ET
Sıra sende
Non-decreasing LIS için bisect_left yerine?
Çözümün mantığını göster
bisect_right eşit değerleri sağa ekler. Strict/non-strict hedefi arama sınırı politikasını değiştirir.
Bir adım ileri
- Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
- Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
- Belirtilen modelde maliyeti çıkar; farklı girdi büyüklüklerini ölç ve farkları gerekçelendir.
Temel kaynaklar ve ders notları
Bu eğitimde özgün anlatım kullanıldı; aşağıdaki kaynaklar ispatlar ve ileri okumalar sunar. Bağlantılar daha geniş ders modülünü kapsayabilir.
MIT 6.006 · Introduction to Algorithms ↗MIT 6.046J · Design and Analysis ↗