Problem, matematik ve analiz · 05 / 53
Amortize, beklenen ve deneysel maliyet
Anla → iz sür → uygula → gerekçelendir
3 dk okuma · uygulama için ayrıca zaman ayırAmortize analiz, bir işlem dizisinin toplam maliyetini işlemlere dağıtır; olasılık gerektirmez. Kapasitesini iki katına çıkaran dinamik dizide bazı append işlemleri n elemanı kopyalar fakat n eklemenin toplam kopyalama işi geometrik toplamla O(n) olur. Bir append'in en kötü maliyeti O(n), amortize maliyeti O(1)'dir.
Aggregate yöntem toplamı doğrudan sayar; accounting ucuz işlemlere kredi yükler; potential yöntemi veri yapısında depolanmış işi Φ ile temsil eder. Beklenen analiz ise bir olasılık dağılımı kullanır: rastgele pivotlu quicksort'un beklentisi algoritmanın rastgeleliğine göredir, “tipik kullanıcı verisi” iddiası değildir.
Benchmark'ta girdi dağılımı, warm-up, tekrar sayısı, median/p95, bellek ve çalışma ortamı kaydedilir. Aynı asimptotik sınıfta cache davranışı ve sabitler belirleyici olabilir. Amortize O(1), gecikme hassas bir serviste her isteğin kısa süreceği garantisini vermez; tek büyük yeniden boyutlandırma gecikmesi önemlidir.
Dinamik dizide potansiyel nasıl birikir?
Kapasite dolunca ikiye katlanan dizi düşün. n eklemede taşınan eski elemanlar 1+2+4+… biçimindedir. Son terim n'den küçüktür ve geometrik toplam 2n'den küçüktür. Yeni elemanların n yazımıyla toplam doğrusal kalır. Tek pahalı append Θ(n) olabilir; bütün sequence başına ortalama amortize Θ(1)'dir. Bu, rastgele input ortalaması değildir.
Accounting yönteminde her append'e birkaç kredi yükle: bir kredi mevcut yazmaya, kalan krediler ilerideki resize'a ayrılır. Potential yöntemi aynı fikri Φ(state) ile formelleştirir. Amortize maliyet gerçek maliyet + ΔΦ'dir. Potansiyelin başlangıçta kontrollü ve bütün sequence boyunca aşağıdan sınırlı olması gerekir.
Silmede kapasite yarıya küçültülürse eşik önemlidir. Yarı dolulukta büyüt/küçült yapmak peş peşe insert/delete ile thrashing oluşturabilir. Örneğin büyütme doluyken, küçültme dörtte bir doluyken yapılır; arada yeniden maliyet ödeyecek kadar ucuz işlem birikir. Bu hysteresis tasarımını latency hedefiyle de değerlendir: amortize guarantee tek bir kullanıcı isteğinin hızlı olacağını garanti etmez.
Temel: 8 ekleme için resize anlarını yaz. Orta: 1.5 büyüme factor'ında geometrik toplamı çıkar. İleri: Her işlem için sıkı gecikme gerekiyorsa incremental migration tasarla; eski/yeni buffer birlikteyken lookup invariantını belirt.
Adım adım iz sürme
Kapasiteler 1,2,4,8,16: 16 ekleme için 1+2+4+8=15 eski öğe kopyalanır. Her işlem 16 kopya yapmaz.
Maliyet ve varsayımlar
İki kat büyüme: n append toplam O(n). Sürekli +1 kapasite: toplam Θ(n²).
Ç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.
def copied_items(n):
capacity, size, copied = 1, 0, 0
for _ in range(n):
if size == capacity:
copied += size
capacity *= 2
size += 1
return copied
assert copied_items(16) == 15KAVRADIĞINI KONTROL ET
Sıra sende
Beklenen O(1) hashing ile amortize O(1) append aynı gerekçe mi?
Çözümün mantığını göster
Hayır. Hashing dağılım/hash ailesi ve load factor varsayımlarına dayanabilir; append işlem dizisi üzerindeki deterministik toplam sınırıyla açıklanır.
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.046J · Design and Analysis ↗Pat Morin · Open Data Structures ↗