COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Ağaçlar ve indeksler · 18 / 53

Binary tree, BST ve sıra istatistikleri

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

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

Binary tree her düğüme en fazla iki çocuk verir; BST bunun üstüne bir arama düzeni ekler. Sol alt ağaç küçük, sağ büyük anahtarlardan oluşur; tekrarların nasıl tutulacağı sözleşmedir. Sadece doğrudan çocukları kontrol etmek bütün BST invariant'ını doğrulamaz: derindeki düğüm üst atanın sınırını da sağlamalıdır.

Arama root'tan bir yola iner; maliyet height h'ye bağlıdır. Sıralı ekleme ağacı zincire çevirebilir ve h=n olur. Inorder traversal BST'de anahtarları sıralı verir. Silme yapraktan kolaydır; tek çocukta bağlantı geçer, iki çocukta successor/predecessor ile değişim ve asıl düğümün silinmesi gerekir.

Subtree size alanı ekleyerek rank ve select işlemleri yapılabilir. Her rotation/ekleme/silmede bu metadata güncellenmelidir. Augmentation sadece alan eklemek değil, güncelleme invariant'ını korumaktır. Denge olmadan sıra istatistiği de O(n)'e düşebilir.

Adım adım iz sürme

10 kökü, sol5, 5'+'’in sağında12: yerel5<12 koşulu doğru ama12,10'+'’un solunda olduğu için BST yanlıştır.

Maliyet ve varsayımlar

Arama/ekleme/silme O(h): dengede O(log n), zincirde O(n). Traversal Θ(n), stack O(h).

Ç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
def valid_bst(node, lo=float("-inf"), hi=float("inf")):
    if node is None: return True
    key, left, right = node
    return (lo < key < hi and valid_bst(left, lo, key)
            and valid_bst(right, key, hi))
assert not valid_bst((10,(5,None,(12,None,None)),None))

KAVRADIĞINI KONTROL ET

Sıra sende

Tekrarlı anahtarlar varsa bu validation yeterli mi?

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

Hayır; örnek strict BST sözleşmesidir. Count alanı ya da eşitliğe izin veren belirli taraf kuralı seçilmeli ve bütün işlemler buna uymalı.

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 ↗Pat Morin · Open Data Structures ↗
İlerlemeden önce alıştırmayı çöz.