Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Programování 3. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015.

Podobné prezentace


Prezentace na téma: "Programování 3. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015."— Transkript prezentace:

1 Programování 3. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

2 Jan LánskýProgramování 3. hodina2 Umíme z minulé hodiny Implementace zásobníku a fronty pomocí jednosměrných spojových seznamů Obousměrné lineární spojové seznamy Create, ConvertArray, Print InsertToBegin, InsertToEnd InsertBefore, InsertAfter, Find, Delete Cyklické spojové seznamy

3 Jan LánskýProgramování 3. hodina3 Cíle hodiny Stromy Reprezentace Binární vyhledávací stromy Create Find, Insert, Delete Vypis (inorder, preorder, postorder) Vyvážené stromy (stručně) Dokonale vyvážený binární vyhledávací strom AVL strom

4 Jan LánskýProgramování 3. hodina4 Strom Struktura skládající se z uzlů a hran. Hrana vede z jednoho uzlu do jiného uzlu. Uzel, ze kterého vede hrana, je otcem vrcholu, do kterého hrana vede. Rekurzivní definice: Strom má právě jeden uzel zvaný kořen. Synové kořene jsou kořeny vlastních stromů. Z kořene do libovolného uzlu vede vždy právě jedna cesta (posloupnost hran, které se neopakují) Uzel, který nemá žádné syny se nazývá list. Formálně: Zakořeněný strom je souvislý acyklický orientovaný graf Vrchol (matematický pojem) se v programování někdy označuje jako uzel.

5 Jan LánskýProgramování 3. hodina5 Strom A BCD EFG Kořen A má syny B, C a D Uzel D má syny F a G Uzel B má syna E Uzly C, E, F a G nemají žádné syny, jsou to listy Používá se terminologie: otec, bratr, dědeček, vnuk, bratranec, strýc, … Hrana mezi D a F Větev: cesta od kořene k listu, např. A, D, F

6 Jan LánskýProgramování 3. hodina6 Binární strom A CD FG Kořen A má syny 2 syny Uzel D má 2 syny Speciální druh stromu: Každý vrchol má nejvýše dva syny List C má 0 synů List F má 0 synů List G má 0 synů

7 Jan LánskýProgramování 3. hodina7 Stromy v běžném životě Říční síť (obecný strom) Pokud se řeka vlévá do jiné řeky je jejím synem. Rodokmeny Typ rozvod: (obecný strom) naše názvosloví Typ vývod z předků: (binární strom) Otec a matka jsou synové svého dítěte Struktura řízení ve firmě (obecný strom) Ředitel je kořen, řadoví zaměstnanci listy Play-off pavouk (binární strom) Vítěz je otcem (své kopie a poraženého soupeře) Jednosměrný spojový seznam je strom, obousměrný strom není, obsahuje cyklus

8 Jan LánskýProgramování 3. hodina8 Reprezentace: Binární strom Data, která uzel obsahuje Odkaz na levého syna Odkaz na pravého syna V praxi hodně využívané pro snadnou implementaci Uzel – při implementaci se používá tento název pro vrchol

9 Jan LánskýProgramování 3. hodina9 Binární strom 213 70545 null 2105 null Kořen List

10 Jan LánskýProgramování 3. hodina10 Reprezentace: Obecný strom – pole synů (*) Maximální počet synů je dán velikostí pole. Pokud chceme přidat více synů, musíme pole zvětšit. (*) Má-li uzel méně synů než je velikost pole (obvyklý stav) natavíme dalšího syna (prvek pole) na null. (*) Ideální pokud se od vytvoření uzlu synové již nemění. (*) Pokud syny jen přidáváme, je možné pole po naplnění zvětšit na dvojnásobek a syny překopírovat do nového pole (dynamické pole) Nevhodné, pokud převažují operace přidávání a ubírání synů

11 Jan LánskýProgramování 3. hodina11 Reprezentace: Obecný strom – seznam synů Spojový seznam synů Aktuální syn Následující syn (jeho bratr) Spojový seznam synů Reprezentace je vhodná při častých změnách struktury stromu

12 Jan LánskýProgramování 3. hodina12 Reprezentace: Obecný strom – převod na binární strom První syn Následující bratr Obecný strom převedeme na binární strom Chceme-li znát všechny syny uzlu, musíme z prvního syna uzlu projít všechny jeho bratry

13 Jan LánskýProgramování 3. hodina13 Binární vyhledávací strom Uzly stromu obsahují datovou položku, která vyjadřuje hodnotu vrcholu. Podle této hodnoty lze vrcholy porovnávat, = Pro každý uzel "u" platí Všechny uzly nacházející se v podstromu levého syna mají menší hodnotu než je hodnota vrcholu "u" Všechny uzly nacházející se v podstromu pravého syna mají větší hodnotu než je hodnota vrcholu "u" K zamyšlení: Jak umožnit, aby více vrcholů mělo shodnou hodnotu Podmínky musí platit pro všechny vrcholu v podstromu (nikoliv jen pro syna) AJ: binary search tree BST

14 Jan LánskýProgramování 3. hodina14 Binární vyhledávací strom 40 2148 93361 417305377 Reprezentace: použijeme stejnou třídu jako pro binární strom - StromB Všichni potomci < 40 Všichni potomci > 40 Zleva doprava: hodnoty uzlů tvoří vzestupně setříděnou posloupnost

15 Jan LánskýProgramování 3. hodina15 Binární vyhledávací strom časová složitost operací V průměrném případě hloubka stromu O(Log N). Find, Insert, Delete O(log N) V nejhorším případě vznikne jednosměrný spojový seznam Při přidávání prvků v setříděném pořadí Find, Insert, Delete O(N) Oproti obousměrnému seznamu rychlejší hledání, za cenu zpomalení vkládání a mazání

16 Jan LánskýProgramování 3. hodina16 Binární vyhledávací strom: Vytvoření Vytvoříme kořen reprezentující zadanou hodnotu. Kořen má syny null Binární vyhledávací strom je nutné vytvořit postupným vkládáním prvků. Pokud jsou prvky uloženy v poli, ušetříme si opakované psaní názvu funkce Insert při jejich vkládání. Insert bude o pár slajdů později

17 Jan LánskýProgramování 3. hodina17 Binární vyhledávací strom: Find Procházíme stromem od kořene směrem k listu, ve kterém by se hledaná hodnota měla nacházet. Pokud hodnota uzlu se rovná požadované hodnotě, vrátíme tento uzel. Pokud hodnota uzlu je větší než hledaná hodnota, pokračujeme v hledání v podstromu levého syna Pokud hodnota uzlu je menší než hledaná hodnota, pokračujeme v hledání v podstromu pravého syna Pokud je syn, jehož podstrom máme prohledat null, hledaný prvek se ve stromu nenachází Praktická ukázka bude na tabuli

18 Jan LánskýProgramování 3. hodina18 Binární vyhledávací strom: Find Implementace pomocí rekurze. Rekurzivní volání funkce na levého nebo pravého syna " akt" – aktuální uzel stromu Podle hledané hodnoty se na konci iterace cyklu "akt" posune na levého nebo pravého syna Prvek se ve stromu nenachází

19 Jan LánskýProgramování 3. hodina19 Binární vyhledávací strom: Insert Podobně jako u funkce Find procházíme stromem od kořene směrem k listu, ve kterém by se hledaná hodnota měla nacházet. Hodnotu nalezeného listu, který je null, nahradíme novým uzlem s vkládanou hodnotou Při tomto průchodu nesmíme zapomenout otce nahrazovaného syna Při přechodu z otce na syna, pokud je tento syn null místo přechodu provedeme nahrazení. Praktická ukázka bude na tabuli

20 Jan LánskýProgramování 3. hodina20 Prázdný strom, vrátíme nový prvek, který se stane kořenem Průchod směrem od kořene k listům Prvek ve stromě už je Pravý syn je symetrický levému Tento příkaz nikdy nenastane, ale kompilátor ho vyžaduje Našli jsme místo pro vložení prvku. Levý syn je null, nahradíme ho nově vytvořeným prvkem a skončíme funkci Levý syn není ještě null, pokračujeme Podle hodnoty uzlu nás zajímá levý syn

21 Jan LánskýProgramování 3. hodina21 Binární vyhledávací strom: Delete Nejprve najdeme uzel, který chceme smazat (pamatujeme si otce) Je-li mazaný uzel listem: nastavíme otci, že jeho příslušný syn je null Má-li mazaný uzel jednoho syna: Příslušného syna otce nastavíme na syna mazaného uzlu Otec mazaného uzlu bude mít za syna bývalého vnuka. Praktická ukázka bude na tabuli. Obrázky v Prg Kucera.pdf (41-42) Delete může smazat kořen, musí vracet hodnotu

22 Jan LánskýProgramování 3. hodina22 Binární vyhledávací strom: Delete Má-li mazaný uzel dva syny Na pozici mazaného syna přesuneme (výměna odkazů, nikoliv hodnot) nejpravějšího potomka v levém podstromu mazaného uzlu Mazaný uzel na nové pozice ve stromu má maximálně jednoho syna, lze ho smazat již vysvětleným postupem. Praktická ukázka bude na tabuli. Obrázky v Prg Kucera.pdf (41-42) Analogicky lze nejlevějšího potomka v pravém podstromu

23 Jan LánskýProgramování 3. hodina23 Výpis stromu v grafické podobě Počet hvězdiček reprezentuje počet předků uzlu Kořen má hloubku 0 Rekurzivně voláme na syny. Budou mít o hvězdičku více Výborné na ladění

24 Jan LánskýProgramování 3. hodina24 Výpis setříděných hodnot Prvky binárního vyhledávacího stromu jsou směrem zleva doprava setříděné vzestupně. Výpis INORDER: Rekurzivně vypíšeme podstrom levého syna, poté uzel, poté podstrom pravého syna. výpis PREORDER: Nejprve vypíšeme uzel, poté rekurzivně podstrom levého syna, poté podstrom pravého syna, viz předchozí slajd (výpis v grafické podobě) Výpis POSTORDER: Rekurzivně vypíšeme podstrom levého syna, poté poté podstrom pravého syna, poté uzel. Místo výpisu lze provést jinou akci, jde i pro nevyhledávací stromy

25 Jan LánskýProgramování 3. hodina25 Dokonale vyvážený binární vyhledávací strom Snaha odstranit nejhorší případ, že z binárního vyhledávacího stromu vznikne spojový seznam Zaručena časová složitost Find O(log N) Při Insert a Delete nutno konstruovat strom znova - časová složitost O(N log (N)) Pro každý vrchol platí, že počet vrcholů v jeho pravém i levém podstromu se liší maximálně o jedna. Konstrukce: Zadána posloupnost prvků, setřídíme ji Zvolíme kořen jako prostřední prvek, posloupnost prvků se rozdělí na dvě části lišící se počtem prvků maximálně o 1 Rekurze pro levého (na prvky nalevo od kořene) a pravého syna (na prvky napravo od kořene) … jen stručně

26 Jan LánskýProgramování 3. hodina26 AVL strom Snaha odstranit nejhorší případ, že vznikne spojový seznam Zaručena časová složitost Find, Insert i Delete O(log N) Pro každý uzel platí, že výška levého a pravého podstromu se liší maximálně o jedna Při vkládání a mazání prvků, pokud by došlo k porušení pravidla, se provádí jednoduchá (LL, RR) nebo dvojitá rotace (LR, RL) Pro zájemce podrobněji: http://www.cs.vsb.cz/kratky/courses/2004- 05/udp/presentation/udp-8_6.pdf http://www.cs.vsb.cz/kratky/courses/2004- 05/udp/presentation/udp-8_6.pdf Adeľson-Velskij, Landis, 1962 … jen stručně

27 Jan LánskýProgramování 3. hodina27 Zpětná vazba Objevili jste ve slajdech chyby? Včetně pravopisných Nechápete nějaký slajd? Je příliš obtížný, nesrozumitelný? Máte nějaký nápad na vylepšení? Anonymní formulář Odeslání za pár vteřin http://goo.gl/forms/wJX99cbyy9


Stáhnout ppt "Programování 3. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015."

Podobné prezentace


Reklamy Google