AVL ve Kırmızı siyah ağaçların her ikisi de düğümlerdeki Kırmızı ve siyah renk dışında kendi kendini dengeliyor. AVL ağaçları yerine kırmızı siyah ağaçları seçmenin ana nedeni nedir? Kırmızı siyah ağaçların uygulamaları nelerdir?
AVL ve Kırmızı siyah ağaçların her ikisi de düğümlerdeki Kırmızı ve siyah renk dışında kendi kendini dengeliyor. AVL ağaçları yerine kırmızı siyah ağaçları seçmenin ana nedeni nedir? Kırmızı siyah ağaçların uygulamaları nelerdir?
Yanıtlar:
AVL ağaçları yerine kırmızı siyah ağaçları seçmenin ana nedeni nedir?
Hem kırmızı-siyah ağaçlar hem de AVL ağaçları en sık kullanılan dengeli ikili arama ağaçlarıdır ve garantili olarak ekleme, silme ve aramayı desteklerler O(logN) time
. Bununla birlikte, ikisi arasında aşağıdaki karşılaştırma noktaları vardır:
O(N)
fazladan yer kaplar. Ancak, ağaca eklenecek anahtarların her zaman sıfırdan büyük olacağını bilirsek, kırmızı-siyah bir ağacın renk bilgisini saklamak için anahtarların işaret bitini kullanabiliriz. Böylelikle bu gibi durumlarda kırmızı-siyah ağaç fazladan yer kaplamaz.Kırmızı siyah ağacın uygulaması nedir?
Kırmızı-siyah ağaçlar daha genel amaçlıdır. Ekleme, kaldırma ve arama işlemlerinde nispeten iyi performans gösterirler, ancak AVL ağaçlarının daha yavaş ekleme / çıkarma pahasına daha hızlı aramaları vardır. Kırmızı-siyah ağaç şu şekilde kullanılır:
java.util.TreeMap
,java.util.TreeSet
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
doğru değil.
std:: map
ve arkadaşlar herhangi bir belirli yapıyı kullanır. Libstdc ++ ve Dinkumware en azından kırmızı-siyah ağaçları kullansa da, bu uygulamaya bırakılmıştır ve pratikte haklısınız gibi görünüyor.
Bu makaleyi okumayı deneyin
Farklılıklar, benzerlikler, performans vb. Hakkında bazı iyi bilgiler sunar.
İşte makaleden bir alıntı:
RB-Ağaçları, AVL ağaçlarının yanı sıra kendi kendini dengeliyor. Her ikisi de O (log n) arama ve ekleme performansı sağlar.
Aradaki fark, RB-Trees'in uç işlemi başına O (1) dönüşü garanti etmesidir. Gerçek uygulamalardaki performansın maliyeti aslında budur.
Basitleştirilmiş RB-Trees, dinamik düğüm yapılarının yükünü taşımadan kavramsal olarak 2-3 ağaç olmaktan bu avantajı elde eder. Fiziksel olarak RB-Ağaçlar ikili ağaçlar olarak uygulanır, kırmızı / siyah bayraklar 2-3 davranışı simüle eder
Benim anlayışıma göre, AVL ağaçları ve RB ağaçları performans açısından çok uzakta değiller. Bir RB ağacı, basitçe bir B-ağacının bir çeşididir ve dengeleme, bir AVL ağacından farklı bir şekilde uygulanır.
Performanstaki farklılıklar hakkındaki anlayışımız yıllar içinde gelişti ve şimdi AVL yerine kırmızı-siyah ağaçları kullanmanın ana nedeni, belki de CLRS kapsamında yer almadıkları için biraz daha az yaygın oldukları için iyi bir AVL uygulamasına erişememek olurdu.
Her iki ağaç da artık sıra dengeli ağaç türleri olarak kabul ediliyor, ancak kırmızı-siyah ağaçlar gerçek dünya testlerinde sürekli olarak yaklaşık% 20 oranında daha yavaş . Veya sıralı veri eklendiğinde % 30-40 daha yavaş .
Bu nedenle kırmızı-siyah ağaçları inceleyen, ancak AVL ağaçları olmayan insanlar kırmızı-siyah ağaçları seçme eğilimindedir. Kırmızı-siyah ağaçların birincil kullanımları , onlar için Wikipedia girişinde ayrıntılı olarak açıklanmıştır .
Buradaki diğer cevaplar, RB ve AVL ağaçlarının artılarını ve eksilerini iyi özetliyor, ancak bu farkı özellikle ilginç buldum:
AVL ağaçları sabit amorti edilmiş güncelleme maliyetini desteklemez [ancak kırmızı-siyah ağaçlar destekler]
Kaynak: Mehlhorn & Sanders (2008) (bölüm 7.4)
RB ve AVL ağaçları hem garanti ederken Yani, O (log (N)) araması, ekin ve silme, AVL / RB mülklerinin restorasyonundan sorumlu en kötü durum zaman sonra bir düğüm ekleme veya silme O yapılabilir (1) zaman amorti için kırmızı-siyah ağaçlar.
Programcılar genellikle dinamik olarak bellek ayırmayı sevmezler. Avl ağacının sorunu, "n" elemanlar için ağacın yüksekliğini saklamak için en az log2 (log2 (n)) ... (yükseklik-> log2 (n)) bitlerine ihtiyaç duymanızdır! Bu nedenle, muazzam verileri işlerken, her bir düğümde yüksekliği depolamak için kaç bit ayırmanız gerektiğinden emin olamazsınız.
Örneğin yüksekliği depolamak için 4 baytlık int (32 bit) kullanırsanız. Maksimum yükseklik 2 ^ 32 olabilir ve bu nedenle ağaçta saklayabileceğiniz maksimum öğe sayısı 2 ^ (2 ^ 32) - (çok büyük görünüyor ama bu veri çağında sanırım hiçbir şey çok büyük değil). Bu nedenle, bu sınırı aşarsanız, yüksekliği depolamak için dinamik olarak daha fazla alan ayırmanız gerekir.
Bu bana mantıklı gelen, üniversitemdeki bir profesör tarafından önerilen bir cevap! Umarım mantıklıdır.
Düzenlemeler: AVL ağaçları, Kırmızı Siyah Ağaçlara kıyasla daha dengelidir, ancak ekleme ve silme sırasında daha fazla dönüşe neden olabilirler. Dolayısıyla, uygulamanız çok sık ekleme ve silme içeriyorsa, o zaman Kırmızı Siyah ağaçlar tercih edilmelidir. Ekleme ve silme işlemleri daha seyrekse ve arama daha sık çalışıyorsa, AVL ağacı Kırmızı Siyah Ağaç yerine tercih edilmelidir. - Kaynak GEEKSFORGEEKS.ORG
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
Bunu uygulamak için bir AVL ağacındaki herhangi bir düğümün yüksekliğine ihtiyacım yok. Her düğüm için bir bitlik ekstra bilgi alırsınız ( EN BÜYÜK BENİM (en yüksek alt ağaca sahip kardeş)); AV & L tarafından sunulduğu gibi iki ekstra bitin olması geleneksel olduğu kadar daha kullanışlıdır (çocuk sol ve sağ için daha yüksektir)
AVL ağacının yeniden dengelenmesi aşağıdaki özelliği karşılamalıdır. (Wiki Referansı - AVL Ağacı )
Bir AVL ağacında, herhangi bir düğümün iki alt ağacının yükseklikleri en fazla bir farklılık gösterir; herhangi bir zamanda birden fazla farklılık gösterirlerse, bu özelliği eski haline getirmek için yeniden dengeleme yapılır.
Bu, AVL ağacının toplam yüksekliğinin deliye dönmeyeceği anlamına gelir, yani aramalar AVL Trees ile daha iyi olacaktır. Yüksekliğin delinmesine izin vermemek için ek işlemler (rotasyonlar) yapılacağından, ağaç modifikasyon işlemleri biraz maliyetli olabilir.