290 likes | 603 Vues
Stromy prehľadávanie stromov, b in árne vyhľadávacie stromy. Čo máme v pláne ?. Strom ako dôležitá dátová štruktúra Ako uložiť „strom“ v programe Binárne stromy Systematické prehľadávania stromov „Stromové algoritmy ” Bin árne vyhľadávacie stromy Samovyvažova c ie stromy.
E N D
Čo máme v pláne ? • Strom ako dôležitá dátová štruktúra • Ako uložiť „strom“ v programe • Binárne stromy • Systematické prehľadávania stromov • „Stromové algoritmy” • Binárne vyhľadávacie stromy • Samovyvažovacie stromy
Stromy okolo nás Súborový systém Hierarchia adresárov a podadresárov AAA Diagramy hierarchického usporiadania
Čo je to strom ? • Skladá z vrcholov(uzlov) • Každý vrchol môže (ale nemusí) mať potomkov • Koreň • špeciálny vrchol, ktorý nemá rodiča • v strome je práve jeden • každý vrchol v strome je jeho priamym alebo nepriamym potomkom • Každý vrchol okrem koreňa má práve jedného rodiča • Listom nazývame vrchol bez potomkov
A Koreň • Listy: E, I, G, H • Rodičom E je vrchol B • Potomkovia A: B, C, D D C B G E F H I
A Priamy a nepriamy potomkovia nejakého vrcholu vytvárajú podstrom s koreňom v danom vrchole. D C B G E F H I
Stromy a podstromy • Strom je rekurzívna štruktúra: • Koreň • Podstromy zakorenené v potomkoch koreňa • Dôsledok: • Rekurzívna dátová štruktúra • Rekurzívne algoritmy • Pozorovanie: z koreňa sa vieme dostať do ľuboľného vrcholu stromu (stačí si vybrať „správneho“ potomka na pokračovanie) • Grafový pohľad: acyklický orientovaný graf
Ako dostať strom do programu ? • Základná stavebná jednotka: vrchol(Node) • Každý vrchol (Node) uchováva: • Informáciuuloženú v danom vrchole(číslo, reťazec, objekt, názov súboru, ...) • Zoznam referencií(odkazov) na potomkov publicclass Node { intcontent; List<Node> children; }
Binárne stromy • Binárny strom je strom, v ktorom má každý vrchol nanajvýš 2 potomkov: • Ľavý syn • Pravý syn publicclass Node { intdata; Node left; Node right; } Neexistenciu potomka reprezentujeme hodnotou null.
Programujeme … 5 • Cieľ: vytvoriť uvedenú štruktúru v programe 7 9 4 2 6 3
Prechody stromom (1) • Na to, aby sme sa dostali k ľubovoľnému vrcholu stromu stačí referencia na koreň • Problém: ako systematicky navštíviť všetky vrcholy stromu ? • Rekurzívna idea: • Spracuj hodnotu uloženú v aktuálnom vrchole • Navštív hodnoty v podstrome zakorenenom v ľavom synovi • Navštív hodnoty v podstrome zakorenenom v pravom synovi • Programujeme ...
Prechody stromom(2) • Preorder: • vrchol, ľavý podstrom, pravý podstrom • Inorder: • ľavý podstrom, vrchol, pravý podstrom • Postorder: • ľavý podstrom, pravý podstrom, vrchol
Príklad 5 • Preorder: 5, 7, 4, 2, 3, 9, 6 • Inorder: 4, 7, 2, 3, 5, 6, 9 • Postorder: 4, 3, 2, 7, 6, 9, 5 7 9 4 2 6 3
Zaujímavá úloha • Uvažujme strom, kde všetky vrcholy majú rôzne hodnoty • Z postupnosti navštívenia vrcholov pri inorder a preorder prechode zrekonštruovať strom (resp. postupnosť navštívenia vrcholov pri postorder prechode) • Kľúč k riešeniu: • pri preorder prechode je koreň vždy prvý prvok postupnosti • pri inorder prechode všetky prvky v ľavom podstrome sú v postupnosti naľavo od koreňa a všetky prvky v pravom podstrom sú napravo od koreňa
Ďalšie vlastnosti 5 • Počet vrcholov: 7 • Počet listov: 3 • Hĺbka stromu (počet úrovní): 4 • Počet vrcholov na danej úrovni 7 9 4 2 6 Šírka stromu (maximálny počet vrcholov na nejakej úrovni): 3 Maximálna uložená hodnota: 9 3
Programujeme … • Jednoduché, pekné a rekurzívne algoritmy ...
Strom aritmetického výrazu • Príklad použitia binárnych stromov • List: reprezentuje číselnú hodnotu / premennú • Vnútorný vrchol: reprezentuje binárnu operáciu • Vyhodnotenie uzla operácie: • Vyhodnoť ľavý podstrom • Vyhodnoť pravý podstrom • Aplikuj operáciu • Postorder prechod produkuje výraz v postfixovej notácii
Binárne vyhľadávacie stromy (BVS) • BVS slúži na uloženie dynamicky sa meniacejmnožiny hodnôt • „Chytrým“ uložením hodnôt vieme dosiahnuť rýchle vykonávanie operácií • Základná idea: • Každá hodnota uložená v ľavom podstrome vrcholu je menšia ako hodnota vo tomto vrchole • Každá hodnota uložená v pravom podstrome vrcholu je väčšia ako hodnota vo tomto vrchole
Príklad BVS 8 3 10 1 6 14 7 4 13
Výhody BVS • Rýchle zistenie, či hodnota je v BVS: • Pri vyhľadávaní nemusíme pozerať do oboch podstromov, ale na základe hľadanej hodnoty a hodnoty vrcholu, v ktorom sa nachádzame, viemepokračovať v správnompodstrome • Rýchle zistenie minimálnej(stále vľavo) a maximálnej (stále vpravo) hodnoty • Inorder prechod vytvára utriedenú postupnosť prvkov BVS stromu
Zistenie, či BVS obsahuje zadanú hodnotu publicboolean inBVS(int value) { if (content == value) returntrue; if (value < content) return (left != null) ? left.inBVS(value) : false; else return (right != null) ? right.inBVS(value) : false; }
Vloženie vrcholu do BVS • Simulátor: • http://people.ksp.sk/~kuko/bak/index.html • Nájdeme správnu pozíciu pre vkládaný vrchol (tak ako keď zisťujeme, či graf obsahuje danú hodnotu) a na tej vytvoríme nový vrchol
Odstránenie vrcholu z BVS (1) • Najkomplikovanejšia operácia pri práci s BVS • Ak je odstráňovaný vrchol listom, tak len upravíme referenciu o rodiča • Ak má odstraňovaný vrchol len jedného potomka, tak referenciu na neho u rodiča nahradíme referenciou na potomka • Ak má odstraňovaný vrchol dvoch potomkov, potom: • Vyberieme najmenšiu hodnotu v pravom podstrome a presunieme ju do odstraňovaného vrcholu • V pravom podstrome odstránime najmenšiu hodnotu
Odstránenie vrcholu z BVS (2) • Odstránenie je komplikované, pretože sa treba vysporiadať s možným narušením vlastnosti BVS (simulácie a programovanie)
Časová zložitosť operácii v BVS • Každá z operácií (contains, delete, insert) v BVS má zložitosť O(h), kde h je aktuálna hĺbka stromu • n – počet vrcholov BVS • V ideálnom prípade je h = O(log n) • V najhoršom prípade je h = O(n) • Otázka: pri akej postupnosti vkladaných hodnôt vzniká ideálny prípad a pri akej najhorší prípad ?
Lineárna hĺbka 5 8 3 8 6 9 5 2 4 6 Logaritmická hĺbka 2
Samovyvažovacie BVS • BVS je dobrá štruktúra, ak je strom vyvážený • Samovyvažovacie BVS • Chytré algoritmy zabezpečujúce, že ak sa naruší vyváženosť, tak sa sériou niekoľkých operácií (rotácií) strom opäť vyváži • Časová zložitosť opravy narušenia vyváženosti je O(h)– t.j. rovnaká ako zložitosť modifikujúcej operácie • AVL stromy, RB-stromy(červeno-čierne), … • Trieda java.util.TreeSetinterne ukladá hodnoty v (samovyvažovacom) RB-strome
Ďalšie zaujímavosti • V binárnom strom ide uložiť všeobecné stromy: • namiesto referencií na 2 synov sa pamätá referencia na prvého („najstaršieho“) syna a referencia na súrodenca • V databázach sa na indexovanie (zrýchlenie vyhľadávania) využívajúB-stromy, kde v každom vrchole je uložených veľa hodnôt
Ďakujem za pozornosť Otázky???