Ağaçlar ve indeksler · 24 / 53
Persistent yapılar ve augmentation
Anla → iz sür → uygula → gerekçelendir
2 dk okuma · uygulama için ayrıca zaman ayırPersistent yapı güncelleme sonrası eski sürüme erişimi korur. Path copying değişen kök-yaprak yolunu kopyalar, değişmeyen alt ağaçları paylaşır. Bu deep copy değildir; immutable düğümler sayesinde paylaşım güvenlidir. Partial persistence eski sürümleri yalnız okumayı, full persistence eski sürümden yeni dal oluşturmayı destekler.
Persistent segment tree her point update'te O(log n) yeni düğüm üretir. Kökler listesi snapshot temsilidir. İki sürüm arasındaki farkla tarihsel prefix/range sorguları kurulabilir. Memory reclamation için sürüm yaşam süresini takip et; “immutable” olması sınırsız bellek kullanımı sorununu çözmez.
Augmentation'da subtree size, sum, maximum endpoint gibi yerel metadata tutulur. Interval tree overlap aramasında max endpoint ile dalları budar. Recompute yalnız çocuklardan O(1) hesaplanabiliyorsa rotasyon sonrası güncelleme ucuzdur. Paylaşılan eski düğümü mutate etmek bütün geçmişi bozabilir; API'de mutable/immutable ayrımı açık olmalıdır.
Adım adım iz sürme
8 yapraklı segment tree'de bir öğe değişimi için root dahil4 düğüm kopyalanır; diğer dallar eski sürümle paylaşılır.
Maliyet ve varsayımlar
Point update O(log n) zaman/yeni alan; q sürüm için O(n+q log n) toplam alan.
Ç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.
# Minimal immutable node; unchanged children may be shared.
from dataclasses import dataclass
@dataclass(frozen=True)
class Tree:
total: int
left: object = None
right: object = None
old = Tree(3, Tree(1), Tree(2))
new = Tree(7, Tree(5), old.right)
assert old.total == 3 and new.right is old.rightKAVRADIĞINI KONTROL ET
Sıra sende
Eski sürümün sağ çocuğunu mutate etmek neden tehlikeli?
Çözümün mantığını göster
Aynı düğüm yeni sürümde de kullanılır; iki sürüm birlikte değişir. Immutable düğüm veya gerçek copy-on-write gerekir.
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 ↗