Albero B nella struttura dati: ricerca, inserimento, eliminazione
โก Riepilogo intelligente
L'albero B nelle strutture dati รจ un albero autobilanciante che mantiene i dati ordinati per velocizzare le operazioni di ricerca, inserimento ed eliminazione su disco. Questo testo illustra le regole dell'albero B, la sua storia e gli algoritmi di ricerca, inserimento ed eliminazione con esempi.
Cos'รจ un albero B?
B Albero ร una struttura dati autobilanciante basata su un insieme specifico di regole per la ricerca, l'inserimento e la cancellazione dei dati in modo piรน rapido ed efficiente in termini di memoria. Per raggiungere questo obiettivo, vengono seguite le seguenti regole per creare un albero B.
Un albero B รจ un tipo speciale di albero in una struttura dati. Questo metodo fu introdotto per la prima volta nel 1972 da McCreight e Bayer, che lo chiamarono Albero di ricerca m-way bilanciato in altezza. Consente di mantenere i dati ordinati e permette di eseguire diverse operazioni come inserimento, ricerca ed eliminazione in tempi ridotti.
Regole per B-Tree
Ecco le regole importanti per la creazione di un albero B:
- Tutte le foglie verranno create allo stesso livello.
- Un albero B รจ determinato da un numero di grado, che รจ anche chiamato โordineโ (specificato da un attore esterno, come un programmatore), indicato come
min poi. Il valore dimdipende dalla dimensione del blocco sul disco su cui si trovano principalmente i dati. - Il sottoalbero sinistro del nodo avrร valori inferiori rispetto al lato destro del sottoalbero. Ciรฒ significa che anche i nodi vengono ordinati in ordine crescente da sinistra a destra.
- Il numero massimo di chiavi che un nodo radice, cosรฌ come i suoi nodi figli, possono contenere viene calcolato con la seguente formula:
m โ 1. Per esempio:m = 4 max keys: 4 โ 1 = 3
- Ogni nodo, eccetto la radice, deve contenere un numero minimo di chiavi di
[m/2] โ 1. Per esempio:m = 4 min keys: 4/2 โ 1 = 1
- Il numero massimo di nodi figli che un nodo puรฒ avere รจ uguale al suo grado, ovvero
m. - Il numero minimo di figli che un nodo puรฒ avere รจ la metร dell'ordine, ovvero m/2 (viene preso il valore massimo).
- Tutte le chiavi in โโun nodo sono ordinate in ordine crescente.
Perchรฉ utilizzare B-Tree
Ecco i motivi per utilizzare un albero B:
- Riduce il numero di operazioni di lettura effettuate sul disco.
- Gli alberi B possono essere facilmente ottimizzati per adattare le loro dimensioni (ovvero il numero di nodi figli) in base alle dimensioni del disco.
- Si tratta di una tecnica appositamente progettata per gestire una grande quantitร di dati.
- ร un algoritmo utile per database e file system.
- Un'ottima scelta quando si tratta di leggere e scrivere grandi quantitร di dati.
Storia di B-Tree
- I dati vengono memorizzati sul disco in blocchi. Questi dati, quando vengono trasferiti nella memoria principale (o RAM), costituiscono una struttura dati.
- Nel caso di grandi quantitร di dati, la ricerca di un singolo record sul disco richiede la lettura dell'intero disco; ciรฒ aumenta i tempi di elaborazione e il consumo di memoria principale a causa dell'elevata frequenza di accesso al disco e delle dimensioni dei dati.
- Per ovviare a questo problema, vengono create tabelle indice che salvano il riferimento ai record in base ai blocchi in cui risiedono. Ciรฒ riduce drasticamente il tempo e il consumo di memoria.
- Poichรฉ disponiamo di dati enormi, possiamo creare tabelle indice multilivello.
- ร possibile progettare un indice multilivello utilizzando un albero B per la chiaveping I dati sono stati ordinati in modo autobilanciante.
Cerca Operaproduzione
L'operazione di ricerca รจ l'operazione piรน semplice su un albero B. Viene applicato il seguente algoritmo:
- Sia "k" la chiave (il valore) da cercare.
- Inizia la ricerca dalla radice e procedi ricorsivamente verso il basso.
- Se k รจ minore del valore della radice, cerca nel sottoalbero sinistro; se k รจ maggiore del valore della radice, cerca nel sottoalbero destro.
- Se il nodo ha il k trovato, restituisci semplicemente il nodo.
- Se la k non si trova nel nodo, attraversa fino al bambino con una chiave maggiore.
- Se k non si trova nell'albero, restituiamo NULL.
inserire Operaproduzione
Poichรฉ un albero B รจ un albero autobilanciante, non รจ possibile inserire forzatamente una chiave in un nodo qualsiasi. Si applica il seguente algoritmo:
- Esegui l'operazione di ricerca e trova il luogo di inserimento appropriato.
- Inserisci la nuova chiave nella posizione corretta, ma se il nodo ha giร un numero massimo di chiavi:
- Il nodo, insieme alla chiave appena inserita, si dividerร dall'elemento centrale.
- L'elemento centrale diventerร il genitore per gli altri due nodi figli.
- I nodi devono riorganizzare le chiavi in โโordine crescente.
๐ก SUGGERIMENTO: Quello che segue รจ non รจ un Vero riguardo all'algoritmo di inserimento: "Poichรฉ il nodo รจ pieno, verrร suddiviso e quindi verrร inserito un nuovo valore". La chiave viene inserita per prima, e solo successivamente il nodo viene suddiviso se supera il numero massimo di chiavi.
Nell'esempio sopra:
- Cerca la posizione appropriata nel nodo per la chiave.
- Inserisci la chiave nel nodo di destinazione e verifica le regole.
- Dopo l'inserimento, il nodo ha un numero di chiavi maggiore o uguale al numero minimo, ovvero 1? In questo caso, sรฌ. Controlla la regola successiva.
- Dopo l'inserimento, il nodo ha piรน del numero massimo di chiavi, ovvero 3? In questo caso, no. Ciรฒ significa che l'albero B non viola alcuna regola e l'inserimento รจ completo.
Nell'esempio sopra:
- Il nodo ha raggiunto il numero massimo di chiavi.
- Il nodo si dividerร e la chiave centrale diventerร il nodo radice degli altri due nodi.
- Nel caso di un numero pari di chiavi, il nodo centrale verrร selezionato in base alla preferenza a sinistra o a destra.
Nell'esempio sopra:
- Il nodo ha meno del numero massimo di chiavi.
- Il numero 1 viene inserito accanto al 3, ma la regola dell'ordine crescente viene violata.
- Per risolvere questo problema, le chiavi vengono ordinate.
Allo stesso modo, 13 e 2 possono essere inseriti facilmente nel nodo poichรฉ soddisfano la regola "meno di chiavi massime" per i nodi.
Nell'esempio sopra:
- Il nodo ha chiavi uguali a max keys.
- La chiave viene inserita nel nodo di destinazione, ma viola la regola del numero massimo di chiavi.
- Il nodo di destinazione รจ diviso e la chiave centrale per polarizzazione a sinistra รจ ora il genitore dei nuovi nodi figli.
- I nuovi nodi sono disposti in ordine crescente.
Allo stesso modo, in base alle regole e ai casi sopra indicati, il resto dei valori puรฒ essere inserito facilmente nel B Tree.
Elimina Operaproduzione
L'operazione di eliminazione prevede piรน regole rispetto alle operazioni di inserimento e ricerca. Si applica il seguente algoritmo:
- Esegui l'operazione di ricerca e trova la chiave di destinazione nei nodi.
- Vengono applicate tre condizioni in base alla posizione della chiave di destinazione, come spiegato nelle sezioni seguenti.
Se la chiave di destinazione si trova nel nodo foglia
- Target รจ nel nodo foglia, piรน di chiavi minime. Eliminando questo non violerร la proprietร dell'albero B.
- Target si trova nel nodo foglia e ha un numero minimo di nodi chiave. Eliminandolo si violerebbe la proprietร dell'albero B.
- Il nodo di destinazione puรฒ prendere in prestito una chiave dal nodo immediatamente a sinistra o dal nodo immediatamente a destra (fratello).
- Il fratello dirร sรฌ se ha piรน del numero minimo di chiavi.
- La chiave verrร presa in prestito dal nodo padre, il valore massimo verrร trasferito al padre, il valore massimo del nodo padre verrร trasferito al nodo di destinazione e il valore di destinazione verrร rimosso.
- Target รจ nel nodo foglia, ma nessun fratello ha piรน del numero minimo di chiavi: cerca la chiave, unisci con i fratelli e il minimo dei nodi padre, il numero totale di chiavi sarร ora maggiore del minimo e la chiave di destinazione verrร sostituita con il minimo di un nodo padre.
Se la chiave di destinazione si trova in un nodo interno
- Scegliere un predecessore in ordine o un successore in ordine.
- Nel caso di un predecessore in ordine, verrร selezionata la chiave massima dal suo sottoalbero sinistro.
- Nel caso di un successore in ordine, verrร selezionata la chiave minima dal suo sottoalbero destro.
- Se il predecessore in ordine della chiave di destinazione ha piรน chiavi del numero minimo, solo allora puรฒ sostituire la chiave di destinazione con il numero massimo del predecessore in ordine.
- Se il predecessore in ordine della chiave di destinazione non ha piรน di min chiavi, cerca la chiave minima del successore in ordine.
- Se il predecessore e il successore in ordine della chiave di destinazione hanno entrambi meno di chiavi minime, unire il predecessore e il successore.
Se la chiave di destinazione si trova in un nodo radice
- Sostituire con l'elemento massimo del sottoalbero predecessore in ordine.
- Se, dopo la cancellazione, il nodo di destinazione ha meno di min chiavi, allora il nodo di destinazione prenderร in prestito il valore massimo dal suo fratello tramite il genitore di quest'ultimo.
- Il valore massimo del genitore verrร preso dal target, ma con i nodi del valore massimo del fratello.
Ora comprendiamo l'operazione di eliminazione con un esempio.
Il diagramma sopra riportato mostra diversi casi dell'operazione di cancellazione in un albero B. Questo albero B รจ di ordine 5, il che significa che il numero minimo di nodi figli che un nodo puรฒ avere รจ 3, e il numero massimo di nodi figli che un nodo puรฒ avere รจ 5. Il numero minimo e massimo di chiavi che un nodo puรฒ avere รจ rispettivamente 2 e 4.
Nell'esempio sopra:
- Il nodo di destinazione possiede la chiave di destinazione da eliminare.
- Il nodo di destinazione ha piรน chiavi del numero minimo di chiavi.
- ร sufficiente eliminare la chiave.
Nell'esempio sopra:
- Il nodo di destinazione ha chiavi pari al numero minimo di chiavi, quindi non possiamo eliminarlo direttamente poichรฉ ciรฒ violerebbe le condizioni.
Ora, il diagramma seguente spiega come eliminare questa chiave:
- Il nodo di destinazione prenderร in prestito una chiave da un fratello immediato, in questo caso il predecessore in ordine (fratello sinistro), poichรฉ non ha alcun successore in ordine (fratello destro).
- Il valore massimo del predecessore in ordine verrร trasferito al genitore, e il genitore trasferirร il valore massimo al nodo di destinazione (vedere il diagramma sottostante).
L'esempio seguente illustra come eliminare una chiave che necessita di un valore dal suo successore ordinato.
- Il nodo di destinazione prenderร in prestito una chiave da un fratello immediato, in questo caso il successore in ordine (fratello destro), perchรฉ il suo predecessore in ordine (fratello sinistro) ha chiavi uguali alle chiavi minime.
- Il valore minimo del successore in ordine verrร trasferito al genitore e il genitore trasferirร il valore massimo al nodo di destinazione.
Nell'esempio seguente, il nodo di destinazione non ha alcun nodo fratello che possa cedergli la propria chiave. Pertanto, รจ necessaria l'unione. Consultare la procedura per eliminare tale chiave:
- Unisci il nodo di destinazione con uno qualsiasi dei suoi fratelli diretti, insieme alla chiave del nodo padre.
- Viene selezionata la chiave del nodo padre che si trova tra i due nodi da unire.
- Elimina la chiave di destinazione dal nodo unito.
Elimina Operazione Pseudo Code
private int removeBiggestElement() { if (root has no child) remove and return the last element else { answer = subset[childCount-1].removeBiggestElement() if (subset[childCount-1].dataCount < MINIMUM) fixShort (childCount-1) return answer } }
Produzione: L'elemento piรน grande viene eliminato dal B-Tree.













