B-strom: Porovnání verzí

Smazaný obsah Přidaný obsah
mBez shrnutí editace
JAnDbot (diskuse | příspěvky)
m robot: přidáno {{Autoritní data}}; kosmetické úpravy
 
Řádek 22:
 
== Princip uložení dat ==
 
Data jsou ve stromu uložena jako setříděné hodnoty, které rozdělují strom na jednotlivé [[Strom (datová struktura)#Podstrom|podstromy]]. Například pokud nějaký uzel má tři potomky, musí být v&nbsp;tomto uzlu uloženy dva klíče ''k''<sub>1</sub> a ''k''<sub>2</sub>, které budou uzel rozdělovat. Všechny hodnoty které jsou menší než ''k''<sub>1</sub> musí být uloženy v&nbsp;levém podstromu, hodnoty které jsou větší než ''k''<sub>1</sub> a menší než ''k''<sub>2</sub> musí být uloženy v&nbsp;prostředním podstromu, a konečně všechny hodnoty větší než ''k''<sub>2</sub> musí být v&nbsp;pravém podstromu. Na tyto podstromy jsou samozřejmě v&nbsp;uzlu uloženy ukazatele.
 
Řádek 40 ⟶ 39:
 
== Operace se stromem ==
S B-stromem jsou definovány tak jako v&nbsp;každém jiném stromu základní operace pro vyhledávání, vkládání a mazání dat (klíčů) ze stromu. Mějme strom této struktury : [[Soubor:B-tree-definition.png|thumbnáhled|350px|leftvlevo|Definovaný B-strom]]Písmenka ''k''<sub>i</sub> v&nbsp;něm zastupují klíče, písmenka ''c''<sub>i</sub> značí odkaz na potomky (podstromy). Tento konkrétní strom má jeden klíč v&nbsp;kořenu, tento klíč pak rozděluje zbytek stromu na dvě části – jednu kde jsou uloženy všechny hodnoty které jsou menší než tento klíč, a druhou kde jsou uloženy hodnoty větší. Tyto podstromy jsou pak děleny stejným způsobem do dalších podstromů.{{Clear}}
 
=== Operace vyhledávání ===
Řádek 49 ⟶ 48:
## Pokud je hodnota tohoto klíče větší a '''aktuální uzel není listem''', zapamatujeme si ukazatel vlevo od tohoto klíče. Pokud je aktuální uzel zároveň listem, skočíme na krok číslo 5 (není již kde vyhledávat).
# V případě, že máme z&nbsp;minulého kroku ukazatel, následujeme ho a pokračujeme krokem jedna. V&nbsp;případě, že ukazatel není k&nbsp;dispozici, znamená to, že musíme následovat ukazatel, který je nejvíce vpravo (hledaná hodnota je větší než klíč s&nbsp;největší hodnotou v&nbsp;tomto uzlu).
# Nalezli jsme požadovanou hodnotu, končíme. [[Soubor:B-tree-search.png|thumbnáhled|320px|rightvpravo|Ukázka vyhledávání v B-stromu]]
# Nenalezli jsme požadovanou hodnotu, končíme.
 
Řádek 64 ⟶ 63:
 
Samozřejmě, že pokud přidáváme klíč do rodiče, musíme zkontrolovat, jestli se do něj vejde a pokud ne, musíme ho rozdělit stejným způsobem. Pokud se takovýmto postupem dostaneme až do kořene, musíme vytvořit nový kořen s&nbsp;pouze jednou položkou, která nám původní kořen rozdělí na dvě části.
[[Soubor:B-tree-splitt.png|thumbnáhled|320px|rightvpravo|Ukázka rozpadnutí jednoho uzlu ve dva]]
 
Příklad: Máme B-strom stupně 5 tak, jako je na obrázku. Každý uzel může mít maximálně 4 klíče. Pokud do dítěte chceme uložit další hodnotu, nejde to a uzel se rozpadne. Vkládaný klíč (nemusí to být nutně klíč ''k''<sub>3</sub>, tento klíč je zeleně zvýrazněn protože je ''prostřední'') se virtuálně vloží a poté se vybere prostřední klíč (zeleně). Tento prostřední klíč se poté vloží do rodiče (označen jako ''k''<sub>3</sub>') a původní uzel se rozpadne na dva, tak jak bylo napsáno výše.
Řádek 83 ⟶ 82:
 
==== Operace spojení uzlů ====
[[Soubor:B-tree-join.png|thumbnáhled|320px|rightvpravo|Ukázka spojení dvou uzlů v jeden]]
Pokud chceme spojit dva uzly, musíme v&nbsp;zásadě provést 2 kroky:
# Přesuneme všechny klíče z&nbsp;pravého sourozence do levého, tento pravý podstrom následně zrušíme.
Řádek 93 ⟶ 92:
 
==== Operace přesunutí klíče ====
[[Soubor:B-tree-move.png|thumbnáhled|320px|rightvpravo|Ukázka přesunutí klíče z jednoho uzlu do druhého]]
Přesunutí klíče z&nbsp;jednoho sourozence do druhého – uvažujme přesunutí klíče z&nbsp;pravého podstromu do levého, tak jak je to znázorněno na obrázku.
 
Řádek 120 ⟶ 119:
 
{{Stromy Inf}}
{{Autoritní data}}
 
[[Kategorie:Stromy (datové struktury)]]