B ağaçları ile B + ağaçları arasındaki farklar nelerdir?


293

Bir b ağacında hem anahtarları hem de verileri iç ve yaprak düğümlerinde depolayabilirsiniz , ancak b + ağacında verileri yalnızca yaprak düğümlerinde depolamanız gerekir .

Yukarıdakileri b + ağacında yapmanın herhangi bir avantajı var mı?

Neden b + ağaçlar yerine b-ağaçları kullanmıyorsunuz, çünkü sezgisel olarak çok daha hızlı görünüyorlar?

Yani, neden b + ağacındaki anahtarı (verileri) çoğaltmanız gerekiyor?


37
Bence söyledikleri "B-Tree" vs B + -Tree. Eksi işareti değil, kısa çizgi anlamına gelir.
stu

Yanıtlar:


421

Aşağıdaki görüntü B + ağaçları ve B ağaçları arasındaki farkları göstermeye yardımcı olur.

B + ağaçlarının avantajları:

  • B + ağaçları iç düğümlerle ilişkili verilere sahip olmadığından, bir bellek sayfasına daha fazla anahtar sığabilir. Bu nedenle, bir yaprak düğümündeki verilere erişmek için daha az önbellek kaçırması gerekir.
  • B + ağaçlarının yaprak düğümleri bağlanır, bu nedenle bir ağaçtaki tüm nesnelerin tam taraması için tüm yaprak düğümlerinden sadece bir doğrusal geçiş gerekir. Öte yandan AB ağacı, ağaçtaki her seviyenin çaprazlanmasını gerektirir. Bu tam ağaç geçişi, muhtemelen B + yapraklarının doğrusal geçişinden daha fazla önbellek kaybını içerecektir.

B ağaçlarının avantajı:

  • B ağaçları her anahtarla veri içerdiğinden, sık erişilen düğümler köke daha yakın olabilir ve bu nedenle daha hızlı erişilebilir.

B ve B + ağacı


2
Yaprak düğümündeki giriş sayısı üzerinde herhangi bir kısıtlama var mı ??
TLE

38
@TLE Güzel soru! Evet. Bir sabit sürücü bir seferde en az bir bellek sayfasına eriştiğinden, tüm işaretçileri tek bir bellek sayfasına sığdırmak istiyoruz. Yaprak erişimi başına yalnızca bir disk okunmasını istiyoruz, bu nedenle bir yaprağa sayfa boyutundan daha fazla işaretçi atamak istemiyoruz. Bir yaprağı sayfa boyutunda işaretçilerle doldurursak ve daha sonra bu yaprağa başka bir işaretçi eklemek istiyorsak, bu düğümün iki çocuğunu oluştururuz ve her yeni çocuğa yaprağın işaretleyicilerinin yarısını veririz. Tabii ki, ağacın yüksekliğinin minimumda tutulmasını sağlamak için biraz yeniden karıştırma olabilir. Bu yardımcı olur mu?
Rose Perrone

B-ağacının her bir yaprak düğümünün son işaretçisi bir sonraki yaprak düğümüne işaret etmelidir, değil mi?
camino

8
Böyle eski bir konuya çarptığım için çok üzgünüm, ama @ Babyburger'in camino'nun yorumunun nasıl doğru olduğuna dair yorumu aslında doğru değil; bir B-Ağacı aslında bağlı yaprak düğümlerine sahip değildir. A B +, tabi.
Jason

Mükemmel cevap için teşekkürler, bir veritabanı bağlamında bir B / B + ağacında nesnelerin tam tarama gerektiğinde bir kullanım örneği nedir? Öncelikle indeksleme için kullanıldığından, aramaların tüm ağacı doğru bir şekilde taraması neredeyse hiç gerekmeyecek ve bunun yerine dizin yolu üzerinden geçiş yapması doğru mu?
Siddhartha

113

B + ağaçlarının B ağaçları üzerindeki temel avantajı, işaretleyicileri verilere kaldırarak diğer düğümlere daha fazla işaretçi toplamanıza izin verir, böylece fanout'u arttırır ve potansiyel olarak ağacın derinliğini azaltır.

Dezavantajı, bir iç düğümde bir eşleşme bulabileceğiniz erken çıkışların olmamasıdır. Ancak her iki veri yapısında da büyük fanoutlar bulunduğundan, eşleşmelerinizin büyük çoğunluğu yaprak düğümlerinde olacak ve bu da ortalama B + ağacını daha verimli hale getirecektir.


1
Jeff'in cevabını tercih ederim, çünkü tam bir tarama yaparken verimlilik farkını vurgular.
Rose Perrone

Ben gerçekten kafam karıştı çünkü bir sırayla çapraz geçiş kullanarak bir b-ağacı çapraz tüm değerleri O (n) zaman içinde sıralanmış sırayla okuyacak. Her ağaç düğümü fiziksel sayfa boyutu için en uygun şekilde boyutlandırılırsa, işler artık daha uygun olmaz. Tersine, bir b + ağacında ilk (en küçük) değere ulaşma maliyeti O (log n) ve daha sonra her yapraktan geçme maliyeti O (n) 'dir, bu nedenle toplam maliyet O (log n + n)' dir. Bu daha fazla iş ve daha fazla disk okumasıdır, çünkü ağaç tüm bu ekstra verilere sahiptir. Anlamıyorum.
Eric

Yukarıdaki cümlede 'fanout' için başka bir kelime ne olurdu?
Jorge Bucaran

3
@JorgeBucaran fanout = bir düğümden çıkan kenar sayısı
bantmen

33

B + Ağaçlar, terminal düğümleri bağlantılı bir liste oluşturduğundan, ağacın indekslediği her veri parçasına bakıldığında olduğu gibi tam bir tarama yapmak için çok daha kolay ve daha yüksek performans gösterir. Bir B-Ağacı ile tam bir tarama yapmak için tüm verileri bulmak için tam bir ağaç geçişi yapmanız gerekir.

Öte yandan B-Ağaçları, özellikle ağaç RAM'de veya diğer blok olmayan depolamada bulunuyorsa, bir arama yaptığınızda (anahtarla belirli bir veri parçası ararken) daha hızlı olabilir. Ağaçta yaygın olarak kullanılan düğümleri yükseltebildiğinizden, verilere ulaşmak için daha az karşılaştırma yapılması gerekir.


1
O zaman bir B + ağacının tüm veriler arasında sırayla okunabileceği ve böylece yaprakların üzerinden geçebileceği durumlar için kullanılacağını kabul eder misiniz. B ağacı Rastgele Erişim durumları için ideal olurken?
JDPeckham

31
  1. B ağacında arama tuşları ve veriler dahili veya yaprak düğümlerinde saklanır. Ancak B + ağacındaki veriler yalnızca yaprak düğümlerinde saklanır.
  2. Tüm veriler yaprak düğümlerinde bulunduğundan bir B + ağacının tam taraması çok kolaydır. B ağacının tam taraması için tam bir geçiş gerekir.
  3. B ağacında, veriler yaprak düğümlerinde veya iç düğümlerde bulunabilir. İç düğümlerin silinmesi çok karmaşıktır. B + ağacında, veriler yalnızca yaprak düğümlerinde bulunur. Yaprak düğümlerinin silinmesi kolaydır.
  4. B ağacına ekleme, B + ağacından daha karmaşıktır.
  5. B + ağaçları gereksiz arama tuşlarını saklar, ancak B ağacının gereksiz değeri yoktur.
  6. B + ağacında, yaprak düğümü verileri sıralı bağlantılı liste olarak sıralanır, ancak B ağacında yaprak düğümü bağlantılı bir liste kullanılarak saklanamaz. Birçok veritabanı sisteminin uygulaması bir B + ağacının yapısal sadeliğini tercih eder.

15

Veritabanı sistemi kavramlarından örnek 5

B +-ağacı B + ağaç

karşılık gelen B ağacı B-ağacı


5
Bir B-Ağacının düğümün çocuklarıyla bağlantıları olduğunu sanmıyorum. Örneğin oluşturmak Clearview bucketiçin Mianus Bucket. Zaten bunu yapmak pek mantıklı olmaz, çünkü ikisi arasında Downtown bucketB ağacında bir Dizin Taraması yapmak istediğinizde aranacak çok şey vardır (geri izleme gerekir). Bunu nereden aldın?
Evan Carroll

1
@EvanCarroll Veritabanı sistemi kavramları 5th, belki yazar ile onaylamanız gerekir :)
camino

11

"Çok daha hızlı" tanımlayın. Asimptotik olarak neredeyse aynılar. Farklılıklar ikincil depolamayı nasıl kullandıklarında yatmaktadır. B ağaçları ve B + ağaçları hakkındaki Wikipedia makaleleri oldukça güvenilir görünüyor.


2
Charlie ile hemfikirim. Bir B Ağacının bir düğümü bir ikincil bellek sayfasını veya bloğu temsil ettiğinden, bir düğümden diğerine geçiş zaman alan bir sayfa değişikliği gerektirir.

11

Adegoke A, Amit

İnsanların eksik olduğu önemli bir nokta, bu bölümde açıklandığı gibi veriler ve işaretçiler arasındaki farktır.

İşaretçi: diğer düğümlere işaretçi.

Veri: - Veritabanı dizinleri bağlamında, veri, başka bir yerde bulunan gerçek verilere (sıra) sadece bir başka göstericidir.

Bu nedenle, B ağacında her düğümün üç bilgi anahtarı, anahtarlarla ilişkili verilere işaretçi ve alt düğümlere işaretçi vardır.

B + ağacında iç düğüm, anahtarları ve işaretçileri alt düğüme tutarken, yaprak düğümü anahtarları ve işaretçileri ilişkili verilerde tutar. Bu, belirli bir düğüm boyutu için daha fazla sayıda tuşa izin verir. Düğümün boyutu esas olarak blok boyutuna göre belirlenir.

Düğüm başına daha fazla tuşa sahip olmanın avantajı yukarıda iyi açıklanmıştır, böylece yazma çabamı kurtaracağım.


10

B + Ağaçlar özellikle blok tabanlı depolamada iyidir (örneğin: sabit disk). bunu göz önünde bulundurarak, birkaç avantaj elde edersiniz, örneğin (başımın üstünden):

  • yüksek fanout / düşük derinlik: bu, verilere ulaşmak için daha az blok almanız gerektiği anlamına gelir. işaretçilerle karıştırılan verilerle, her okuma daha az işaretçi alır, bu nedenle verilere ulaşmak için daha fazla arama yapmanız gerekir

  • basit ve tutarlı blok depolama: bir iç düğümün N işaretçisi vardır, başka bir şey yoktur, bir yaprak düğümün verileri vardır, başka bir şey yoktur. bu ayrıştırmayı, hata ayıklamayı ve hatta yeniden yapılandırmayı kolaylaştırır.

  • yüksek anahtar yoğunluğu, üst düğümlerin neredeyse kesinlikle önbellekte olduğu anlamına gelir, birçok durumda tüm iç düğümler hızlı bir şekilde önbelleğe alınır, bu nedenle yalnızca veri erişimi diske gitmelidir.


2
çoğunlukla bellek içi ağaçlar için; ancak kırmızı-siyah ağaçlar, atlama listeleri vb. gibi başka popüler seçenekler de vardır.
Javier

B ağaçları ayrıca, asimtotik düğüm erişim sayısını sınırlandırarak, blok tabanlı etkin depolama için tasarlanmıştır. Aksi takdirde, rasgele erişimli bellek benzeri bir depolama ortamı kullanılıyorsa, daha iyi sonuçlar elde etmek için kırmızı-siyah ağaç gibi kendi kendini dengeleyen bir ikili ağaç kullanılabilir.
dionyziz

ilk noktanız "daha fazla arama" yerine "daha az arama" dememelidir. Daha küçük derinlik -> daha az arar
Jesse

1
@Jesse: yüksek fanout => düşük derinlik => daha az arama, ancak veri ve işaretçilerin karıştırılması daha az işaretçi anlamına gelir => düşük fanout => daha fazla derinlik => daha fazla arama
Javier

1
@AdegokeA: Bir B + ağacının iki çeşit düğümü vardır: yalnızca anahtar ve işaretçileri olan iç düğümler, veri yok; ve yaprak düğümleri, verilerle ve işaretçiler olmadan. her bir iç düğümde maksimum anahtar sayısına izin verir. verileri bir iç düğüme kaydederseniz, daha az işaretçi sığdırabilir ve ağacınız daha uzun olur.
Javier

5

B + Ağacı'nda, yalnızca işaretçiler iç düğümlerde depolandığından, boyutları B ağacının iç düğümlerinden (her iki veri + anahtarı da depolar) önemli ölçüde daha küçük hale gelir. Bu nedenle, B + ağacının dizinleri, hedefin yerini bulmak için işlenen tek bir diskte harici depolama biriminden getirilebilir. Eğer bir B ağacı ise, her karar alma işlemi için bir disk okuması gerekir. Umarım açığa vurdum! :)


4

1
Bu doğru cevap olmalıydı. Kısaca: Referans yeri.
Theodore Zographos

2

Bir örnek alın - her satırda büyük veri içeren bir tablonuz var. Bu, nesnenin her örneğinin Büyük olduğu anlamına gelir.

Burada B ağacı kullanırsanız, çoğu zaman veri içeren sayfaları taramaya harcanır - ki bu işe yaramaz. Veritabanlarında, nesne verilerini taramaktan kaçınmak için B + Ağaçları kullanmanın nedeni budur.

B + Ağaçlar anahtarları verilerden ayırır.

Ancak veri boyutunuz daha küçükse, onları B ağacının yaptığı anahtarla saklayabilirsiniz.


1
"Burada B ağacı kullanırsanız, çoğu zaman veri içeren sayfaları taramak için harcanır" - gerekli değildir. B-ağacı düğümleri verilerin kendisinde değil, diskteki verilere yalnızca "işaretçiler" tutabilir.
TT_

2

B-ağacı ve B + ağacı arasındaki birincil ayrım, B-ağacının arama anahtarı değerlerinin yedekli depolamasını ortadan kaldırmasıdır.Arama anahtarları B ağacında tekrarlanmadığı için, dizini daha az ağaç düğümü kullanarak depolayamayabiliriz Bununla birlikte, yaprak olmayan düğümlerde görünen arama tuşu B ağacında başka hiçbir yerde görünmediğinden, yaprak olmayan bir düğümdeki her arama anahtarı için ek bir işaretçi alanı eklemeye zorlanırız. B-ağacı için alan avantajlarıdır, çünkü tekrarlama gerçekleşmez ve büyük endeksler için kullanılabilir.


1
İlginçtir, tekrarlama hakkındaki düşünceler buradaki yanıtlar arasında benzersizdir ve b + ağacının sıralı geçişinden, bir b ağacının sıralı geçişinden daha verimli olduğundan daha mantıklıdır. Anlayabildiğim kadarıyla, bu tam olarak doğru değil ya da bir b-ağacının geçişinin O (n) olduğu ve b + ağacındaki en küçük düğümü bulmak O (log n) ve sonra buna ek olarak her yaprağın çaprazlanması O (n) 'dir. Ancak, boole alanı gibi küçük bir değer aralığına sahip bir şey dizine ekliyorsanız, b + ağacı, yinelenen işlenmesi nedeniyle b ağacından çok daha anlamlı olur.
Eric

1

B + ağacı, ağacın kökünden bir yaprağa giden her yolun aynı uzunlukta olduğu ve ağacın yapraksız her düğümünün [n / 2] ve [n] çocukları arasında olduğu, n'nin olduğu dengeli bir ağaçtır. belirli bir ağaç için düzeltildi. Dizin sayfaları ve veri sayfaları içerir. İkili ağaçların ana düğüm başına yalnızca iki çocuğu vardır, B + ağaçlarının her ana düğüm için değişken sayıda çocuğu olabilir


1
Sadece netlik için, B ağaçları ikili ağaçlar değildir. Aslında, B ağaçları ve B + ağaçları, inşaat ve kullanımda ikili ağaçlardan birbirine daha yakındır. Wiki makaleleri, B + Ağacı , B Ağacı ve İkili Ağacı
Uutsav

1

B + ağaçlarının olası bir kullanımı, ağacın kullanılabilir belleğe sığmayacak kadar büyüdüğü durumlar için uygun olmasıdır. Böylece, genellikle birden fazla G / Ç yapmayı beklersiniz.
Genellikle bir B + ağacının aslında belleğe sığdığında bile kullanılır ve önbellek yöneticiniz onu orada kalıcı olarak tutabilir. Ancak bu genel bir durum değil, özel bir durumdur ve önbellekleme politikası B + ağaç bakımından ayrıdır.

Ayrıca, bir B + ağacında, yaprak sayfaları çapraz geçişleri (aralık aramaları, sıralama vb. İçin) optimize eden bağlantılı bir listede (veya çift bağlantılı liste) birbirine bağlanır. Dolayısıyla, işaretçi sayısı, kullanılan belirli algoritmanın bir işlevidir.


Bu, her yerde B + ağaçları yerine B ağaçlarını neden kullanmamayacağımız sorusuna cevap veriyor :)
yığın programcısı

3
Fakat siz sadece bildiğiniz kadarıyla bir tarafı tarif ettiniz, cevabınızla b-ağaçları tam olarak aynı şekilde işleyebilir. OP farklılıkları açıklamak istedi ve siz sadece biri hakkında konuştunuz, diğerinden değil. Bir daire ile venn diyagramınız olamaz!
Malfist
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.