Göründüğüm her yerde veri yapıları kırmızı-siyah ağaçlar kullanılarak uygulanmaktadır ( std::set
C ++ 'da, SortedDictionary
C #' da vs.)
Algoritmalar dersimde yeni (a, b), kırmızı-siyah ve AVL ağaçları kapladıktan sonra, dışarı çıktığım şey şu (profesörlere sormaktan, birkaç kitaptan bakmaktan ve biraz googling yapmaktan):
- AVL ağaçları kırmızı-siyah ağaçlardan daha küçük ortalama derinliğe sahiptir ve bu nedenle AVL ağacında bir değer aramak sürekli olarak daha hızlıdır.
- Kırmızı-siyah ağaçlar kendilerini dengelemek için AVL ağaçlarından daha az yapısal değişiklikler yapar, bu da ekleme / silme için potansiyel olarak daha hızlı olmalarını sağlar. Potansiyel olarak söylüyorum, çünkü bu, ağaçtaki yapısal değişimin maliyetine bağlı olacaktır, çünkü bu, çalışma süresine ve uygulamaya çok bağlıdır (ağaç değişmez olduğunda işlevsel bir dilde tamamen farklı olabilir mi?).
Çevrimiçi olarak AVL ve Kırmızı-siyah ağaçları karşılaştıran birçok kıyaslama var, ancak beni asıl vurgulayan, profesörümün temel olarak söylediği, genellikle iki şeyden birini yapacağınızı söylemek:
- Performansı pek önemsemiyorsunuz, bu durumda çoğu durumda AVL ile Red-black arasındaki% 10-20 fark önemli değil.
- Ya da gerçekten hem AVL hem de Red-black ağaçları hendek edeceğiniz ve B-ağaçları ile gideceğiniz performansı önemsiyorsunuz. hepsini bir sepete koyacağım.)
Bunun nedeni, bir B ağacının verileri daha kompakt bir şekilde bellekte depolamasıdır (bir düğüm birçok değer içerir), çok daha az önbellek özeti olmayacaktır. Ayrıca, kullanım durumuna göre uygulamada ince ayar yapabilir ve B ağacının sırasını CPU önbellek boyutuna vb. Göre ayarlayabilirsiniz.
Sorun şu ki, arama ağaçlarının farklı uygulamalarının gerçek hayattaki kullanımını gerçek modern donanım üzerinde gerçek anlamda analiz edecek herhangi bir kaynak bulamıyorum. Algoritmalar üzerine birçok kitap okudum ve farklı ağaç değişkenlerini bir araya getirecek bir şey bulamadım, birinin diğeriyle karşılaştırıldığında daha küçük ortalama derinliğe sahip olduğunu göstermek dışında (bu gerçekten ağacın nasıl davranacağını söylemez) gerçek programlarda.)
Söylendiği gibi, yukarıda belirtilenlere dayanarak Kırmızı-siyah ağaçların her yerde kullanılmasının özel bir nedeni var mı, B-ağaçlarının daha iyi performans göstermeleri mi gerekiyor? (bulabildiğim tek kriter olarak http://lh3lh3.users.sourceforge.net/udb.shtml dosyasını da gösteriyor , ancak bu özel bir uygulama konusu olabilir). Ya da herkesin Siyah Kara ağaçları kullanmasının sebebi, uygulanması oldukça kolay olduğu ya da farklı kelimelerle ifade etmenin zor olduğu için mi?
Ayrıca, biri işlevsel diller dünyasına geçtiğinde bu nasıl değişir? Hem Clojure hem de Scala'nın Clojure'un 32 dallanma faktörü kullandığı Hash dizi haritalanmış denemelerini kullandığı görülüyor .