COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Ağaçlar ve indeksler · 23 / 53

Splay, skip list ve treap

Anla → iz sür → uygula → gerekçelendir

2 dk okuma · uygulama için ayrıca zaman ayır

Splay tree erişilen düğümü zig, zig-zig veya zig-zag rotation'larıyla root'a taşır. Her işlem worst-case doğrusal olabilir; işlem dizisi üzerinde amortize O(log n) sınırı vardır. Yakın zamanda erişilen öğelere uyum sağlaması onu cache ile ilişkilendirir ama LRU eviction politikasını kendiliğinden uygulamaz.

Skip list sıralı bağlı listenin üstüne rastgele yükseklikli hızlı şeritler ekler. En üstten sağa git, hedefi aşacaksa aşağı in. Bağımsız geometrik yüksekliklerle beklenen logarithmic maliyet ve doğrusal alan elde edilir; worst-case garanti değildir. Rastgele seed testlerde tekrar üretilebilirliği sağlar.

Treap anahtarda BST, rastgele priority'de heap invariant'ı tutar. Rotation, split ve merge ile sıralı küme işlemleri yapılır. Priority'lerin anahtardan bağımsız olması beklenen denge için önemlidir. İmplicit treap sıra indeksini subtree size'dan üretir; reverse gibi lazy işlemler için tag yayılımı gerekir. Bu yapıların farklı garantilerini tek “dengeli tree” etiketi altında gizleme.

Adım adım iz sürme

Bir zincirin en alt öğesine erişen splay çok rotation yapabilir; sonraki aynı öğe erişimi root'ta O(1)'+'’dir. Tek işlem ile dizi toplamını ayır.

Maliyet ve varsayımlar

Splay amortize O(log n); skip list/treap beklenen O(log n). Her birinde worst-case O(n) mümkündür.

Ç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 random import Random
rng = Random(42)
def random_height():
    h = 1
    while rng.random() < 0.5: h += 1
    return h
heights = [random_height() for _ in range(8)]
assert all(h >= 1 for h in heights)

KAVRADIĞINI KONTROL ET

Sıra sende

Treap priority'si anahtarın kendisi olursa?

Çözümün mantığını göster

BST ve heap düzenleri aynı yönde zorlanır, zincir oluşabilir. Rastgeleliğin bağımsızlık varsayımı kaybolur.

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.

Pat Morin · Open Data Structures ↗MIT 6.046J · Design and Analysis ↗
İlerlemeden önce alıştırmayı çöz.