B⁺-træ er en datastruktur baseret på et B-træ , et balanceret søgetræ med et variabelt, men ofte stort antal børn pr. node. Et B⁺-træ består af en rod, indre noder og blade, roden kan enten være et blad eller en knude med to eller flere børn.
Oprindeligt var strukturen beregnet til at lagre data til effektiv søgning i et blokorienteret lagringsmiljø - især til filsystemer; anvendelse skyldes det faktum, at i modsætning til binære søgetræer har B⁺-træer en meget høj forgreningsfaktor (antallet af pointere fra en overordnet node til børn er normalt i størrelsesordenen 100 eller mere), hvilket reducerer antallet af I/O-operationer, der kræver søgning efter et element i træet.
En variant af B⁺-træet, hvor alle værdier blev gemt i bladknuder, blev systematisk gennemgået i 1979 [1] , idet det bemærkes, at sådanne strukturer er blevet brugt af IBM i VSAM mainframe filadgangsteknologi siden mindst 1973.
Strukturen er meget brugt i filsystemer - NTFS , ReiserFS , NSS , XFS , JFS , ReFS og BFS bruger denne type træ til indeksering af metadata; BeFS bruger også B⁺-træer til at gemme mapper. Relationelle databasestyringssystemer såsom DB2 , Informix , Microsoft SQL Server , Oracle Database (fra version 8), Adaptive Server Enterprise og SQLite understøtter denne type træ til tabelindekser. Blandt NoSQL DBMS'er, der arbejder med nøgleværdi-modellen, er datastrukturen implementeret til dataadgang i CouchDB , MongoDB (ved brug af WiredTiger- lagringsundersystemet ) og Tokyo Cabinet .
Et B⁺-træ er et afbalanceret -ær orden (eller grad) søgetræ, der opfylder følgende egenskaber:
Opbygning af et B⁺-træ kan kræve ombygning af den mellemliggende struktur, dette skyldes, at antallet af nøgler i hver node (undtagen roden) skal være fra til hvor er graden (eller rækkefølgen) af træet. Når du forsøger at indsætte den ( )-te nøgle i noden, bliver det nødvendigt at adskille denne node; den ( )-te nøgle, som er placeret på træets tilstødende lag, fungerer som separatornøgle for de dannede grene . Et særligt tilfælde er opdelingen af roden, da antallet af træets lag stiger i dette tilfælde. Et træk ved at flække et blad af et B⁺-træ er, at det er opdelt i ulige dele. Opdeling af en intern node eller rod resulterer i noder med lige mange nøgler. Opsplitning af et blad kan forårsage en "kædereaktion" af opsplitning af noder, der ender ved roden.
Roden af B⁺-træet er udgangspunktet for hele rækken af værdier, hvor hver intern knude er et underinterval.
Lad os f.eks. sige, at vi skal finde værdien af en nøgle i et B⁺-træ. For at gøre dette leder vi efter en bladknude, der indeholder værdien. Ved hver indre knude skal vi finde ud af, hvilken efterfølgende underknude, der skal følges, B⁺-træets indre knude har højst børn, hvor hver af dem repræsenterer en separat delinterval. Den relevante node vælges ved at søge i nodens nøgleværdier:
Funktion : søg ( k ) returner træsøgning ( k , rod ); Funktion : tree_search ( k , node ) hvis node er et blad, så returner node ; switch k do case k < k [ 0 ] return tree_search ( k , p [ 0 ]); case k [ i ] ≤ k < k [ i + 1 ] returner træ_søgning ( k , p [ i + 1 ]); case k [ d ] ≤ k returner træ_søgning ( k , p [ d + 1 ]);(Denne pseudokode antager, at dubletter ignoreres.)
For at tilføje en ny nøgle eller en ny post skal du først finde den node, hvor du vil tilføje dem. I dette tilfælde er algoritmen:
B-træer, i modsætning til B⁺-træer, udvider sig fra siden af roden, ikke bladene.
For at slette en nøgle eller post skal du først finde den bladknude, hvor den ligger. Algoritme til fjernelse fra en bladknude:
Unionen kan strække sig til roden, i hvilket tilfælde træets højde falder.
Den beregningsmæssige kompleksitet af hver operation i værste fald: hvor er rækkefølgen af træet eller forgreningsfaktoren; er antallet af elementer i træet af grene i træets noder.
Træ (datastruktur) | |
---|---|
Binære træer | |
Selvbalancerende binære træer |
|
B-træer | |
præfiks træer |
|
Binær opdeling af rummet | |
Ikke-binære træer |
|
At bryde rummet op |
|
Andre træer |
|
Algoritmer |
|