4.9 KiB
4.9 KiB
Stromy
- abstraktní datový typ, který podchycuje vztahy mezi prvky
- větví se pouze jedním směrem
- využití:
- rodokmen, struktura vedení ve firmě, popis trasování paprsku
- ve stromě neexistují cykly
- dá se "pověsit" za nějaký kořen
Části
Vrchol (Node)
- prvky datové struktury
- můžou k nim být přiřazena data
- mají jednoho předka (kromě kořene)
- mohou mít libovolný počet potomků
Hrana (Edge)
- vztah mezi předkem a potomkem
- nikdy neexistuje hrana mezi prvky na stejné úrovni
Kořen (Root)
- jediný vrchol, který nemá předka
List
- vrchol bez potomků
Vnitřní vrchol
- vrchol který není list
Cesta
- posloupnost vrcholů, kde jsou každé dva po sobě následující spojeny hranou
Délka cesty
- počet hran cesty
Hloubka vrcholu
- délka cesty z vrcholu do kořene
Výška (hloubka) stromu
- maximální hloubka vrcholu ve stromě
Druhy stromů
Uspořádaný strom
- potomci mají definované neměnné pořadí
Neuspořádaný strom
- na pořadí potomků nezáleží
Druhy mají vliv na implementaci!
Binární strom
- uspořádaný strom, kde vrchol má dvojici potomků (levý a pravý)
- každý potomek je také binárním stromem
Operace
- vybrání kořene
- přidání potomka danému vrcholu
- zjištění předka daného vrcholu
- zjištění potomků daného vrcholu
- odebrání daného vrcholu ze stromu
Operace se můžou lišit podle druhu stromu (binární, uspořádaný, ...).
Implementace
Implementace binárního stromu polem
- vrcholy ukládáme do pole po jednotlivých patrech
- indexy:
- kořen má index 1
- potomci vrcholu s indexem i mají index (2i) a (2i + 1)
- předek vrcholu s indexem i leží na indexu i/2 (celočíselně)
- strom o hloubce h má vrcholy s maximálním indexem
2^{h+1} - 1
- reprezentace vrcholu:
- reprezenntován svým indexem
- musí mu být přiřazena data, která jsou uložena v poli
- data přiřazená vrcholu:
- uložená do pole na index vrcholu
- index 0 neobsazený (jednodušší vztahy)
- primitivní datové typy
- určení hodnoty symbolizující nepřítomnost vrcholu
- reference na instanci třídy
- nepřítomnost vrcholu reprezentována pomocí
null
- nepřítomnost vrcholu reprezentována pomocí
- výhody:
- základní operace jsou triviální aritmetické operace
- nevýhody:
- pouze pro binární stromy
- musíme předem znát počet prvků
- alokuje se paměť i přo nepřítomné prvky (nebo referenci)
Pozn.: Úplný binární strom
- pro určitý index k platí:
- všechny vrcholy s menším indexem existují
- všechny vrcholy s indexem k a větším neexistují
- pro tento druh je reprezentace polem vhodná
- je možné pole dynamicky zvětšovat
Implementace binárního stromu spojovou strukturou
- spojovací článek
Node
<typ> data
- data vrcholuNode left, right
- levá a pravá hrana
- řeší reprezentaci neexistujícího prvku
- umožňuje uložit vrchol bez dat pomocí
data = null
- paměťově úsporné pro částečně zaplněné stromy
- není potřeba znát předem počet prvků
- procházení stromu (path traversal)
- proces zpracování všech vrcholů stromu v určitém pořadí
- způsoby procházení
- přímý průchod: vrchol, levý, pravý
- vnitřní průchod: levý, vrchol, pravý
- zpětný průchod: levý, pravý, vrchol
- po úrovních: postupně se zpracují prvky na dané úrovni
- snadná implementace frontou
- implementace
- přirozené použité rekurze
- obecná metoda na zpracování vrcholu:
process(Node n)
- zahájení průchodu zavoláním metody
preorder/inorder/postorder
nad kořenem
Binární vyhledávací strom (BST)
- reprezentuje uspořádanou množinu prvků
- prvky seřazené pomocí klíče - nejjednodušeji
int
- strom je pouze implementací, ADT hierarchický není
Operace
- vložení prvku s klíčem
- oderání prvku s klíčem
- zjištění přítomnosti prvku s klíčem
- nalezení největšího a nejmenšího klíče
- vybrání všech prvků v pořadí klíčů
Pracujeme se dvěma datovými typy - typ klíče a hodnoty.
Implementace BST
- binární strom
- každý vrchol má hodnotu a klíč
- klíče lze porovnávat
- definující vlastnost
- je-li
x
klíč uzlun
, pak- klíče uzlu
n.left
jsou menší nežx
- klíče uzlu
n.right
jsou větší nežx
- klíče uzlu
- předpokládáme, že v ADT nejsou dva stejné klíče
- je-li
Složitost operací:
- h: výška stromu
- hledání, vkládání a ostraňování je
\mathcal O(h)
v nejhorším případě - degenerovaný strom:
h = N - 1
- složitosti jsou
\Omega(n)
- úplný strom:
h = \lceil \log_{2}(n) \rceil
- složitosti jsou
\mathcal O(\log(n))
- očekávatelný případ:
- vkládané klíče tvoří náhodnou posloupnost
- průměrná hloubka
h = 1.39\log_{2}(n)
- složitost je tedy
\mathcal O(\log(n))