Quali sono le differenze tra alberi B e alberi B +?


293

In un b-tree è possibile memorizzare sia le chiavi che i dati nei nodi interni e foglia , ma in un albero b + è necessario memorizzare i dati solo nei nodi foglia .

C'è qualche vantaggio nel fare quanto sopra in un albero b +?

Perché non usare b-alberi invece di b + alberi ovunque, dal momento che intuitivamente sembrano molto più veloci?

Voglio dire, perché è necessario replicare la chiave (dati) in un albero b +?


37
Penso che quello che stanno dicendo sia "B-Tree" vs. B + -Tree. Significano un trattino, non un segno meno.
stu,

Risposte:


421

L'immagine seguente aiuta a mostrare le differenze tra alberi B + e alberi B.

Vantaggi degli alberi B +:

  • Poiché gli alberi B + non hanno dati associati ai nodi interni, è possibile inserire più chiavi in ​​una pagina di memoria. Pertanto, per accedere ai dati che si trovano su un nodo foglia saranno necessari meno errori di cache.
  • I nodi foglia di alberi B + sono collegati, quindi eseguire una scansione completa di tutti gli oggetti in un albero richiede un solo passaggio lineare attraverso tutti i nodi foglia. L'albero AB, d'altra parte, richiederebbe un attraversamento di ogni livello nell'albero. Questo attraversamento a albero pieno probabilmente comporterà più mancate cache rispetto all'attraversamento lineare delle foglie B +.

Vantaggio di alberi B:

  • Poiché gli alberi B contengono dati con ciascuna chiave, i nodi a cui si accede frequentemente possono trovarsi più vicini alla radice e quindi è possibile accedervi più rapidamente.

B e B + albero


2
C'è qualche vincolo sul numero di voci nel nodo foglia ??
TLE

38
@TLE Bella domanda! Sì. Un disco rigido accede ad almeno una pagina di memoria alla volta, quindi vogliamo adattare tutti i puntatori a una singola pagina di memoria. Vogliamo richiedere solo un disco per l'accesso foglia, quindi non vogliamo assegnare più di una dimensione di pagina di puntatori a un foglio. Se riempiamo una foglia con una dimensione di pagina di puntatori e quindi vogliamo aggiungere un altro puntatore a questa foglia, creiamo due figli di questo nodo e diamo la metà dei puntatori della foglia a ogni nuovo figlio. Naturalmente, potrebbe esserci qualche rimescolamento per garantire che l'altezza dell'albero sia ridotta al minimo. questo aiuta?
Rose Perrone,

l'ultimo puntatore di ciascun nodo foglia dell'albero B dovrebbe puntare al nodo foglia successivo, giusto?
camino,

8
Mi dispiace tanto per aver imbrogliato un thread così vecchio, ma il commento di @ Babyburger su come il commento di Camino fosse corretto non è in realtà vero; un B-Tree, infatti, non ha nodi foglia collegati. A B +, certo.
Jason,

Grazie per l'eccellente risposta, qual è un caso d'uso in cui sarebbe necessaria una scansione completa degli oggetti in un albero B / B + in un contesto di database? Dato che viene utilizzato principalmente per l'indicizzazione, le ricerche non avrebbero quasi mai bisogno di scansionare l'intero albero a destra e invece di attraversare il percorso dell'indice, è corretto?
Siddhartha,

113

Il vantaggio principale degli alberi B + rispetto agli alberi B è che consentono di raggruppare più puntatori ad altri nodi rimuovendo i puntatori ai dati, aumentando così la dissolvenza e potenzialmente diminuendo la profondità dell'albero.

Lo svantaggio è che non ci sono out anticipati quando potresti aver trovato una corrispondenza in un nodo interno. Ma dal momento che entrambe le strutture di dati hanno enormi fanout, la stragrande maggioranza delle tue partite sarà comunque su nodi foglia, rendendo in media l'albero B + più efficiente.


1
Preferisco la risposta di Jeff, perché enfatizza la differenza di efficienza quando si esegue una scansione completa.
Rose Perrone,

Sono davvero confuso perché attraversare un albero b usando un attraversamento in ordine leggerà tutti i valori in ordine ordinato in O (n) tempo. Se ogni nodo dell'albero è dimensionato in modo ottimale per la dimensione della pagina fisica, sembra che le cose non ottengano più ottimali. Al contrario, il costo per arrivare al primo (più piccolo) valore in un albero b + è O (log n) e quindi passare attraverso ogni foglia è O (n), quindi il costo totale è O (log n + n). Questo è più lavoro e più letture del disco, il che ha senso perché l'albero contiene tutti questi dati extra. Non capisco
Eric

Quale sarebbe un'altra parola per "fanout" nella frase sopra?
Jorge Bucaran,

3
@JorgeBucaran fanout = numero di spigoli che escono da un nodo
bantmen,

33

Gli alberi B + sono molto più facili e più performanti per eseguire una scansione completa, come in ogni pezzo di dati che l'albero indicizza, poiché i nodi terminali formano un elenco collegato. Per eseguire una scansione completa con un B-Tree è necessario eseguire un attraversamento completo dell'albero per trovare tutti i dati.

D'altro canto, i B-Tree possono essere più veloci quando si esegue una ricerca (cercando un dato specifico di dati in base alla chiave), specialmente quando l'albero risiede nella RAM o in altra memoria non bloccata. Poiché è possibile elevare i nodi comunemente utilizzati nella struttura, sono necessari meno confronti per accedere ai dati.


1
Concorderesti che un albero B + verrebbe utilizzato per situazioni in cui potrebbe esserci una lettura sequenziale su tutti i dati in modo da poter attraversare le foglie. Considerando che l'albero B sarebbe l'ideale per le situazioni di accesso casuale?
JDPeckham,

31
  1. In un albero B le chiavi di ricerca e i dati sono memorizzati in nodi interni o foglia. Ma in un albero B + i dati sono memorizzati solo nei nodi foglia.
  2. La scansione completa di un albero B + è molto semplice perché tutti i dati si trovano nei nodi foglia. La scansione completa di un albero B richiede un attraversamento completo.
  3. In un albero B, i dati possono essere trovati nei nodi foglia o nodi interni. La cancellazione di nodi interni è molto complicata. In un albero B +, i dati si trovano solo nei nodi foglia. La cancellazione dei nodi foglia è semplice.
  4. L'inserimento nell'albero B è più complicato dell'albero B +.
  5. Gli alberi B + memorizzano le chiavi di ricerca ridondanti ma l'albero B non ha valore ridondante.
  6. In un albero B +, i dati del nodo foglia sono ordinati come un elenco collegato sequenziale, ma in un albero B il nodo foglia non può essere memorizzato utilizzando un elenco collegato. Le implementazioni di molti sistemi di database preferiscono la semplicità strutturale di un albero B +.

15

Esempio dai concetti di sistema del database 5

Albero B + B + tree

albero B corrispondente btree


5
Non penso che un B-Tree abbia collegamenti ai figli del nodo. Ad esempio dal modulo Clearview bucketal Mianus Bucket. Non avrebbe molto senso farlo in ogni caso perché tra i due hai quello Downtown bucketche si deve cercare nel caso in cui si desideri eseguire una scansione indice in un albero B (richiede il backtracking). Dove lo hai preso?
Evan Carroll,

1
@EvanCarroll Concetti relativi al sistema di database 5 °, forse devi confermare con l'autore :)
camino

11

Definisci "molto più veloce". Asintoticamente sono più o meno gli stessi. Le differenze risiedono nel modo in cui utilizzano l'archiviazione secondaria. Gli articoli di Wikipedia sugli alberi B e B + sembrano abbastanza affidabili.


2
Sono d'accordo con Charlie. Poiché un nodo di un B-Tree rappresenta una pagina o un blocco di memoria secondaria, il passaggio da un nodo a un altro richiede un cambio di pagina dispendioso in termini di tempo.

11

Adegoke A, Amit

Immagino che un punto cruciale che manchi alle persone sia la differenza tra dati e puntatori, come spiegato in questa sezione.

Puntatore: puntatore ad altri nodi.

Dati: - Nel contesto degli indici del database, i dati sono solo un altro puntatore a dati reali (riga) che risiedono altrove.

Quindi in caso di albero B ogni nodo ha tre chiavi di informazione, puntatori ai dati associati alle chiavi e puntatore a nodi figlio.

Nell'albero B + il nodo interno conserva chiavi e puntatori al nodo figlio mentre il nodo foglia conserva chiavi e puntatori ai dati associati. Ciò consente un numero maggiore di chiavi per una determinata dimensione del nodo. La dimensione del nodo è determinata principalmente dalla dimensione del blocco.

Il vantaggio di avere più chiavi per nodo è spiegato molto sopra, quindi risparmierò il mio sforzo di digitazione.


10

Gli alberi B + sono particolarmente adatti per l'archiviazione basata su blocchi (ad es. Disco rigido). con questo in mente, ottieni diversi vantaggi, ad esempio (dalla cima della mia testa):

  • alta dissolvenza / bassa profondità: ciò significa che devi ottenere meno blocchi per accedere ai dati. con i dati mescolati ai puntatori, ogni lettura ottiene meno puntatori, quindi è necessario un numero maggiore di ricerche per ottenere i dati

  • archiviazione a blocchi semplice e coerente: un nodo interno ha N puntatori, nient'altro, un nodo foglia ha dati, nient'altro. ciò semplifica l'analisi, il debug e persino la ricostruzione.

  • l'elevata densità di chiavi significa che i nodi principali sono quasi sicuramente nella cache, in molti casi tutti i nodi interni vengono rapidamente memorizzati nella cache, quindi solo l'accesso ai dati deve passare al disco.


2
principalmente per alberi in memoria; ma ci sono altre opzioni popolari, come alberi rosso-neri, salta gli elenchi e così via.
Javier,

Gli alberi B sono inoltre progettati per un'archiviazione efficiente basata su blocchi, limitando il numero asintotico di accessi ai nodi. Altrimenti, se si utilizza un supporto di memoria simile alla memoria con accesso casuale, è possibile utilizzare un albero binario autobilanciante come un albero rosso-nero per ottenere risultati migliori.
Dionyziz,

il tuo primo punto non dovrebbe dire "meno ricerche" piuttosto che "più ricerche". Profondità minore -> cerca meno
Jesse

1
@Jesse: high fanout => low depth => meno ricerche, ma mescolare dati e puntatori significa meno puntatori => low fanout => più profondità => più ricerche
Javier

1
@AdegokeA: un albero B + ha due tipi di nodi: nodi interni con solo chiavi e puntatori, nessun dato; e nodi foglia, con dati e senza puntatori. che consente il numero massimo di chiavi su ciascun nodo interno. se memorizzi i dati su un nodo interno, puoi adattare meno puntatori e l'albero diventa più alto.
Javier,

5

In B + Tree, poiché solo i puntatori sono memorizzati nei nodi interni, le loro dimensioni diventano significativamente più piccole rispetto ai nodi interni dell'albero B (che memorizzano entrambi i dati + chiave). Pertanto, gli indici dell'albero B + possono essere recuperati dalla memoria esterna in un singolo disco letto, elaborati per trovare la posizione della destinazione. Se è stato un albero B, è necessaria una lettura del disco per ogni processo decisionale. Spero di aver chiarito il mio punto! :)


4

**

Il principale svantaggio di B-Tree è la difficoltà di attraversare i tasti in sequenza. L'albero B + mantiene la proprietà di accesso casuale rapido dell'albero B e allo stesso tempo consente un accesso sequenziale rapido

** ref: Strutture dati usando C // Autore: Aaro M Tenenbaum

http://books.google.co.in/books?id=X0Cd1Pr2W0gC&pg=PA456&lpg=PA456&dq=drawback+of+B-Tree+is+the+difficulty+of+Traversing+the+keys+sequentially&source=bl&ots=pGcPQSEJMS&sig= F9MY7zEXYAMVKl_Sg4W-0LTRor8 & hl = it & sa = X & ei = nD5AUbeeH4zwrQe12oCYAQ & ved = 0CDsQ6AEwAg # v = onepage & q = svantaggio% 20di% 20B-Tree% 20is% 20the% 20difficulty% 20di% 20Traversing% 20the% 20keys% 20sequentially & f = false


1
Questa avrebbe dovuto essere la risposta corretta. In breve: località di riferimento.
Theodore Zographos il

2

Fai un esempio: hai una tabella con enormi dati per riga. Ciò significa che ogni istanza dell'oggetto è grande.

Se si utilizza B tree qui, la maggior parte del tempo è dedicato alla scansione delle pagine con dati, il che è inutile. Nei database questo è il motivo dell'utilizzo di alberi B + per evitare la scansione dei dati degli oggetti.

B + Gli alberi separano le chiavi dai dati.

Ma se la dimensione dei tuoi dati è inferiore, puoi archiviarli con la chiave, che è ciò che fa l'albero B.


1
"Se si utilizza B tree qui, la maggior parte del tempo è dedicato alla scansione delle pagine con i dati" - non necessario. I nodi B-tree possono mantenere solo "puntatori" ai dati su disco, non ai dati stessi.
TT_

2

La distinzione principale tra albero B e albero B + è che l'albero B elimina l'archiviazione ridondante dei valori della chiave di ricerca. Poiché le chiavi di ricerca non vengono ripetute nell'albero B, potremmo non essere in grado di memorizzare l'indice utilizzando un minor numero di nodi dell'albero rispetto all'indice albero B + corrispondente.Tuttavia, poiché la chiave di ricerca che appare nei nodi non foglia non appare in nessun'altra parte dell'albero B, siamo costretti a includere un campo puntatore aggiuntivo per ogni chiave di ricerca in un nodo non foglia. Sono vantaggi in termini di spazio per l'albero a B, poiché la ripetizione non si verifica e può essere utilizzata per indici di grandi dimensioni.


1
Interessante, i pensieri sulla ripetizione sono unici tra le risposte qui e hanno più senso del fatto che l'attraversamento in ordine di b + tree sia più efficiente rispetto all'attraversamento in ordine di un b-tree. Per quanto ne so, o non è del tutto giusto, o non è l'intera storia, poiché nell'ordine in cui l'attraversamento di un albero b è O (n) e trovare il nodo più piccolo in un albero b + è O (registro n) e quindi attraversare ogni foglia è O (n) in aggiunta a quello. Tuttavia, se indicizzi qualcosa con un piccolo intervallo di valori, come un campo booleano, l'albero b + ha molto più senso di un albero b a causa della sua duplicazione.
Eric

1

Un albero B + è un albero bilanciato in cui ogni percorso dalla radice dell'albero a una foglia ha la stessa lunghezza e ogni nodo non foglia dell'albero ha tra [n / 2] e [n] figli, dove n è riparato per un albero particolare. Contiene pagine indice e pagine dati. Gli alberi binari hanno solo due figli per nodo genitore, gli alberi B + possono avere un numero variabile di figli per ciascun nodo genitore


1
Solo per chiarezza, gli alberi B non sono alberi binari. In effetti, gli alberi B e gli alberi B + sono più vicini tra loro nella costruzione e nell'uso rispetto agli alberi binari. Gli articoli del wiki possono aiutare a cancellare le definizioni - B + Tree , B Tree e Binary Tree
uutsav

1

Un possibile utilizzo degli alberi B + è che è adatto a situazioni in cui l'albero cresce così grande da non rientrare nella memoria disponibile. Pertanto, ti aspetteresti generalmente di eseguire più I / O.
Accade spesso che un albero B + venga utilizzato anche quando si adatta effettivamente alla memoria e quindi il gestore della cache potrebbe tenerlo lì permanentemente. Ma questo è un caso speciale, non generale, e la politica di memorizzazione nella cache è separata dalla manutenzione dell'albero B + in quanto tale.

Inoltre, in un albero B +, le pagine foglia sono collegate tra loro in un elenco collegato (o elenco doppiamente collegato), che ottimizza gli spostamenti (per ricerche di intervallo, ordinamento, ecc.). Quindi il numero di puntatori è una funzione dell'algoritmo specifico che viene utilizzato.


Questo è in risposta alla domanda sul perché non dovremmo usare alberi B anziché alberi B + ovunque :)
programmatore di stack

3
Ma per quanto ne sappiamo, hai descritto solo un lato, con la tua risposta i b-tree potrebbero funzionare esattamente allo stesso modo. L'OP ha chiesto di spiegare le differenze e hai parlato solo dell'una e non dell'altra. Non puoi avere un diagramma di Venn con un cerchio!
Malfist,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.