Kırmızı-siyah ağaçlar ve AVL ağaçları arasındaki fark


82

Birisi lütfen bu iki veri yapısı arasındaki temel farkların ne olduğunu açıklayabilir mi? Farklılıkları / benzerlikleri vurgulayan çevrimiçi bir kaynak bulmaya çalışıyorum, ancak çok bilgilendirici bir şey bulamadım. Hangi durumlarda biri diğerine tercih edilir? Hangi pratik durumlar birini diğerinden "daha iyi" kullanır?

Yanıtlar:


101

AVL ağaçları, kırmızı-siyah ağaçlardan daha katı bir denge sağlar. Bir AVL ağacında kökten en derin yaprağa giden yol en fazla ~ 1.44 lg (n + 2) iken kırmızı siyah ağaçlarda en fazla ~ 2 lg (n + 1) 'dir.

Sonuç olarak, bir AVL ağacında arama tipik olarak daha hızlıdır, ancak bu, daha fazla döndürme işlemi nedeniyle daha yavaş ekleme ve silme maliyetine neden olur. Bu nedenle, arama sayısının ağaçtaki güncelleme sayısına hakim olmasını bekliyorsanız bir AVL ağacı kullanın.


3
Kavramı daha iyi anlamayı istemek. Hem avl ağacı hem de Kırmızı Siyah ağaç, ekleme başına en fazla iki dönüşe sahiptir. Peki, AVL ağaçlarının yavaş olduğunu nasıl söyleyebilirsiniz? Şimdiden teşekkürler!
user2626445

@larsmans! Performans farkı o kadar çok mu ki yeni bir konsept yaratılıyor?
Shashwat

@Shashwat Ne demek istediğini anlamadım. Yeni konsept?
Fred Foo

2
@larsmans! Demek istediğim, AVL ağacımız varken neden bu kadar meşhur olan Kırmızı-Siyah ağaç konseptine sahibiz, oysa ekleme, silme ve güncelleme performanslarında sadece küçük farklılıklar var. Kırmızı-Siyah ağacı AVL ağacından farklı kılan önemli bir şey var mı?
Shashwat

Bunları sürdürmek için kullanılan algoritmalar farklıdır, bu nedenle farklı isimler alırlar. AFAIK, aynı büyük-O zaman sınırları ile aynı operasyon setini destekliyorlar.
Fred Foo

54

Küçük veriler için :

ekle : RB ağacı ve avl ağacının sabit bir maksimum dönüş sayısı vardır, ancak RB ağacı daha hızlı olacaktır çünkü ortalama olarak RB ağacı daha az dönüş kullanır.

arama : AVL ağacı daha hızlıdır çünkü AVL ağacının derinliği daha azdır.

sil : RB ağacının sabit bir maksimum dönüş sayısı vardır, ancak AVL ağacında en kötü olarak O (log N) kez dönüş olabilir. ve ortalama olarak RB ağacının da daha az sayıda dönüşü vardır, dolayısıyla RB ağacı daha hızlıdır.

büyük veriler için :

ekle : AVL ağacı daha hızlıdır. çünkü eklemeden önce belirli bir düğümü aramanız gerekir. daha fazla veriye sahip olduğunuzda, belirli düğümü ararken zaman farkı O (log N) ile orantılı olarak artar. ancak AVL ağacı ve RB ağacı hala en kötü durumda sabit sayıda dönüşe ihtiyaç duyar. Böylece şişe boynu, o belirli düğümü aradığınız zaman haline gelecektir.

arama : AVL ağacı daha hızlıdır. (küçük veri durumunda olduğu gibi)

silme : AVL ağacı ortalamada daha hızlıdır, ancak en kötü durumda RB ağacı daha hızlıdır. çünkü kaldırmadan önce çok derin bir düğümü aramanız gerekir (yerleştirme nedenine benzer). ortalama olarak her iki ağacın da sabit dönüş sayısı vardır. ancak RB ağacının dönüş için sabit bir üst sınırı vardır.


2
bu, AVL ağaçlarının neredeyse her zaman büyük miktarda veri ile tercih edileceği anlamına geliyor gibi görünüyor. Java ve C ++ STL'de nasıl kullanılır? stackoverflow.com/questions/3901182/…
emschorsch

Ekle / sil durumunda AVL ağacını RB ağacından daha iyi hale getirmek için belirli miktarda veriye (örneğin 1 milyon) ihtiyacınız var ve bu gerçekten onu nasıl uyguladığınıza bağlı. Akıllı bir AVL uygulaması, daha az miktarda veriyle bile std :: map'i geçebilir. Örneğin, ebeveyn-> boyu 5'ten büyükse, çocuğun ve torunun boş olup olmadığını kontrol etmenize gerek yoktur.
DU Jiaen

Bu harika bir analizdir ve veri yapılarının herhangi bir şekilde karşılaştırılmasının örneği olmalıdır. Kabul edilen cevaptan daha iyi
pterodragon

1
'Küçük verilerin' kısaltılmış bir özeti olarak, bundan çıkardığım şey şuydu: AVL daha çok iş yapıyor ve performansı daha sonra artırmak için daha sıkı (yazma / döndürme) (okuma). Veriler büyüdükçe okumak daha önemli hale gelir, çünkü yazdığınızdan daha fazla okursunuz (rotasyon, aramaya kıyasla önemsiz olacaktır). Yani AVL her açıdan kazanır, çünkü okumak için optimize edilmiştir.
Ben Butterworth

8

Bundan alıntı: AVL ve Kırmızı-Siyah Ağaçlar arasındaki fark

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 kesici 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 ek 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.

Tanım gereği, her AVL bu nedenle Kırmızı-Siyah'ın alt kümeleridir. Kırmızı-Siyah bir ağaca dönüştürmek için herhangi bir AVL ağacını yeniden yapılanma veya döndürme olmaksızın renklendirebilmelisiniz.


3

AVL ağaçları genellikle kırmızı-siyah ağaçlarla karşılaştırılır, çünkü her ikisi de aynı işlemleri destekler ve O(log n)temel işlemler için zaman alır . Arama yoğun uygulamalar için AVL ağaçları kırmızı-siyah ağaçlardan daha hızlıdır çünkü daha katı bir şekilde dengelidirler. Kırmızı-siyah ağaçlara benzer şekilde, AVL ağaçları da yükseklik dengelidir. Her ikisi de genel olarak herhangi bir μ ≤ ½ için ağırlık dengeli veya μ dengeli değildir; diğer bir deyişle, kardeş düğümlerin çok farklı sayıda torunları olabilir.

AVL Ağaçlarıyla ilgili Wikipedia Makalesinden


3

Ağaçların maksimum yüksekliği, dengeyi korumak için en önemli şeydir. 1.44 * log(n)AVL için neredeyse eşit , ancak RB ağacı için öyle 2 * log(n). Böylece, sorun arama teşviki olduğunda AVL'yi kullanmanın daha iyi olduğu sonucuna varabiliriz. Önemli olan AVL ve RB ağacı için başka bir sorudur. RB ağacı, rotasyonun daha düşük maliyetinde rastgele yerleştirmeyle karşılaşıldığında AVL'den daha iyidir, ancak artan veya azalan verileri eklemek için iyi olan AVL. Yani sorun ekleme teşviki ise, RB ağacını kullanabiliriz.


3

Bir AVL Ağacının nasıl çalıştığı hakkında bir fikir edinmek için bu etkileşimli görselleştirme yardımcı olur.

AVL ve RedBlack Ağaçlar, yükseklik dengeli Ağaç Veri Yapılarıdır. Oldukça benzerdirler ve gerçek fark, herhangi bir ekleme / kaldırma işlemi üzerine yapılan döndürme işleminin sayısından oluşur - genel olarak daha homojen bir dengelemeyi korumak için AVL durumunda daha yüksektir.

Her iki uygulama da bir olarak ölçeklenir O(lg N), burada N yaprak sayısıdır, ancak pratikte bir AVL Ağacı arama yoğun görevlerde daha hızlıdır: daha iyi dengelemeden yararlanarak, Ağaç geçişleri ortalama olarak daha kısadır. Öte yandan, ekleme ve silme açısından bir AVL Ağacı daha yavaştır: Değişiklik üzerine Veri Yapısını düzgün şekilde yeniden dengelemek için daha yüksek sayıda dönüş gerekir.

Genel amaçlı uygulamalar için (yani öncelikli olarak, aramaların işlemlerin baskın olup olmadığı net değildir), RedBlack Ağaçları tercih edilir: bunların uygulanması daha kolaydır ve yaygın durumlarda daha hızlıdır - Veri Yapısının arandığı sıklıkta değiştirildiği her yerde . Bir örnek, TreeMapve TreeSetJava'da bir RedBlack Ağacı arka planını kullanır.


2

RedBlack ağaçlarının daha az dönüşe sahip olması, onları ekleme / silme işlemlerinde daha hızlı hale getirebilir, ancak ..... Genellikle biraz daha derin olduklarından, ekleme ve silme işlemlerinde de daha yavaş olabilirler. Ağaçta bir seviyeden diğerine her geçtiğinizde, istenen bilginin önbellekte olmadığı ve RAM'den alınması gerektiği konusunda büyük bir değişiklik olur. Böylece, daha derine inmesi ve dolayısıyla önbelleğini daha sık güncellemesi gerektiğinden, daha az rotasyonla kazanılan zaman zaten kaybedilebilir. Önbellekten çalışıp çalışmamak büyük bir fark yaratır. İlgili bilgiler önbellekte ise, ek bir seviyeye gitmek için gereken sürede ve bir sonraki seviye bilgisi önbellekte olmadığında birden fazla rotasyon işlemi yapabilirsiniz. Bu nedenle, RedBlack'in teoride daha hızlı olduğu durumlarda, yalnızca gerekli işlemlere bakıldığında, pratikte daha yavaş olabilir,


1

Gördüğüm kadarıyla AVL Ağaçlarının, AVL Ağacı'nın (Log n) istenen yüksekliğini elde etmek için gerektiği kadar çok sayıda dönüş (bazen ağacın üstüne yinelemeli olarak) yaptığı görülüyor. Bu, onu daha katı bir şekilde dengeli hale getirir.

Kırmızı Kara Ağaçlar için, burada http://en.wikipedia.org/wiki/Red-black_tree bulabileceğiniz, yerleştirme ve çıkarma işlemlerini sürdürdüğünüzden emin olmanız için gereken 5 Kural seti vardır .

Kırmızı siyah ağaçlar için size yardımcı olabilecek en önemli şey, bu beş kurala bağlı olarak, amca kırmızıysa ağacı köküne kadar tekrar tekrar renklendirebilmenizdir. Amca siyah ise, sahip olduğunuz sorunları çözmek için en fazla iki rotasyon yapmanız gerekecek, ancak bu bir veya iki rotasyondan sonra YAPILACAKSINIZ. Paketleyin ve iyi geceler deyin çünkü yapmanız gereken manipülasyonun sonu budur.

Büyük kural 5 numaradır ... 'Belirli bir düğümden onun soyundan gelen yapraklarından herhangi birine giden her basit yol aynı sayıda siyah düğüm içerir'.

Bu, ağacı çalıştırmak için ihtiyaç duyacağınız dönüşlerin çoğuna neden olur ve bu da ağacın dengesini çok fazla bozmamasına neden olur.


1

Özetle: AvlTree'ler RedBlackTrees'ten biraz daha iyi dengelenmiştir. Her iki ağaç da aramalar, eklemeler ve silmeler için genel olarak O (log n) süresi alır, ancak ekleme ve silme için ilki O (log n) dönüşünü gerektirirken, ikincisi yalnızca O (1) dönüşünü alır.

Rotasyonlar belleğe yazmak anlamına geldiğinden ve belleğe yazmak pahalı olduğundan, RedBlackTree'ler pratikte AvlTrees'e göre daha hızlı güncellenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.