COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

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ır

LCS'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.

Python 3
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]) == 1

KAVRADIĞ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

  1. Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
  2. Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
  3. 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 ↗
İlerlemeden önce alıştırmayı çöz.