Algoritmalar Kırmızı Siyah Ağaçları Red Black Trees Bahar 2017 Doç. Dr. Suat Özdemir 1
Kırmızı Siyah Ağaç Red Black Trees (RBT) İkili arama ağaçlarının dengeli versiyonudur Ağaç yüksekliği O(lgn) dir Temel işlemler en kötü durumda O(lgn) zaman alır BSTde bu durum O(n) Bahar 2017 Doç. Dr. Suat Özdemir 2
Kırmızı Siyah Ağaç BST ile aynı veri yapısı key, left, right, ve p. Her düğümde ekstra renk bilgisi vardır (1 bit) - red veya black Tüm boş yapraklar siyah kabul edilir NIL olarak gösterilecek color[nil]= black Kökün parent düğümü de NIL. p[root[t]]=nil Bahar 2017 Doç. Dr. Suat Özdemir 3
RBT - Özellikler Her düğüm siyah veya kırmızı Kök düğüm siyah Her yaprak siyah Eğer bir düğüm kırmızı ise her iki çocuğu da siyah Bir düğümden yapraklara giden her yolda eşit sayıda siyah düğüm bulunur Bahar 2017 Doç. Dr. Suat Özdemir 4
RBT - Örnek 26 17 41 30 47 Her düğümün mutlaka iki çocuğu var Yaprak düğümlerin NIL olan çocukları her zaman gösterilmeyebilir 38 50 nil[t] Bahar 2017 Doç. Dr. Suat Özdemir 5
RBT Siyah Yüksekliği Bir x düğümünün yüksekliği h(x)= yapraklara giden en uzun yol üzerindeki kenar sayısı Bir x düğümün siyah yüksekliği bh(x)= x den yaprağa giden yol üzerindeki siyah düğüm sayısı yapraktaki NIL[T] dahil x düğümü hariç RBT nin siyah yüksekliği kök düğümün siyah yüksekliğine eşittir 5. özellik sayesinde garanti edilir Bahar 2017 Doç. Dr. Suat Özdemir 6
RBT Siyah Yüksekliği 26 h=4 bh=2 Bir x düğümünün yüksekliği h(x)= yapraklara giden en uzun yol üzerindeki kenar sayısı Bir x düğümün siyah yüksekliği bh(x)= x den yaprağa giden yol üzerindeki siyah düğüm sayısı yapraktaki NIL[T] dahil x düğümü hariç bh(x) h(x) 2 bh(x) 17 h=1 bh=1 nil[t] 41 h=2 bh=1 h=1 bh=1 h=3 bh=2 30 47 h=1 bh=1 38 50 Bahar 2017 Doç. Dr. Suat Özdemir 7
Lemma RBT Yüksekliği RBT üzerindeki bir x düğümüden yapraklara olan en uzun yol h(x) ise h(x) x düğümünden yapraklara olan en kısa yolun en çok iki katı uzunlukta olabilir. İspat: x den yapraklara herhangi bir yol üzerinde eşit sayıda siyah düğüm vardır x = bh(x) (özellik 5) ve bu her zaman x in en kısa yolu üzerindeki düğüm sayısından s(x) küçük yada eşittir (özellik 1). Ancak bir yol üzerinde peşpeşe gelen kırmızı düğüm olamaz (özellik 4) ve her yol siyah bir düğümle sonlanır (özellik 3), yani h(x) 2 bh(x) dir Bu nedenle h(x) 2 s(x) olur. Bahar 2017 Doç. Dr. Suat Özdemir 8
RBT Yüksekliği Sınırı Lemma: x düğümünün herhangi bir alt ağacında 2 bh(x) 1 kadar içsel düğüm bulunur İspat: Tümevarım Temel durum: x yapraksa h(x) = 0 bh(x) = 0. Altağacı 2 0 1 = 0 düğüme sahiptir. Tümevarım işlemi: h(x) = h > 0 ve bh(x) = b. X in her çocuğunun yüksekliği h - 1 ve siyah-yüksekliği ya b (çocuk kırmızı) yada b - 1 (çocuk siyah). Tümevarım hipotezine göre, her çocuk 2 bh(x) 1 1 içsel düğüme sahip. x in alt ağacı 2 (2 bh(x) 1 1)+1 = 2 bh(x) 1 içsel düğüme sahip. (+1 x in kendisi için) Bahar 2017 Doç. Dr. Suat Özdemir 9
RBT Yüksekliği Sınırı Lemma: x düğümünün herhangi bir alt ağacında 2 bh(x) 1 kadar içsel düğüm bulunur. İspatlandı Lemma: n düğümden oluşan bir RBT nin yüksekliği en çok 2lg(n+1) olabilir İspat: Üstteki lemmaya göre, n 2 bh 1 bh h/2 olduğu için, n 2 h/2 1 Buna göre h 2 lg(n + 1) olur Bahar 2017 Doç. Dr. Suat Özdemir 10
RBT- Temel İşlemler Tüm işlemler O(lgn) zaman içinde tamamlanır Ağacı değiştirmeyecek tüm işlemler BST de olduğu gibi yapılır Silme ve ekleme kolay değildir Neden? Bahar 2017 Doç. Dr. Suat Özdemir 11
RBT- Rotasyonlar x Left-Rotate(T, x) y y Right-Rotate(T, y) x Bahar 2017 Doç. Dr. Suat Özdemir 12
RBT- Rotasyonlar Ağacı dengede tutmak için yapılırlar Girdi: Ağaç ve bir düğüm Pointerları değiştirerek ağaç yapısını değiştirir BST özelliğini bozmaz Sol ve sağ rotasyonlar birbirinin tersidir x Left-Rotate(T, x) y y Right-Rotate(T, y) x Bahar 2017 Doç. Dr. Suat Özdemir 13
Left-Rotate (T, x) 1. y right[x] // Set y. 2. right[x] left[y] //Turn y s left subtree into x s right subtree. 3. if left[y] nil[t ] 4. then p[left[y]] x 5. p[y] p[x] // Link x s parent to y. 6. if p[x] = nil[t ] 7. then root[t ] y x Left-Rotate(T, x) y 8. else if x = left[p[x]] y Right-Rotate(T, y) x 9. then left[p[x]] y 10. else right[p[x]] y 11. left[y] x // Put x on y s left. 12. p[x] y Bahar 2017 Doç. Dr. Suat Özdemir 14
Rotasyon Sol-rotasyon pseudo kodu right[x] nil[t ] Kökün parenti nil[t ] x düğümü üzerinde yapılan sol-rotasyon x düğümünü y düğümünün sol çocuğu ve y düğümünün sol altağacını x düğümünün sağ alt ağacı yapar Sağ-rotasyon bunun tam tersidir Zaman analizi: Sabit sayıda pointer güncellemesi gerekir Sol ve Sağ rotasyon için O(1) Bahar 2017 Doç. Dr. Suat Özdemir 15
Hatırlatma RBT Özellikler Her düğüm siyah veya kırmızı Kök düğüm siyah Her yaprak siyah Eğer bir düğüm kırmızı ise her iki çocuğu da siyah Bir düğümden yapraklara giden her yolda eşit sayıda siyah düğüm bulunur Bahar 2017 Doç. Dr. Suat Özdemir 16
RBT - Ekleme Ekleme RBT özelliğini bozmamalıdır Eklenen düğümün hangi renge boyanmalıdır? Temel işlemler BST-Insert kullanarak x düğümünü T ağacına ekle RB-Insert(x) Eklenen düğümü kırmızı yap Eklenen ağacı tekrar boyama yaparak RBT özelliğini koru RB-Insert-Fixup Bahar 2017 Doç. Dr. Suat Özdemir 17
RBT - Ekleme RB-Insert(T, z) 1. y nil[t] 2. x root[t] 3. while x nil[t] 4. do y x 5. if key[z] < key[x] 6. then x left[x] 7. else x right[x] 8. p[z] y 9. if y = nil[t] 10. then root[t] z 11. else if key[z] < key[y] 12. then left[y] z 13. Bahar 2017 else right[y] z RB-Insert(T, z) Contd. 14. left[z] nil[t] 15. right[z] nil[t] 16. color[z] RED 17. RB-Insert-Fixup (T, z) BST-Insert den farkı nedir? Hangi RBT özellikleri bozulabilir? RB-Insert-Fixup çağırarak ağacı düzelt. Doç. Dr. Suat Özdemir 18
Genel yapı Tüm kodlarda y düğümü p[z] nin kardeşi z nin amcası z sol veya sağ çocuk olabilir p[p[z]] C p[z] y A D z B Bahar 2017 Doç. Dr. Suat Özdemir 19
RBT - Ekleme Problem: Eklemenin olduğu yerde peş peşe gelen kırmızı düğümler oluşabilir Eklenen düğüm kırmızı bir kök olabilir p[z] siyahsa sorun yok Çözüm: Rotasyon yap Üç farklı durum oluşabilir, her durumda yapılacak olan işlem farlılık gösterir Case 1. y kırmızı. Sadece boyama yaparak yukarı çık Case 2. y siyah, z sağ çocuk. p[z] üzerinde sola rotasyon yap Case 3 oluşur Case 3. y siyah, z sol çocuk. p[z] yi siyah yap, p[p[z]] yi kırmızı yap, p[p[z]] üzerinde sağ rotasyon yap. Bahar 2017 Doç. Dr. Suat Özdemir 20
RB-Insert-Fixup(T,z) RB-Insert-Fixup (T, z) 1. while color[p[z]] = RED 2. do if p[z] = left[p[p[z]]] // p[z] sol çocuk 3. then y right[p[p[z]]] // y z nin amcası 4. if color[y] = RED 5. then color[p[z]] BLACK // Case 1 6. color[y] BLACK // Case 1 7. color[p[p[z]]] RED // Case 1 8. z p[p[z]] // Case 1 Bahar 2017 Doç. Dr. Suat Özdemir 21
RB-Insert-Fixup(T,z) RB-Insert-Fixup(T, z) (Contd.) 9. else if z = right[p[z]] // color[y] RED 10. then z p[z] // Case 2 11. LEFT-ROTATE(T, z) // Case 2 12. color[p[z]] BLACK // Case 3 13. color[p[p[z]]] RED // Case 3 14. RIGHT-ROTATE(T, p[p[z]]) // Case 3 15. else (if p[z] = right[p[p[z]]])(same as 10-14 16. with right and left exchanged) 17. color[root[t ]] BLACK Bahar 2017 Doç. Dr. Suat Özdemir 22
Durum 1 y kırmızı p[z] p[p[z]] C y C new z A z B D z burada sağ çocuk Sol çoçuk için aynı işlem geçerli A B D p[p[z]] (z nin dedesi) mutlaka siyah olmalı, z ve p[z] kırmızı. p[z] yi ve y yi siyah yap şimdi z ve p[z] kırmızı değil. Özellik 5 bozulmuş olabilir p[p[z]] yi kırmızı yap Özellik 5 düzeltildi. Sonraki aşamada p[p[z]] yeni z olur. Bahar 2017 Doç. Dr. Suat Özdemir 23
Durum 2- y siyah, z sağ çocuk p[z] C p[z] C A y B y z B z A p[z] üzerinde sol rotasyon, p[z] ve z rolleri değişir şimdi z sol çocuk, ve z ve p[z] nin her ikisi de kırmızı. Durum 3 oluşur. Bahar 2017 Doç. Dr. Suat Özdemir 24
Durum 3 y siyah, z sol çocuk C B p[z] B y A C z A p[z] yi siyah ve p[p[z]] yi kırmızı yap. p[p[z]] üzerinde sağ-rotasyon yap. Özellik 4 garanti edildi.. p[z] şimdi siyah daha fazla iterasyona gerek yok. Bahar 2017 Doç. Dr. Suat Özdemir 25
Analiz RB-Insert için O(lgn) zaman RB-Insert-Fixup çağrıldığında Her iterasyon O(1) O(lgn) seviyede en çok O(lgn) zaman alır Bu nedenle ekleme işlemi O(lgn) zaman alır Bahar 2017 Doç. Dr. Suat Özdemir 26
RBT - Silme Ekleme gibi tüm RBT özellikler korunmalı Silinen renge bağlı Kırmızı - OK. Neden? Siyah? İşlemler BST silme işlemi yap RBT özelliklerini tekrar kazandır Bahar 2017 Doç. Dr. Suat Özdemir 27
RBT - Silme RB-Delete(T, z) 1. if left[z] = nil[t] or right[z] = nil[t] 2. then y z 3. else y TREE-SUCCESSOR(z) 4. if left[y] = nil[t ] 5. then x left[y] 6. else x right[y] 7. p[x] p[y] // Do this, even if x is nil[t] Bahar 2017 Doç. Dr. Suat Özdemir 28
RBT - Silme RB-Delete (T, z) (Contd.) 8. if p[y] = nil[t ] 9. then root[t ] x 10. else if y = left[p[y]] 11. then left[p[y]] x 12. else right[p[y]] x 13. if y = z 14. then key[z] key[y] 15. copy y s satellite data into z 16. if color[y] = BLACK 17. then RB-Delete-Fixup(T, x) 18. return y Bahar 2017 Doç. Dr. Suat Özdemir 29
Hangi özellikler bozulabilir? y aslında silinen düğüm X düğümü y düğümün çocuğu Silme işleminden sonra x in parenti y nin silemden önceki parenti Eğer y siyahsa, aşağıdaki özellikler bozulabilir Özellik 1. OK Özellik 2. Eğer y kök ve x kırmızı ise, kök kırmızı olabilir Özellik 3. OK Özellik 4. p[y] ve x in her ikiside kırmızı olabilir. Özellik 5. y nin olduğu bir yol 1 siyah düğüm eksik olabilir Bahar 2017 Doç. Dr. Suat Özdemir 30
RBT - Silme y nin olduğu bir yol 1 siyah düğüm eksik x i extra siyah yaparak x in olduğu yollara 1 siyah düğüm sayısı ekle Özellik 5 şimdi tamam, ancak Özellik 1 bozuldu. x şimdi extra siyah Düğümler sadece siyah veya kırmızı olabilir Extra siyah farklı bir renk RB-Delete-Fixup çağrılarak çözülür Bahar 2017 Doç. Dr. Suat Özdemir 31
RB-Delete-Fixup RB-Delete-Fixup(T, x) 1. while x root[t ] and color[x] = BLACK 2. do if x = left[p[x]] 3. then w right[p[x]] 4. if color[w] = RED 5. then color[w] BLACK // Case 1 6. color[p[x]] RED // Case 1 7. LEFT-ROTATE(T, p[x]) // Case 1 8. w right[p[x]] // Case 1 Bahar 2017 Doç. Dr. Suat Özdemir 32
RB-Delete-Fixup(T, x) (Contd.) /* x is still left[p[x]] */ 9. if color[left[w]] = BLACK and color[right[w]] = BLACK 10. then color[w] RED // Case 2 11. x p[x] // Case 2 12. else if color[right[w]] = BLACK 13. then color[left[w]] BLACK // Case 3 14. color[w] RED // Case 3 15. RIGHT-ROTATE(T,w) // Case 3 16. w right[p[x]] // Case 3 17. color[w] color[p[x]] // Case 4 18. color[p[x]] BLACK // Case 4 19. color[right[w]] BLACK // Case 4 20. LEFT-ROTATE(T, p[x]) // Case 4 21. x root[t ] // Case 4 22. else (same as then clause with right and left exchanged) 23. color[x] BLACK Bahar 2017 Doç. Dr. Suat Özdemir 33
RBT- Silme Amaç: Extra siyah düğüm x kırmızı bir düğümü gösterene kadar yukarı çık ve x i normal siyah bir düğüm yap x eğer kökü gösterirse, sadece normal siyah yap Diğer durumlarda boyama ve rotasyon yaparak amaca ulaşmaya çalış. while döngüsünde: x her zaman kök olmayan extra siyah düğüm. w x in kardeşi. w nil[t ] olamaz. (p[x] de özellik 5 bozulurdu) 4 durum var Bahar 2017 Doç. Dr. Suat Özdemir 34
Case 1 w is red p[x] x A B D w B D E C E w must have black children. Make w black and p[x] red (because w is red p[x] couldn t have been red). Then left rotate on p[x]. New sibling of x was a child of w before rotation must be black. Go immediately to case 2, 3, or 4. Bahar 2017 Doç. Dr. Suat Özdemir 35 x A new w C
Case 2 w is black, both w s children are black x p[x] B c w new x B c A D A D C E C E Take 1 black off x ( singly black) and off w ( red). Move that black to p[x]. Do the next iteration with p[x] as the new x. If entered this case from case 1, then p[x] was red new x is red & black color attribute of new x is RED loop terminates. Then new x is made black in the last line. Bahar 2017 Doç. Dr. Suat Özdemir 36
Case 3 w is black, w s left child is red, w s right child is black x A B D w x A B c C new w C E D E Make w red and w s left child black. Then right rotate on w. New sibling w of x is black with a red right child case 4. Bahar 2017 Doç. Dr. Suat Özdemir 37
Case 4 w is black, w s right child is red x A B D w B D E C c E x A C Make w be p[x] s color. Make p[x] black and w s right child black. Then left rotate on p[x]. Remove the extra black on x ( x is now singly black) without violating any red-black properties. All done. Setting x to root causes the loop to terminate. Bahar 2017 Doç. Dr. Suat Özdemir 38
Analiz RB-Delete için O(lgn) zaman RB-Delete-Fixup çağrıldığında Sadece Case 2 de ağaç yüksekliği kadar iterasyon olur O(lgn) iterasyon Cases 1, 3, ve 4 sadece 1 rotasyon 3 Toplamda O(lgn) zaman alır. Bahar 2017 Doç. Dr. Suat Özdemir 39