Neden std :: map kırmızı-siyah ağaç olarak uygulanmaktadır?

oy
130

Neden std :: map bir şekilde uygulanmaktadır kırmızı-siyah ağacın ?

Birkaç dengeli vardır ikili arama ağaçları (BSTS) orada. Kırmızı-siyah ağaç seçiminde tasarım dengelemeler nelerdi?

Oluştur 13/03/2011 saat 09:33
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
86

Muhtemelen en yaygın iki öz dengeleme ağaç algoritmaları olan Kırmızı-Siyah ağaçlar ve AVL ağaçları . Her iki algoritmaları ağacın düğümleri yeniden dengeleme gerçekleştirmek için döndürülür rotasyonlar kavramını kullanmak bir ekleme / güncelleme sonrasında ağaç dengelemek için.

Her iki insert algoritmaları içinde / silme iken operasyonlar Kırmızı-Siyah ağaç yeniden dengeleme dönme durumunda O (n günlük) vardır bir olan O (1) Bu bir olan AVL ile ise operasyon O (n log) yapım işlemini bu yeniden dengeleme aşamasının yönü ve daha yaygın olarak kullanılan olası nedenlerinden biri daha verimli Kırmızı-siyah ağaç.

Kırmızı-Siyah ağaçlar Java ve Microsoft .NET Framework gelen teklifleri dahil olmak üzere en toplama kütüphanelerde kullanılmaktadır.

Cevap 13/03/2011 saat 09:47
kaynak kullanıcı

oy
2

Bu sadece senin uygulanması seçimdir - herhangi dengeli ağaç olarak uygulanabilir. Çeşitli seçenekler küçük farklılıklar ile her karşılaştırılabilir niteliktedir. Bu nedenle herhangi bir herhangi kadar iyidir.

Cevap 13/03/2011 saat 09:48
kaynak kullanıcı

oy
22

RB ağaçları 2logn maksimum varken AVL ağaçları, 1.44logn maksimum yüksekliğe sahip. Bir AVL bir öğeyi takma ağacında bir noktada rebalance anlamına gelebilir. yeniden dengeleme ekleme tamamlanır. Yeni bir yaprak yerleştirilmesi sonrasında bu yaprak ataları güncelleyerek, ya da iki alt ağaçlar eşit derinliği olan bir noktaya kadar köküne kadar yapılmalıdır. k düğümleri güncellemek zorunda olasılığı 1/3 ^ k. Yeniden Dengeleyici O'dur (1). (Ağacın yarısı derinliğe kadar) birden fazla rebalancing ima edebilir bir eleman çıkarma.

RB-ağaçlar ikili arama ağaçları olarak temsil sırayla 4 B-ağaçlardır. eşdeğer BST iki seviyede B-ağacı sonuçlarında bir 4-düğümü. En kötü durumda, ağacın bütün düğümler bir yaprak aşağı 3-düğümlerin tek zinciri ile 2-düğümleri vardır. Yani yaprak kökünden 2logn bir mesafede olacak.

Ekleme noktasının aşağı kökünden giderek, bir, 2-düğümler halinde 4-düğümleri değiştirmek için herhangi bir ekleme Bir yaprak doyurmak olmayacağından emin olmak zorundadır. yerleştirilmesi için geri geliyor, bütün bu düğümleri onlar doğru 4-düğümleri temsil edeceği analiz edilmelidir. Bu aynı zamanda aşağı ağacında gidiş yapılabilir. Küresel ekonomik aynı olacaktır. Bedava yemek yoktur! ağaçtan bir öğeyi kaldırma aynı derecededir.

Tüm bu ağaçlar düğümler Sadece Splay ağaçları tür ek bilgi arınmış vb boy, kilo, renk, hakkında bilgi taşırlar gerektirir. Ama birçok insan yapıları nedeniyle ramdomness arasında Splay ağaçların korkuyorlar!

Son olarak, ağaçlar da ağırlık dengelenmesini sağlayarak, düğümler kilo bilgisini taşıyabilir. Çeşitli yöntemler uygulanabilir. alt ağaç başka bir alt ağacı elemanlarının 3 kat daha fazla sayı içerir bir adet dengeleme gerekir. Rebalancing yine bir tek ya da çift dönme throuh ya yapılır. Bu 2.4logn bir kötü durum demektir. Bir 2 kez yerine 3, çok daha iyi bir oran ile alabilirsiniz, ama biraz daha az THANT dengesiz orada burada alt ağaçlar% 1'ini bırakarak anlamına gelebilir. Zor!

En iyi ağacın türü bu? Kesin AVL. Onlar koduna basit, ve logn en yakın en kötü yüksekliğe sahip. 1000000 elemanlarının bir ağaç, bir AVL yüksekliği 29 RB 40 en fazla olacaktır ve ağırlık oranına bağlı olarak 36 veya 50 dengeli.

rasgelelik, ekleme, silme, aramalar, vb oranı: diğer değişkenlerin bir yeri vardır

Cevap 16/07/2011 saat 02:52
kaynak kullanıcı

oy
36

Gerçekten kullanılmasına bağlıdır. AVL ağacı genellikle yeniden dengeleme daha rotasyonları var. Başvurunuz arama ağır çok fazla ekleme ve silme işlemlerini fakat ağırlıkları yoksa, o zaman AVL ağaç muhtemelen iyi bir seçimdir.

std::map o düğüm ekleme / silme ve arama hızı arasında makul bir trade-off alır gibi Kırmızı-Siyah ağacını kullanır.

Cevap 26/05/2012 saat 19:32
kaynak kullanıcı

oy
2

2017/06/14 Güncelleme: Ben yorum sonra cevabını düzenlemek webbertiger. Onun cevabı şimdi gözlerim çok daha iyi olduğuna işaret olmalıdır. Ama sadece ek bilgi olarak benim cevap tuttu ...

ve üçüncü bir yanlış olumlama vardır: nedeniyle ilk cevap yanlış (ikisini artık düzeltme) olduğunu düşünüyorum olmasından. Ben şeyi açıklığa kavuşturmak zorunda hissediyorum ...

2 En popüler ağaç AVL ve Kızıl Siyah (RB) bulunmaktadır. kullanımında temel fark yalan:

  • AVL: konsültasyon (okuma) oranı manipülasyon (modifikasyon) daha büyüktür eğer iyi. Hafıza ayak baskı RB den (nedeniyle boyama için gerekli olan bit) biraz daha azdır.
  • RB: istişare üzerinde istişare (okuma) ve manipülasyon (modifikasyon) veya daha fazla modifikasyon arasında bir denge vardır genel durumlarda iyi. Kırmızı-siyah bayrak depolanması nedeniyle bir biraz daha büyük bellek ayak izi.

Temel fark renklendirme gelir. renklendirme bazen atlamak veya göreceli bir hi maliyeti yeniden denge eylemlerini kısaltmak için izin çünkü AVL daha RB ağacında az yeniden denge eylemi var. Renklendirme, RB ağacı da düğümleri daha yüksek düzeyde olması nedeniyle bu olduğu için arama (okuma) daha az verimli biraz yapma (~ 2 kat daha fazla seviyelerinin olasılıkları olan) siyah olanlar arasında kırmızı düğümleri kabul ... ama çünkü (2x) sabit, bu (n günlük) o kalmak.

Eğer bir ağaç (Önemlilik) bir değişiklik için performans isabet VS (neredeyse önemsiz) bir ağacın istişare başarımdan dikkat edecek olursak, genel durum için AVL üzerinde RB tercih doğal hale gelir.

Cevap 30/05/2017 saat 20:33
kaynak kullanıcı

oy
5

önceki cevaplar sadece muhtemelen sadece tarihsel nedenlerden dolayı kalır ağaç alternatifleri ve kırmızı siyah yöneliktir.

Neden bir karma tablo?

Bir ağacında bir tür haritasındaki bir anahtar olarak kullanılmak üzere sadece kısmi sipariş (<karşılaştırma) gerektirir. Ancak, karma tablo her bir anahtar türü tanımlanan bir karma işlev sahip olmasını gerektirir. minimumda bu tip gereksinimlerini tutulması jenerik programlama için çok önemlidir.

İyi bir karma tablo tasarlama kullanılacağı bağlamda o mahrem bilgi gerektirir. açık adresleme, veya bağlantılı zincirleme kullanmalı mıyım? o boyutlandırma önce yükün hangi düzeylerde kabul etsin? o kaba ve hızlı pahalı bir çarpışma önler karma veya birini kullanmalı mıyım?

(C ++ 11 ile hash tabloları eklemek yaptı unordered_map. Sen de görebileceğiniz belgelere bu seçeneklerin birçoğunu yapılandırmak için politikalar ayarlanmasını gerektirir.)

STL uygulamanız için en iyi seçimdir hangi tahmin edemediğinden, varsayılan daha esnek olması gerekiyor. Ağaçlar "Sadece çalışmak" ve güzel ölçek.

Ya diğer ağaçlar ne olacak?

Kırmızı Siyah ağacın teklif hızlı arama ve kendini BSTS aksine denge vardır. Başka bir kullanıcı kendini dengeleyen AVL ağacında üzerinde avantajları dikkat çekti.

Alexander Stepanov (STL yaratıcısı) diye yazdıysam o Kırmızı-Siyah ağacın yerine B * Ağacı alacağını belirtti std::mapyine. Düğümler Modern bellek önbelleklerine için daha kolay bitişik elemanları rastgele sayıda saklayabilirsiniz olmasıdır.

O zamandan beri en büyük değişikliklerden biri önbelleklerini büyüme olmuştur. Önbellek isabetsizlik çok pahalıya mal olan, bu nedenle başvuru konum artık çok daha önemlidir. referans düşük yerellik var Düğüm tabanlı veri yapıları, çok daha az mantıklı. Bugün STL tasarlarken olsaydı, kaplarda farklı bir dizi olurdu. Örneğin, bir bellek içi B *-ağacı bir ilişkisel kabı uygulanması için kırmızı-siyah ağacın çok daha iyi bir seçimdir. - İskender Stepanov

Daha okuyabilir burada

kırmızı-siyah ağaç veya B * her zaman en iyi midir?

Diğer durumlarda Alex belirtmiştir std::vectorhemen her zaman benzer nedenlerle iyi liste kapsayıcıdır. Nadiren kullanmak mantıklı std::listya std::dequeda okulda öğretilen bu durumlar için (örneğin listenin ortasından unsurunu kaldırma gibi). std::vectoro büyük n ama her şey için bu yapıların yener, böylece hızlı.

Eğer elemanları sadece küçük bir sayı varsa aynı mantık uygulamak (yüz?) Bir kullanma std::vectorve lineer arama ağacı uygulanması daha etkili olabilir std::map. Yerleştirme sıklığına bağlı olarak, bir dizilmistir std::vectorile birlikte std::binary_searchen hızlı tercihi yapabilirsiniz.

Cevap 22/12/2017 saat 00:46
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more