Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilAnna Jarošová
1
Programování 4. 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í 4. hodina2 Umíme z minulé 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
3
Jan LánskýProgramování 4. hodina3 Cíle hodiny Využití stromů při řešení praktických příkladů Načtení stromu z textového zápisů vztahů mezi daty Binární vyhledávací strom jako slovník Průchod obecným stromem do hloubky s využitím zásobníku Průchod obecným stromem do šířky s využitím fronty Vyhodnocení aritmetického výrazu
4
Jan LánskýProgramování 4. hodina4 Rodokmen z textové podoby do podoby stromu Textový soubor – každý řádek reprezentuje otce a jeho potomky Otec: potomek, …, potomek Označení osob musí být unikátní (v praxi jméno, příjmení, datum a místo narození) Chceme převést do podoby obecného stromu Txt soubor: pozor na umístění a počty mezer. Naše řešení je požaduje přesně. Pokud bude vstup vytvářet člověk, udělá chyby. Praktický příklad
5
Jan LánskýProgramování 4. hodina5 Rodokmen Jan PetrPavelPepa LukasJirkaOndra AdamAlesFilipMirek
6
Jan LánskýProgramování 4. hodina6 Myšlenka algoritmu Obecný strom, jehož kořen je otec z prvního řádku Projdeme soubor po řádcích. Rozpoznáme jméno otce a jeho synů Pokud se otec nevyskytuje ve stromu, chyba, končíme. V obecném stromu k otci přidáme jeho syny Pokud jména nejsou unikátní (chyba), přidáváme všechny syny prvnímu nalezenému jmenovci
7
Jan LánskýProgramování 4. hodina7 Pomocný binární vyhledávací strom slovník V obecném stromu musíme projít všechny prvky, abychom nalezli hledaný uzel. Zrychlení: použijeme slovník (binární vyhledávací strom), který bude překládat jména osob na uzly obecného stromu Místo hledání v obecném stromu (lineární čas) budeme hledat v binárním vyhledávacím stromu (logaritmický čas) Stojí nás to dvojnásobek paměti
8
Jan LánskýProgramování 4. hodina8 Datové struktury Obecný strom: Jméno uzlu a pole synů Binární vyhledávací strom: Klíč: jméno uzlu Hodnota: uzel obecného stromu Levý: levý syn Pravý: pravý syn Místo celých čísel pracujeme s řetězci. Změní se těla funkcí Insert a Find
9
Jan LánskýProgramování 4. hodina9 Vytvoření uzlu Binární vyhledávací strom: Známe z minulé hodiny Obecný strom: Vytvoříme pole pro dva syny Počet synů je nula.
10
Jan LánskýProgramování 4. hodina10 Přidání syna do obecného stromu Projdeme pole synů a hledáme prvek s hodnotou null. Pokud ho nalezneme, změníme ho na přidávaného syna a hodnotu null posuneme na další prvek Bylo-li pole synů plné, zvětšíme ho na dvojnásobek. Do nového pole okopírujeme původní hodnoty, přidáme nový prvek, nastavíme zarážku null. Dynamické pole
11
Jan LánskýProgramování 4. hodina11 Oddělovač synů Otec končí před dvojtečkou Pozor na mezery Otec není ve slovníku. Buďto je to kořen, nebo chyba Pole řetězců se jmény synů Přidáme syna do slovníku Přidáme syna do obecného stromu
12
Jan LánskýProgramování 4. hodina12 Průchod stromem Průchod do hloubky (DFS) - Backtracking Rekurze Zásobník – prvky zásobníku jsou uzly stromu Průchod do šířky (BFS) - Vlna Fronta – Prvky fronty jsou uzly stromu Přidáme datovou položku uzlu, zda byl navštíven nebo ne. Můžeme přidat i položku pro hloubku uzlu ve stromě. S uzly můžeme provést během průchodu požadovanou operaci (např. výpis hodnoty) AJ: Do hloubky: Deep first search (DFS) Do šířky: Breadth first search (BFS)
13
Jan LánskýProgramování 4. hodina13 Průchod stromem do hloubky Preorder První je vypsán otec, pak synové Viz výstup nalevo od textu Inorder U binárních stromů: Pořadí výpisu je levý syn, otec, pravý syn. Postorder Nejprve jsou vypsání synové pak otec
14
Jan LánskýProgramování 4. hodina14 Obecný strom – nové položky Přidáme poznámku, zda jsme uzel už navštívili, nutné pro nerekurzivní průchody. Uzel je nenavštíveny při svém vzniku Hloubka uzlu = vzdálenost od kořene v počtu uzlů Uzel je kořen. Operace insert, delete nebudou měnit hloubku, zjistíme ji až při průchodu stromem
15
Jan LánskýProgramování 4. hodina15 Pomocné funkce pro výpis Vypíše za každou úroveň hloubky hvězdičku a pak vypíše název uzlu. Vrátí dalšího nenavštíveného syna uzlu nebo null.
16
Jan LánskýProgramování 4. hodina16 Průchod do hloubky: rekurze Minulou hodinu jsme použili na Binární vyhledávaci strom – funkce Vypis Start rekurze Další nenavštívený syn uzlu Vypíšeme uzel a jeho hloubku Nastavíme mu hloubku uzlu a spostíme na něm rekurzi Rekurzivní DFS stromem může projít syny v obyčejném cyklu, ale udělali jsme obecněji. Preorder
17
Jan LánskýProgramování 4. hodina17 Průchod do hloubky: zásobník Praktická ukázka bude na tabuli Musí to být zásobník uzlů stromů Kořen stromu na zásobník Dokud není zásobník prázdný Vyzvedneme vrchol zásobníku, Pokud nebyl navštíven, tak ho vypíšeme (a označíme navštívení). Otce bez synů dále nezpracováváme. Preorder Má-li uzel nenavštíveného syna, nastavíme synovi hloubku a otce i syna dáme na zásobník
18
Jan LánskýProgramování 4. hodina18 Průchod stromem do šířky Uzly jsou vypisovány dle vzdálenosti od kořene Nejprve je vypsán kořen Poté synové kořene Poté vnuci kořene, … Použití datové struktury Fronta Nevýhoda: z výpisu (nalevo) nepoznáme, kdo je čí otec
19
Jan LánskýProgramování 4. hodina19 Průchod do šířky: fronta Praktická ukázka bude na tabuli Syny musíme označit za navštívené už při vložení do fronty, technické řešení kvůli funkci NextSon Velmi podobné jako při použití zásobníku, pouze synové se přidávají do fronty najednou v cyklu
20
Jan LánskýProgramování 4. hodina20 Vyhodnocení aritmetického výrazu Problém: lidé používají infixový zápis, který se musí pro optimální počítačové zpracování převést na prefixní zápis Infixní 2 + 3 * ( 7 + 2 ) – 4 Prefixní: - + 2 * 3 + 7 2 4 Při uložení výrazu do stromu ho vyhodnotíme průchodem stromem do hloubky Uzly operace, listy čísla. Literatura Kučera: slajdy 93 – 99 Topfer: strany 63 - 70 Prefixní zápis nepotřebuje závorky Praktická ukázka bude na tabuli
21
Jan LánskýProgramování 4. hodina21 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
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.