COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Ağaçlar ve indeksler · 19 / 53

AVL ve red-black: Dengeyi korumak

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

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

AVL her düğümde sol/sağ height farkını en fazla1 tutar. Ekleme sonrası etkilenen ataları yukarı doğru günceller, LL/RR durumunda tek, LR/RL durumunda çift rotation yapar. Rotation inorder anahtar sırasını değiştirmez; yalnız yükseklik ve bağlantıları düzenler. Silme birden çok atada dengeleme gerektirebilir.

Red-black renk kurallarıyla height'i sınırlar: root siyah, kırmızı düğümün kırmızı çocuğu yok, her düğümden NIL yapraklara siyah sayısı eşit. Bu kurallar height≤2log₂(n+1) sonucunu destekler. NIL kavramı eksik çocukların matematiksel yaprağıdır; uygulama sentinelle veya null kontrolüyle temsil edebilir.

AVL daha sıkı denge sunar; red-black daha gevşek dengeyle güncelleme dinamiklerinde farklı sabit maliyetler verir. “Biri her durumda daha hızlı” denemez. Kütüphane kullanırken kendin yanlış rotation kodu yazmak yerine sözleşme testlerine odaklan; eğitim implementasyonunda parent/root bağlantıları ve augmented alanları unutma.

Adım adım iz sürme

30,20,10 ekle:30 sol-ağırdır.20 pivotlu sağ rotation sonrası root20, çocuklar10 ve30. Sıralı sıra10,20,30 korunur.

Maliyet ve varsayımlar

Dengeli arama/ekleme/silme O(log n). Rotation yerel O(1), yükseklik güncelleme root yolunda O(log 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.

Python 3
# Right rotation in tuple form: (key, left, right).
def rotate_right(y):
    ykey, x, right = y
    if x is None: raise ValueError("missing pivot")
    xkey, left, middle = x
    return (xkey, left, (ykey, middle, right))
assert rotate_right((30,(20,(10,None,None),None),None))[0] == 20

KAVRADIĞINI KONTROL ET

Sıra sende

Rotation sonrası subtree size eski bırakılırsa ne bozulur?

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

Anahtar araması doğru kalabilir ama rank/select yanlış sonuç verir. Denge ve augmentation invariant'ları ayrı doğrulanmalı.

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.