- Strom je parametrizován přirozeným číslem
- B strom je definován následujícími podmínkami:
- V uzlech může být uloženo více klíčů, maximálně však . Ve všech uzlech mimo kořene však musí být uloženo minimálně klíčů (pokud je strom neprázdný je v kořeni vždy alespoň jeden klíč)
- Pokud uzel obsahuje klíčů, má (je list) nebo potomků
- Všechny listy ve stromu jsou ve stejné hloubce
- Klíče jsou v uzlu uspořádány vzestupně
- ()
- Výška B-stromu: B strom s klíči a má výšku nejvýše
- B-stromy jsou často používány v databázových systémech.
- Zaměřují se na vlastnost snížení operací s diskem.
Úvod
Vlastnosti
Implementace
Operace s B-stromy
Vyhledávání -
- Zobecnění vyhledávání ve vyhledávacím stromě. Rozhodování, do kterého podstromu se vydáme je nyní založeno na porovnávání s polem klíčů, nikoliv jenom s jedním klíčem.
- Neúspěsné vyhledávání končí v listu.
Vyhledávání
Vložení prvku (dvoufázově) -
- Uzel, kam budeme vkládat, nalezneme pomocí upravené operace b-tree-search, která vrací pointer na uzel , a index v poli
x.keys
, na který budeme vkládat. - Vložení provedeme posunutím prvků v tomto poli od indexu doprava a na uvolněné místo zapíšeme .
- Položku
x.n
zvětšíme o
- Problém:
- Uzel je již zaplněný -
x.n == 2t-1
, vložením klíče dox
bychom v tomto vrcholu měli2t
klíčů a porušili bychom podmínku z definice B-stromu.
- Rozdělením uzlu
x
na dva uzly, každý st-1
klíči, a přesunem jednoho klíče do rodiče uzlux
. - Po rozdělení můžeme
k
vložit do příslušného uzlu.
- Uzel je již zaplněný -
- Problém:
- Rodič uzlu
x
ovšem může být před přidáním také zaplněn. - Před začleněním jej tedy musíme také rozdělit.
- Tím může vzniknout kaskáda dělení zaplněných uzlů, která může skončit až v kořeni.
- Pokud je zaplněn kořen, rozdělíme jej a vytvoříme nový kořen, který bude obsahovat jenom jeden klíč.
- Rodič uzlu
Vložení prvku (jednofázově) -
- Idea: Pokud v první fázi vkládání rozdělíme každý zaplněný uzel, na který narazíme (a to těsně před tím, než na něj během vyhledávání přejdeme), tak nikdy nenarazíme na problém přidávání do zaplněného uzlu.
- Jsme-li během vyhledávání v uzlu , který není zaplněn, a víme, že máme pokračovat s vyhledáváním do jeho potomka , který je zaplněn, pak rozdělíme ještě předtím, než na něj přejdeme. Protože není zaplněn, můžeme klíč, který dělením vznikne, vložit do bez nutnosti tento uzel dělit. Tím zabráníme možné kaskádě dělení uzlů.
- Pro vkládání máme dvě procedury: tree-insert, která bere jako argument strom a vypořádá se se situací, kdy je kořen zaplněný. Druhá procedura, tree-insert-nonfull již bere jako argument uzel: to je kořen podstromu, do kterého vkládáme. O něm předpokládáme, že není zaplněný
Ukázka vložení prvku (jednofázově)
Vkládání
Mazání prvku (dvoufázové)
- 1. fáze - vlastní smazání:
- Operací
tree-search
nalezneme uzel a index , tak, žek == x.keys[i]
- Pokud je list, provedeme smazání tak, že jej odstraníme z
x.keys
(posunutí všech prvků na indexech vyšší než o jedna doleva). Podobně upravíme i položkyx.data
ax.n
snížíme o . Uzel pošleme do druhé fáze.) - Pokud je interní uzel, nahradíme
x.keys[i]
, který je určitě neprázný. Největší klíč v tomto stromu je pořádkovým předchůdcem klíče . Klíč se původně nacházel v listu, ze kterého ho odstraníme tak, jako v bodě (včetně toho, že list pošleme do druhé fáze).
- Operací
- 2. fáze - úprava počtu klíčů v uzlech:
- Je-li kořen, nebo je-li
x.n >= t-1
, algoritmus končí - Má-li sourozence a
y.n > t-1
, pak provedeme přelití jednoho klíče (a jeho satelitních dat) mezi a jejich rodičem. Obrázek ukazuje situaci, kdy je levým sourozencem , opačná situace je symetrická. Po přelití algoritmus končí. - Oba sourozenci mají
t-1
prvků. Vybereme si jednoho souseda a spojíme ho s uzlem a jedním klíčem z rodiče do nového uzlu s2 * t - 1
klíči. Na následujícím obrázku je pravým sourozencem (opačná situace je symetrická). Po spojení uzlů pokračujeme novou iterací fáze 2, do které pošleme rodiče uzlu . Z rodiče jsme totiž odebrali jeden klíč a jeho počet klíčů se tak mohl dostat podt - 1
- Je-li kořen, nebo je-li
Mazání
Navigace
Předchozí: AVL stromy, operace a jejich složitost Následující: Hashovací tabulky, metody řešení kolizí Celý okruh: 1. Teoretické základy informačních technologií