COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

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

Persistent 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.

Python 3
# 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.right

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

  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.046J · Design and Analysis ↗
İlerlemeden önce alıştırmayı çöz.