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ırAVL 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.
# 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] == 20KAVRADIĞ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
- Ö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.006 · Introduction to Algorithms ↗Pat Morin · Open Data Structures ↗