Stromy prehľadávanie stromov, b in árne vyhľadávacie stromy
description
Transcript of Stromy prehľadávanie stromov, b in árne vyhľadávacie stromy
StromyStromyprehľadávanie stromov, prehľadávanie stromov, bbininárne vyhľadávacie stromyárne vyhľadávacie stromy
22
Čo máme v pláne Čo máme v pláne ??
Strom ako dôležitá Strom ako dôležitá dátová štruktúradátová štruktúra
Ako Ako uložiťuložiť „strom“ v programe „strom“ v programe
Binárne stromyBinárne stromy
Systematické Systematické prehľadávaniaprehľadávania stromov stromov
„„Stromové algoritmyStromové algoritmy””
BinBinárne árne vyhľadávacie stromyvyhľadávacie stromy
SamovyvažovaSamovyvažovaccie stromyie stromy
33
Stromy okolo násStromy okolo nás
AAA
Súborový systém
Hierarchia adresárov a podadresárov
Diagramy hierarchického usporiadania
44
Čo je to strom Čo je to strom ??
Skladá z Skladá z vrcholovvrcholov (uzlov)(uzlov)
Každý vrchol môže (ale nemusí) mať Každý vrchol môže (ale nemusí) mať potomkovpotomkov
KoreňKoreň
špeciálny vrchol, ktorý špeciálny vrchol, ktorý nemánemá rodi rodičača
v strome je v strome je práve jedenpráve jeden
každý vrchol v strome je jeho každý vrchol v strome je jeho priamympriamym alebo alebo nepriamymnepriamym potomkom potomkom
Každý vrchol okrem koreňa má Každý vrchol okrem koreňa má práve jedného práve jedného rodičarodiča
ListomListom nazývame vrchol bez potomkov nazývame vrchol bez potomkov
55
A
B C D
E F G H
I
Koreň
Listy: E, I, G, H
Rodičom E je vrchol B
Potomkovia A: B, C, D
66
A
B C D
E F G H
I
Priamy a nepriamy potomkovia nejakého vrcholu vytvárajú podstrom s koreňom v danom vrchole.
77
Stromy a podstromyStromy a podstromy
Strom je Strom je rekurzívnarekurzívna štruktúra: štruktúra:
KoreňKoreň
Podstromy zakorenené v potomkoch koreňaPodstromy zakorenené v potomkoch koreňa
Dôsledok:Dôsledok:
Rekurzívna dátová štruktúraRekurzívna dátová štruktúra
Rekurzívne algoritmyRekurzívne algoritmy
Pozorovanie:Pozorovanie: z koreňa sa vieme dostať do z koreňa sa vieme dostať do ľuľubboľného vrcholu stromu (stačí si vybrať oľného vrcholu stromu (stačí si vybrať „správneho“ potomka na pokračovanie)„správneho“ potomka na pokračovanie)
GrafovGrafový pohľad:ý pohľad: acyklický orientovaný graf acyklický orientovaný graf
88
Ako dostať strom do programu Ako dostať strom do programu ??
ZZákladná stavebná jednotka: ákladná stavebná jednotka: vrcholvrchol (Node)(Node)
KaKaždý vrcholždý vrchol (Node) (Node) uchováva: uchováva:
InformáciuInformáciu ulouloženú v danom ženú v danom vrcholevrchole ((číslo, reťazec, číslo, reťazec, objekt, názov súboru, ...objekt, názov súboru, ...))
Zoznam Zoznam referencireferenciíí (odkazov) na (odkazov) na potomkovpotomkov
public class Node {
int content;
List<Node> children;
}
99
Binárne stromyBinárne stromy
Binárny strom je strom, v ktorom má každý Binárny strom je strom, v ktorom má každý vrchol vrchol nanajvýš 2 potomkovnanajvýš 2 potomkov::
Ľavý synĽavý syn
Pravý synPravý syn
public class Node {
int data;
Node left;
Node right;
}
Neexistenciu Neexistenciu potomka potomka
reprezentujeme reprezentujeme hodnotou hodnotou nullnull..
1010
5
7 9
4 2 6
3
Programujeme …Programujeme …
CieCieľ:ľ: vytvoriť vytvoriť uvedenú štruktúru v uvedenú štruktúru v programeprograme
1111
Prechody stromom (1)Prechody stromom (1)
Na to, aby sme sa dostali k ľubovoľnému vrcholu Na to, aby sme sa dostali k ľubovoľnému vrcholu stromu stačí stromu stačí referencia na koreňreferencia na koreň
Problém:Problém: ako systematicky ako systematicky nav navštíviť všetky štíviť všetky vrcholy stromu vrcholy stromu ??
Rekurzívna idea:Rekurzívna idea:
Spracuj Spracuj hodnotu ulohodnotu uloženú v aktuálnom vrcholeženú v aktuálnom vrchole
Navštív hodnoty v podstrome zakorenenom v ľavom Navštív hodnoty v podstrome zakorenenom v ľavom synovisynovi
Navštív hodnoty v podstrome zakorenenom v Navštív hodnoty v podstrome zakorenenom v pravom synovipravom synovi
Programujeme ...Programujeme ...
1212
Prechody stromomPrechody stromom (2)(2)
Preorder:Preorder:
vrcholvrchol, ľavý podstrom, pravý podstrom, ľavý podstrom, pravý podstrom
Inorder:Inorder:
ľavý podstrom, ľavý podstrom, vrcholvrchol, pravý podstrom, pravý podstrom
Postorder:Postorder:
ľavý podstrom, pravý podstrom, ľavý podstrom, pravý podstrom, vrcholvrchol
1313
5
7 9
4 2 6
3
PrPríkladíklad
Preorder: Preorder:
55, , 77, , 44, , 22, , 33, 9, 6, 9, 6
Inorder:Inorder:
44, , 77, , 22, , 33, , 55, 6, 9, 6, 9
Postorder: Postorder:
44, , 33, , 22, , 77, 6, 9, , 6, 9, 55
1414
ZaujZaujímavá úlohaímavá úloha
Uvažujme strom, kde všetky vrcholy majú Uvažujme strom, kde všetky vrcholy majú rôznerôzne hodnotyhodnoty
Z postupnosti navštívenia vrcholov pri inorder a Z postupnosti navštívenia vrcholov pri inorder a preorder prechode preorder prechode zrekonštruovaťzrekonštruovať strom strom (resp. (resp. postupnospostupnosť navštívenia vrcholov pri postorder ť navštívenia vrcholov pri postorder prechodeprechode))
Kľúč k riešeniu:Kľúč k riešeniu:
pri preorder prechode je koreň vždy prvý prvok pri preorder prechode je koreň vždy prvý prvok postupnostipostupnosti
pri inorder pri inorder prechode vprechode všetky prvky v ľavom šetky prvky v ľavom podstrome sú v postupnosti naľavo od koreňa a podstrome sú v postupnosti naľavo od koreňa a všetky prvky v pravom podstrom sú napravo od všetky prvky v pravom podstrom sú napravo od koreňakoreňa
1515
5
7 9
4 2 6
3
Ďalšie vlastnostiĎalšie vlastnosti
PoPočet vrcholovčet vrcholov: : 77
Počet listov: Počet listov: 33
HHĺbka stromu ĺbka stromu (po(počet čet úrovníúrovní): ): 44
PoPočet vrcholov na čet vrcholov na danej úrovnidanej úrovni
Šírka stromu Šírka stromu (maxim(maximálny počet álny počet vrcholov na nejakej úrovnivrcholov na nejakej úrovni): ): 33
MaximMaximálna uložená hodnota: álna uložená hodnota: 99
1616
Programujeme …Programujeme …
JednoduchJednoduché, pekné a rekurzívne algoritmy ...é, pekné a rekurzívne algoritmy ...
1717
Strom aritmetického výrazuStrom aritmetického výrazu
Príklad použitia binárnych stromovPríklad použitia binárnych stromov
List:List: reprezentuje reprezentuje číselnú hodnotu / premennúčíselnú hodnotu / premennú
Vnútorný vrchol:Vnútorný vrchol: reprezentuje binárnu reprezentuje binárnu operáciuoperáciu
Vyhodnotenie uzla operácie:Vyhodnotenie uzla operácie:
Vyhodnoť ľavý podstromVyhodnoť ľavý podstrom
Vyhodnoť pravý podstromVyhodnoť pravý podstrom
Aplikuj operáciuAplikuj operáciu
Postorder prechod produkuje Postorder prechod produkuje výraz v výraz v postfixovejpostfixovej notácii notácii
1818
Binárne vyhľadávacie stromy Binárne vyhľadávacie stromy (BVS)(BVS)
BVS slBVS slúži na uloženie úži na uloženie dynamickydynamicky sa sa meniacejmeniacej množinymnožiny hodnôt hodnôt
„„Chytrým“ uložením hodnôt vieme dosiahnuť Chytrým“ uložením hodnôt vieme dosiahnuť rýchle vykonávanie operáciírýchle vykonávanie operácií
Základná idea:Základná idea:
Každá hodnota uložená vKaždá hodnota uložená v ľavom podstrome ľavom podstrome vrcholu vrcholu je je menšia menšia ako hodnota vo tomto vrcholeako hodnota vo tomto vrchole
Každá hodnota uložená v Každá hodnota uložená v pravom podstromepravom podstrome vrcholu je vrcholu je väčšiaväčšia ako hodnota vo tomto vrchole ako hodnota vo tomto vrchole
1919
PrPríklad BVSíklad BVS
8
3 10
1 6 14
74 13
2020
Výhody BVSVýhody BVS
Rýchle zistenie, či hodnota Rýchle zistenie, či hodnota je v BVSje v BVS::
Pri vyhľadávaní nemusíme pozerať do oboch Pri vyhľadávaní nemusíme pozerať do oboch podstromov, ale na základe hľadanej hodnoty a podstromov, ale na základe hľadanej hodnoty a hodnoty vrcholu, v ktorom sa nachádzame, hodnoty vrcholu, v ktorom sa nachádzame, viemevieme pokračovaťpokračovať v v správnomsprávnom podstromepodstrome
Rýchle zistenie Rýchle zistenie minimálnejminimálnej (st(stále vľavoále vľavo) a ) a maximmaximálnej álnej (st(stále vpravoále vpravo) ) hodnothodnotyy
InorderInorder prechod vytv prechod vytvára ára utriedenú postupnosťutriedenú postupnosť prvkov BVS stromuprvkov BVS stromu
2121
Zistenie, či BVS obsahuje zadanú Zistenie, či BVS obsahuje zadanú hodnotuhodnotu
public boolean inBVS(int value) {
if (content == value)
return true;
if (value < content)
return (left != null) ? left.inBVS(value) : false;
else
return (right != null) ? right.inBVS(value) : false;
}
2222
Vloženie vrcholu do BVSVloženie vrcholu do BVS
Simulátor:Simulátor:
http://people.ksp.sk/~kuko/bak/index.htmlhttp://people.ksp.sk/~kuko/bak/index.html
Nájdeme správnu pozíciu pre vkládaný vrchol Nájdeme správnu pozíciu pre vkládaný vrchol (tak ako ke(tak ako keď zisťujeme, či graf obsahuje danú ď zisťujeme, či graf obsahuje danú hodnotuhodnotu) a na t) a na tej vytvorej vytvoríme nový vrcholíme nový vrchol
2323
Odstránenie vrcholu z BVS Odstránenie vrcholu z BVS (1)(1)
Najkomplikovanejšia operácia pri práci s BVSNajkomplikovanejšia operácia pri práci s BVS
Ak je odstráňovaný vrchol Ak je odstráňovaný vrchol listomlistom, tak len , tak len upravíme referenciu o rodičaupravíme referenciu o rodiča
Ak má odstraňovaný vrchol Ak má odstraňovaný vrchol len jedného len jedného potomkapotomka, tak referenciu na neho u rodiča , tak referenciu na neho u rodiča nahradíme referenciou na potomkanahradíme referenciou na potomka
Ak má odstraňovaný vrchol Ak má odstraňovaný vrchol dvoch potomkovdvoch potomkov, , potom:potom:
Vyberieme Vyberieme najmenšiu hodnotu v pravom podstromenajmenšiu hodnotu v pravom podstrome a presunieme ju do odstraňovaného vrcholua presunieme ju do odstraňovaného vrcholu
V pravom podstrome V pravom podstrome odstránimeodstránime najmenšiu najmenšiu hodnotuhodnotu
2424
Odstránenie vrcholu z BVS Odstránenie vrcholu z BVS (2)(2)
OdstrOdstránenie je komplikované, pretože sa treba ánenie je komplikované, pretože sa treba vysporiadať s možným narušením vlastnosti vysporiadať s možným narušením vlastnosti BVS BVS (simul(simulácie a programovanieácie a programovanie))
2525
Časová zložitosť operácii v BVSČasová zložitosť operácii v BVS
Každá z operácií Každá z operácií ((contains, delete, insertcontains, delete, insert) v BVS ) v BVS mmá zložitosť á zložitosť OO(h)(h), kde , kde hh je aktu je aktuálna álna hĺbka hĺbka stromustromu
n – pon – počet vrcholov BVSčet vrcholov BVS
V V ideálnomideálnom prípade je prípade je h h = O(log n)= O(log n)
V V najhornajhoršomšom prípade je prípade je h h = O(n)= O(n)
OtOtázka:ázka: pri akej postupnosti vkl pri akej postupnosti vkladanadaných hodnôt ých hodnôt vzniká ideálny prípad a pri akej najhorší prípad vzniká ideálny prípad a pri akej najhorší prípad ??
2626
5
3 8
2 4 6 9
8
6
5
2
Logaritmická hĺbka
Lineárna hĺbka
2727
Samovyvažovacie BVSSamovyvažovacie BVS
BVS je dobrá štruktúra, ak je strom BVS je dobrá štruktúra, ak je strom vyváženývyvážený
SamovyvažovacieSamovyvažovacie BVS BVS
Chytré algoritmyChytré algoritmy zabezpečujúce, že ak sa naruší zabezpečujúce, že ak sa naruší vyváženosť, tak sa sériou niekoľkých operácií vyváženosť, tak sa sériou niekoľkých operácií (rot(rotáciíácií)) strom opäť vyváži strom opäť vyváži
Časová zložitosť Časová zložitosť opravy opravy narunarušenia šenia vyváženostivyváženosti je je OO(h)(h) – t.j. rovnak– t.j. rovnaká ako zložitosť modifikujúcej á ako zložitosť modifikujúcej operácieoperácie
AVL stromy, RBAVL stromy, RB--stromystromy ((červeno-čiernečerveno-čierne), …), …
Trieda Trieda java.util.TreeSetjava.util.TreeSet interne ukladá hodnoty v interne ukladá hodnoty v (samovyva(samovyvažovacomžovacom) ) RBRB--stromestrome
2828
Ďalšie zaujímavostiĎalšie zaujímavosti
V V binárnombinárnom strom ide uložiť strom ide uložiť všeobecnévšeobecné stromy: stromy:
namiesto referencií na 2 synov sa pamätá namiesto referencií na 2 synov sa pamätá referencia na prvého referencia na prvého ((„„najstarnajstaršieho“šieho“) syna a ) syna a referencia na sreferencia na súrodencaúrodenca
V V databázachdatabázach sa na indexovanie sa na indexovanie (zr (zrýchlenie ýchlenie vyhľadávaniavyhľadávania) ) využívajúvyužívajú B-stromyB-stromy, kde v , kde v kakaždom vrchole je uložených veľa hodnôtždom vrchole je uložených veľa hodnôt
2929
Ďakujem za pozornosť
Otázky ???