Come inserire i record con le chiavi di un albero B + inizialmente vuoto?


11

Mostra il risultato dell'inserimento dei record con le chiavi nell'ordine (1, 2, 3, 4, 5) in un B + inizialmente vuoto - ordine m = 3. In caso di overflow, dividere il nodo e non ridistribuire chiavi per i vicini. È possibile inserire i record con le chiavi in ​​un ordine diverso per avere un albero di altezza inferiore?

Da Relational DBMS Internals, capitolo 5: Organizzazioni dinamiche a struttura ad albero, p.50

Non sono bravo in questo, ma ho provato a fare ≤ a sinistra e> a destra:

Fino all'inserimento di 1,2:

inserisci qui la descrizione dell'immagine

Quindi per quanto dobbiamo dividere il nodo e non ridistribuire le chiavi ai vicini (lo capisco come nodi figlio) ho inserito solo a destra della cella con 2:

inserisci qui la descrizione dell'immagine

E ho continuato a fare lo stesso con l'inserimento di 5:

inserisci qui la descrizione dell'immagine

Ma questo è abbastanza strano, non ho mai visto nodi vuoti come questi ... E non so se rispetti alcune proprietà B-tree molto basilari:

  • ogni nodo ha al massimo (m-1) chiavi e almeno (⌈ (m / 2) ⌉-1) a meno che una chiave non possa essere vuota e la comprenderei come "puntatore".

Primo tentativo: errore nell'ordine ha rivelato un albero ambiguo

All'inizio ho capito male che cosa fosse un "ordine" (il numero massimo di figli per nodo). Quindi ho pensato che un nodo potesse avere tre spazi (e quindi 4 figli. Stavo creando un albero di ordine 4 penso:

Fino all'inserimento di 1,2,3:

inserisci qui la descrizione dell'immagine

Inserimento di 4, per quanto dobbiamo dividere il nodo e non ridistribuire le chiavi ai vicini (il che sembra contraddittorio) Lascerei 1,2,3 e 4,5 sulla foglia destra dopo 3:

B albero dell'ordine 3 dopo aver inserito 4 e 5

Risposte:


6

Penso che tu abbia la tua creazione della pagina sottosopra. Quando un nodo divide non crea più nodi verso il basso della gerarchia (nodi figlio nella vostra nomenclatura). Invece crea più verso l'alto , verso la radice. Come dice il libro

Si noti che la crescita è nella parte superiore dell'albero e questa è una caratteristica intrinseca di un albero B per garantire le proprietà importanti di avere sempre tutte le foglie allo stesso livello e ogni nodo diverso dalla radice è almeno Pieno al 50%.

(La mia enfasi.)

Dall'ebook collegato:

Definizione 5.1 AB - albero dell'ordine m (m ≥ 3) ... ogni nodo contiene al massimo m - 1 chiavi

L'esercizio è per m = 3, quindi al massimo 2 chiavi per nodo.

I primi due tasti sono facili: vanno nella prima pagina:

A:[1,2]

Userò l'arte ASCII. Etichetta ogni pagina nella sequenza in cui sono state create e mostrerò i tasti / puntatori all'interno della pagina. Quindi la pagina P contenente i valori chiave k1 e k2 sarà P:[k1,k2].

Ora arriva il tasto 3. Secondo la Sezione 5.2.1 ... Inserimento, il primo compito è la ricerca. Questo determina che la chiave 3 dovrebbe essere nella pagina A - l'unica pagina che abbiamo. Inoltre "se [quel nodo] è pieno, sarà diviso in due nodi." La pagina è piena, quindi deve essere divisa. Ora abbiamo

A:[1,2]    B:[3, ]

Ma questo non è un albero! Come dice il libro:

il puntatore al [nuovo nodo], .. viene inserito nel nodo padre .. del [nodo corrente], ripetendo l'operazione di inserimento in questo nodo [cioè il nodo padre]. Questo processo di divisione e spostamento può continuare, se necessario, fino alla radice e, se necessario, suddividere, verrà creato un nuovo nodo radice.

(La mia enfasi per mostrare l'elaborazione continua sull'albero verso la radice, non verso le foglie.)

Quindi dobbiamo mettere un puntatore alla nuova pagina (B) nel padre della pagina corrente (A). Ci deve essere un nuovo nodo radice:

      C:[2,3]
      /     \
A:[1,2]    B:[3, ]

Ho i puntatori nelle pagine non foglia che puntano al valore più alto in un nodo figlio (figlio). Il testo collegato può fare diversamente, ma il risultato sarà equivalente.

Il valore chiave 4 arriva; seguendo l'algoritmo cerchiamo per trovare su quale pagina dovrebbe trovarsi. Dovrebbe essere la pagina B. C'è spazio per esso, quindi aggiorniamo quella pagina e il puntatore nella pagina C:

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]

Successivamente inseriamo la chiave 5. Dovrebbe andare nella pagina B ma è piena. Pertanto si divide

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]   D:[5, ]

Dobbiamo aggiornare il nodo padre. Anche questo è pieno, quindi si divide:

      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

La divisione si propaga e si forma un nuovo nodo radice:

            F:[4,5]
            /     \
      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

Crescendo verso l'alto l'albero mantiene la stessa profondità in ogni ramo. Questo è importante per prestazioni prevedibili. (Alcuni dicono che la B in B-Tree sta per "bilanciato" proprio per questo motivo.)


Per quanto riguarda la seconda parte: "È possibile inserire i record con le chiavi in ​​un ordine diverso per avere un albero di altezza inferiore?" Con 5 chiavi e due chiavi per nodo abbiamo bisogno di almeno 3 nodi foglia per contenere tutti i valori e un'altezza di 3 per formare l'albero. Quindi la mia disposizione è ottimale per i dati, la sequenza e l'algoritmo forniti.

Il libro utilizza una disposizione del puntatore molto diversa da quella che uso e una diversa disposizione della divisione della pagina. Questo sarà significativo, portando a pagine parzialmente piene. Che ci sia una sezione a pagina 42 chiamata "Caricamento dei dati" che mostra come ottenere pagine più piene caricando la sequenza di tasti supporta il mio sospetto. Tuttavia, spero di averti dato sufficienti indicazioni e sarai in grado di utilizzare la struttura dei puntatori del libro per risolverlo da solo.


Mi sono imbattuto in questa simulazione interattiva di come cresce un B-Tree.

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.