B⁺-träd är en datastruktur baserad på ett B-träd , ett balanserat sökträd med ett variabelt men ofta stort antal barn per nod. Ett B⁺-träd består av en rot, inre noder och löv, roten kan vara antingen ett löv eller en nod med två eller flera barn.
Inledningsvis var strukturen tänkt att lagra data för effektiv sökning i en blockorienterad lagringsmiljö - i synnerhet för filsystem; tillämpningen beror på det faktum att, till skillnad från binära sökträd, har B⁺-träd en mycket hög förgreningsfaktor (antalet pekare från en föräldernod till barn är vanligtvis i storleksordningen 100 eller mer), vilket minskar antalet I/O-operationer som kräver sökning efter ett element i trädet.
En variant av B⁺-trädet, där alla värden lagrades i bladnoder, granskades systematiskt 1979 [1] och noterade att sådana strukturer har använts av IBM i VSAM stordatorfilåtkomstteknologi sedan åtminstone 1973.
Strukturen används ofta i filsystem - NTFS , ReiserFS , NSS , XFS , JFS , ReFS och BFS använder den här typen av träd för att indexera metadata; BeFS använder också B⁺-träd för att lagra kataloger. Relationella databashanteringssystem som DB2 , Informix , Microsoft SQL Server , Oracle Database (från version 8), Adaptive Server Enterprise och SQLite stöder den här typen av träd för tabellindex. Bland NoSQL DBMS:er som arbetar med nyckel-värde-modellen är datastrukturen implementerad för dataåtkomst i CouchDB , MongoDB (vid användning av WiredTiger- lagringsundersystemet ) och Tokyo Cabinet .
Ett B⁺-träd är ett sökträd med balanserad -är ordning (eller grad) som uppfyller följande egenskaper:
Att bygga ett B⁺-träd kan kräva ombyggnad av den mellanliggande strukturen, detta beror på att antalet nycklar i varje nod (förutom roten) måste vara från till var är graden (eller ordningen) av trädet. När du försöker infoga den ( )-te nyckeln i noden, blir det nödvändigt att separera denna nod; den ( )-te nyckeln, som är placerad på den intilliggande nivån av trädet, fungerar som separatornyckeln för de bildade grenarna . Ett specialfall är uppdelningen av roten, eftersom i det här fallet ökar antalet nivåer av trädet. En egenskap med att klyva ett blad av ett B⁺-träd är att det är uppdelat i ojämna delar. Att dela en intern nod eller rot resulterar i noder med lika många nycklar Att dela ett löv kan orsaka en "kedjereaktion" av delande noder, som slutar vid roten.
Roten till B⁺-trädet är utgångspunkten för hela värdeintervallet, där varje intern nod är ett delintervall.
Låt oss till exempel säga att vi behöver hitta värdet på en nyckel i ett B⁺-träd. För att göra detta letar vi efter en lövnod som innehåller värdet. Vid varje intern nod måste vi ta reda på vilken efterföljande barnnod som ska följas, den interna noden i B⁺-trädet har högst barn, där var och en av dem representerar en separat delintervall. Lämplig nod väljs genom att söka i nodens nyckelvärden:
Funktion : sök ( k ) returnera trädsökning ( k , rot ); Funktion : tree_search ( k , nod ) om noden är ett löv , returnera noden ; switch k do case k < k [ 0 ] return tree_search ( k , p [ 0 ]); fall k [ i ] ≤ k < k [ i + 1 ] returnera trädsökning ( k , p [ i + 1 ]); fall k [ d ] ≤ k returnera trädsökning ( k , p [ d + 1 ]);(Denna pseudokod förutsätter att dubbletter ignoreras.)
För att lägga till en ny nyckel eller en ny post måste du först hitta noden där du vill lägga till dem. I det här fallet är algoritmen:
B-träd, till skillnad från B⁺-träd, expanderar från sidan av roten, inte löven.
För att radera en nyckel eller post måste du först hitta lövnoden där den finns. Algoritm för att ta bort från en lövnod:
Unionen kan sträcka sig till roten, i vilket fall trädets höjd minskar.
Beräkningskomplexiteten för varje operation i värsta fall: var är trädets ordning eller förgreningsfaktorn; är antalet element i trädet av grenar i trädets noder.
Träd (datastruktur) | |
---|---|
Binära träd | |
Självbalanserande binära träd |
|
B-träd | |
prefix träd |
|
Binär uppdelning av utrymme | |
Icke-binära träd |
|
Bryter upp utrymmet |
|
Andra träd |
|
Algoritmer |