Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Podobné dokumenty
Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Základní datové struktury III: Stromy, haldy

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Stromy, haldy, prioritní fronty

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Algoritmy a datové struktury

5 Rekurze a zásobník. Rekurzivní volání metody

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

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

Binární vyhledávací stromy II

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Programování v C++ 1, 16. cvičení

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Dynamické datové struktury IV.

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Binární vyhledávací stromy pokročilé partie

Stromy. Jan Kybic.

Rekurzivní algoritmy

Dynamické datové struktury III.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

Dynamické datové struktury II.

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Spojová implementace lineárních datových struktur

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Základy algoritmizace c2007 Michal Krátký, Jiří Dvorský 1/57

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Stromy. Jan Hnilica Počítačové modelování 14

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Vyhledávací stromy. Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání.

Algoritmy II. Otázky k průběžnému testu znalostí

Algoritmy výpočetní geometrie

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Radek Mařík

BINARY SEARCH TREE

Vzdálenost uzlů v neorientovaném grafu

a) b) c) Radek Mařík

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

Zadání druhého zápočtového projektu Základy algoritmizace, 2005

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Datové struktury 2: Rozptylovací tabulky

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Základy informatiky. Teorie grafů. Zpracoval: Pavel Děrgel Úprava: Daniela Szturcová

BINARY SEARCH TREE

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Teorie grafů BR Solutions - Orličky Píta (Orličky 2010) Teorie grafů / 66

PQ-stromy a rozpoznávání intervalových grafů v lineárním čase

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

TGH07 - Chytré stromové datové struktury

Základy algoritmizace. Hašování

autoři: Rudolf Bayer, Ed McCreight všechny vnější uzly (listy) mají stejnou hloubku ADS (abstraktní datové struktury)

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

5 Orientované grafy, Toky v sítích

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Složitosti základních operací B + stromu

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

STROMY A KOSTRY. Stromy a kostry TI 6.1

Algoritmizace a programování

Implementace binárního stromu směrníky

Maturitní téma: Programovací jazyk JAVA

Datové struktury Úvod

TGH07 - Chytré stromové datové struktury

Časová a prostorová složitost algoritmů

Algoritmizace prostorových úloh

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

TGH05 - aplikace DFS, průchod do šířky

Grafy. RNDr. Petra Surynková, Ph.D. Univerzita Karlova v Praze Matematicko-fyzikální fakulta.

STROMY A KOSTRY. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze. BI-GRA, LS 2010/2011, Lekce 6

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Přednáška 3: Limita a spojitost

SQL tříhodnotová logika

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

Úvod do programovacích jazyků (Java)

Spojové struktury. Spojová struktura (linked structure):

Prioritní fronta, halda

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

3. Podmíněná pravděpodobnost a Bayesův vzorec

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Stromové struktury v relační databázi

Texty k přednáškám z MMAN3: 4. Funkce a zobrazení v euklidovských prostorech

Výroková a predikátová logika - II

fakulty MENDELU v Brně (LDF) s ohledem na disciplíny společného základu (reg. č. CZ.1.07/2.2.00/28.

Operační výzkum. Síťová analýza. Metoda CPM.

Základy informatiky. 07 Teorie grafů. Kačmařík/Szturcová/Děrgel/Rapant

Úvod. Úvod do programování. Úvod. Hashovací tabulky

Transkript:

Základy algoritmizace Michal Krátký 1, Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Základy algoritmizace, 2006/2007 Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Volné stromy 7. přednáška Souvislý, acyklický, neorientovaný graf nazýváme volným stromem (free tree). Často vynecháváme adjektivum volný, a říkáme jen, že daný graf je strom. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský2/39

Volné stromy 7. přednáška Necht G = (V, E) je neorientovaný graf, potom následující tvrzení jsou ekvivalentní: 1 G je volný strom. 2 Každé dva uzly v G jsou spojeny právě jednou cestou. 3 G je souvislý, ale pokud odebereme libovolnou hranu, získáme nesouvislý graf. 4 G je souvislý, a E = V 1. 5 G je acyklický, a E = V 1. 6 G je acyklický. Přidáním jediné hrany do množiny hran E bude výsledný graf obsahovat kružnici. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský3/39

Kořenové stromy a seřazené stromy Kořenový strom (rooted tree) je volný strom, který obsahuje jeden odlišný uzel. Tento odlišný uzel se nazývá kořen. Uvažujme uzel x v kořenovém stromu T s kořenem r. Libovolný uzel y na jednoznačné cestě od kořene r do uzlu x se nazývá předchůdce (předek) uzlu x. Jestliže y je předchůdce x, potom x se nazývá následovník (potomek) uzlu y. Každý uzel je pochopitelně předchůdcem a následovníkem sama sebe. Jestliže y je předchůdce x a zároveň x y, potom y je vlastní předchůdce uzlu x a x je vlastní následovník uzlu y. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský4/39

Kořenové stromy a seřazené stromy (1) b a (0) g (6) (4) b a (9) g (8) (2) c (5) f h (7) (2) c (3) f h (7) (3) d (4) e (a) i (8) j (9) (0) d (1) e (b) i (5) j (6) Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský5/39

Kořenové stromy a seřazené stromy Jestliže poslední hrana na cestě z kořene r do uzlu x je hrana (y, x), potom se uzel y nazývá rodič uzlu x a uzel x je dítě (přímý potomek) uzlu y. Kořen stromu je jediným uzlem ve stromu bez rodiče. Dva uzly mající stejného rodiče se nazývají sourozenci. Uzel bez potomků se nazývá externí uzel nebo-li list. Nelistový uzel se nazývá vnitřní uzel. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský6/39

Kořenové stromy a seřazené stromy Počet přímých potomků uzlu x v kořenovém stromu se nazývá stupeň uzlu x. Poznamenejme, že stupeň uzlu závisí na tom, zda strom T uvažujeme jako volný strom nebo jako kořenový strom. V prvním případě, je stupeň počet sousedních uzlů. V kořenových stromech je stupeň definován jako počet dětí tedy rodič uzlu se nebere v úvahu. Délka cesty od kořene k uzlu x se nazývá hloubka uzlu x ve stromu T. Největší hloubka libovolného uzlu se nazývá výška stromu T. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský7/39

Kořenové stromy a seřazené stromy Seřazený (ordered tree) je kořenový strom, ve kterém jsou přímí potomci každého uzlu seřazeni. Tudíž, pokud uzel má k dětí, lze určit prvního přímého potomka, druhého přímého potomka, až k-tého přímého potomka. (1) b a (0) g (6) (4) b a (9) g (8) (2) c (5) f h (7) (2) c (3) f h (7) (3) d (4) e (a) i (8) j (9) (0) d (1) e (b) i (5) j (6) Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský8/39

7. přednáška Binární strom lze nejlépe definovat rekurzivně. Binární strom je struktura definovaná nad konečnou množinou uzlů, která: neobsahuje žádný uzel je složena ze tří disjunktních množin uzlů: kořene, binárního stromu zvaného levý podstrom a binárního stromu tzv. pravého podstromu. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský9/39

7. přednáška Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský10/39

7. přednáška Binární strom, který neobsahuje žádný uzel se nazývá prázdný strom. Jestliže levý podstrom je neprázdný, jeho kořen je levým přímým potomkem kořene celého stromu. Stejně tak, kořen neprázdného pravého podstromu se nazývá pravým přímým potomkem kořene daného stromu. Binární strom není jen seřazený strom, ve kterém má každý uzel stupeň nejvýše dva. Například, v binárním stromu, jestliže uzel má pouze jednoho přímého potomka, potom fakt, že přímý potomek je levý nebo pravý je důležitý. V seřazeném stromu není u jediného přímého potomka možnost rozlišit, zda je pravý nebo levý. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský11/39

7. přednáška Umíst ování informace odlišující binární stromy od seřazených stromů, lze rozšířit na stromy s více než dvěma dětmy uzlu. V pozičním stromu (positional tree) jsou jednotliví přímí potomci očíslováni kladným celým číslem. Říkáme, že i-tý přímý potomek chybí, jestliže neexistuje přímý potomek označen číslem i. n-ární strom je poziční strom, kde v každém uzlu, všichni přímí potomci s číslem vyšším než n chybí. Proto binární strom je n-ární strom s n = 2. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský12/39

7. přednáška Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský13/39

7. přednáška Úplný n-ární strom je n-ární strom, ve kterém všechny listy mají stejnou hloubku a všechny vnitřní uzly mají stejný stupeň n. Kořen stromu má n potomků s hloubkou 1, z nichž každý má n potomků s hloubkou 2 atd. Tedy, počet listů v hloubce h je n h. Následně, hloubka úplného n-árního stromu s m listy je log n m. Počet interních uzlů úplného n-árního stromu výšky h je h 1 1 + n + n 2 + + n h 1 = n i = nh 1 n 1 i=0 Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský14/39

Binární vyhledávací strom je organizován jako binární strom. se nejčastěji implementují pomocí dynamických struktur. Každý uzel potom obsahuje klíč, na jehož doméně je definováno uspořádání. Dále každý uzel obsahuje ukazatele left a right na svého levého a pravého přímého potomka. Jestliže některý přímý potomek chybí, je patřičná položka nastavena na nulový ukazatel (NULL, null). Uzel samozřejmě může obsahovat i další data v závislosti na povaze aplikace. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský15/39

Klíče v binárním vyhledávacím stromu jsou vždy uspořádány tak, že splňují vlastnost binárních vyhledávacích stromů: Necht x je uzel v binárním stromu. Jestliže y je z levého podstromu uzlu x, potom key[y] key[x]. Jestliže y je z pravého podstromu uzlu x, potom key[x] key[y]. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský16/39

Vkládání do binárního stromu (Insert) Vkládání do binárního vyhledávacího stromu probíhá obdobně jako vyhledávání v takovém stromu. Nejprve je nutno určit kam bude prvek vložen. Vzhledem k uspořádání klíčů ve stromu je takové místo určeno jednoznačně. Stejně jako při vyhledávání sestupujeme rekurzivně od kořene dolů směrem k listům. Vkládaný prvek x porovnáme s kořenem r zkoumaného podstromu. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský17/39

Vkládání do binárního stromu Mohou nastat tyto případy: 1 strom s kořenem r je prázdný (r = NULL/null), vytvoříme nový uzel. 2 V opačném případě, srovnáme klíč k s klíčem kořene právě zkoumaného stromu resp. jeho podstromu r. V případě, že 1 key(x) < key(r): pokračujeme rekurzivně levým podstromem; 2 key(x) = key(r): prvek x byl nalezen ve stromu. Záleží na konkrétní aplikaci, jak naloží s duplicitními výskyty prvků. 3 key(x) > key(r): pokračujeme rekurzivně pravým podstromem. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský18/39

7. přednáška Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský19/39

BinaryTree.Insert() Implementace 1/4 public class BinaryTreeNode { public BinaryTreeNode mleftchild = null; public BinaryTreeNode mrightchild = null; public int mkey = -1; } public BinaryTreeNode(int value) { mkey = value; } Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský20/39

BinaryTree.Insert() Implementace 2/4 public class BinaryTree { BinaryTreeNode mrootnode = null; public void Insert(int value) { BinaryTreeNode currentnode = mrootnode; BinaryTreeNode oldnode = null; boolean rightf = false; for ( ; ; ) { Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský21/39

BinaryTree.Insert() Implementace 3/4 if (currentnode == null) { currentnode = new BinaryTreeNode(value); if (oldnode!= null) { if (rightf) { oldnode.mrightchild=currentnode;} else { oldnode.mleftchild=currentnode; } } else { mrootnode = currentnode; } break; } Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský22/39

BinaryTree.Insert() Implementace 4/4 } else { if (value < currentnode.mkey) { oldnode = currentnode; currentnode = currentnode.mleftchild; rightf = false; } else if (value > currentnode.mkey) { oldnode = currentnode; currentnode = currentnode.mrightchild; rightf = true; } else { break; } } Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský23/39

Vyhledávání v binárním stromu (Find) Vyhledání prvku, zda je či není ve stromu. Mimo tuto operaci Find lze na binárních stromech implementovat i operace Minimum a Maximum. Všechny zmíněné operace pracují v čase O(h), kde h je výška stromu. Metoda vyhledání daného prvku v binárním stromu, lze nejjednodušeji realizovat, jak je u stromů obvyklé, rekurzivně. Mějme dánu množinu M reprezentovanou binárním stromem a jeho kořen r. Dále mějme dán prvek s klíčem k, který hledáme. Základem vyhledávací procedury je uspořádaní klíčů ve stromu. Hledání zahájíme v kořeni stromu r. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský24/39

Vyhledávání v binárním stromu Potom mohou nastat tyto možnosti: 1 Strom s kořenem r je prázdný (r = NULL/null), potom tento strom nemůže obsahovat prvek s klíčem k, k / M. 2 V opačném případě srovnáme klíč k s klíčem kořene právě zkoumaného stromu resp. jeho podstromu r. V případě, že 1 k = key(r): strom obsahuje prvek s klíčem k, k M. 2 k < key(r): vzhledem k vlastnostem binárních vyhledávacích stromů, jsou všechny prvky s klíči menšími než je klíč r v jeho levém podstromu, pokračujeme rekurzivně v levém podstromu; 3 k > key(r): na rozdíl od předchozího případu jsou všechny prvky s klíči většími než je klíč r v pravém podstromu, pokračujeme pravým podstromem. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský25/39

7. přednáška Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský26/39

BinaryTree.Find() Implementace 1/1 public boolean Find(int value) { BinaryTreeNode currentnode = mrootnode; boolean ret = false; while(currentnode!= null) { if (value < currentnode.mkey) { currentnode=currentnode.mleftchild; } else if (value > currentnode.mkey) { currentnode=currentnode.mrightchild; } else { ret = true; break; } } return ret; } Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský27/39

Hledání minima a maxima Prvek jehož klíč je minimem z množiny reprezentované daným stromem, lze v binárním stromu velice lehce najít sledováním pointerů left od kořene až k listu. Prvek v nejlevějším listu je pak hledaným minimem. Pro maximum je kód symetrický. Obě funkce pracují v čase O(h), kde h je výška stromu. Binární vyhledávací strom zaručuje, že postup vyhledání minima je korektní. Jestliže uzel x nemá levý podstrom, potom všechny klíče v pravém podstromu musí být větší nebo rovny než klíč x. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský28/39

Rušení uzlů v binárním stromu (Delete) Rušení uzlů v binárním stromu je vhodné řešit opět pomocí rekurze. Nejdříve je nutné rušený prvek nalézt ve stromu. Postupujeme obdobně jako v případě vyhledávání, tj. sestupujeme rekurzivně od kořene dolů, směrem k listům. Pokud rušený prvek ve stromu není, procedura končí bez jakékoliv činnosti. Jinak předpokládejme, že rušíme uzel x. Naše další činnost bude záviset na počtu přímých potomků uzlu x. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský29/39

Rušení uzlů v binárním stromu Pokud má x nula dětí to znamená, že uzel x je list a lze jej snadno od stromu odříznout. jedno dítě uzel x již nelze snadno od stromu oddělit, protože odříznutím uzlu x bychom ztratili i jeho přímého potomka. Vezmeme tedy přímého potomka uzlu x, přičemž je celkem lhostejné, zda je to přímý potomek levý nebo přímý potomek pravý a napojíme na něj ukazatel z rodiče uzlu x. Jinými slovy uzel x obejdeme, čímž se bezpečně vypojí ze stromu a můžeme jej uvolnit z paměti. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský30/39

7. přednáška Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský31/39

Rušení uzlů v binárním stromu Pokud má x dva přímé potomky v tomto nejsložitějším případě musíme nahradit uzel x jeho předchůdcem resp. následovníkem, ve smyslu uspořádání klíčů uzlů. Předpokládejme, že budeme nahrazovat předchůdcem. Předchůdce uzlu x je nutno hledat v jeho levém podstromu, kde jsou uloženy všechny prvky s klíči menšími než je klíč x. Jelikož předchůdcem rozumíme nejbližší menší prvek než x, nejblíže prvku x bude právě maximum ze všech prvků v levém podstromu uzlu x. Maximum ve stromu se nalézá v jeho nejpravějším uzlu. Stručně řečeno, hledáme nejpravější uzel z levého podstromu uzlu x. Tímto uzlem nahradíme uzel x. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský32/39

Průchod stromem 7. přednáška Jednotlivé uzly ve stromu se budou navštěvovat v určitém specifickém pořadí a je možné si představit, jako by uzly stromu byly lineárně uspořádané. Rozlišujeme tři základní uspořádání, která jsou přirozeným důsledkem stromové struktury. Podobně jako samotný strom se i tato uspořádání dají jednoduše vyjádřit rekurzivně. Necht R označuje kořen stromu, A a B jeho levý resp. pravý podstrom. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský33/39

Průchod stromem 7. přednáška 1 Přímé (preorder): R, A a B nejprve byl navštíven kořen pak jeho podstromy. 2 Vnitřní (inorder): A, R a B nejprve levý podstrom, kořen a nakonec pravý podstrom. 3 Zpětné (postorder): A, B a R kořen se navštíví až po podstromech. Tato schémata se rekurzivně aplikují na celý strom. Je například zřejmé, že pokud použijeme průchod inorder budou jednotlivé uzly navštíveny v souladu s uspořádáním klíčů ve stromu. Průchod postorder je vhodný například v destruktoru třídy při dealokaci celého stromu z paměti. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský34/39

Průchod stromem 7. přednáška (1) b a (0) g (6) (4) b a (9) g (8) (2) c (5) f h (7) (2) c (3) f h (7) (3) d (4) e (a) i (8) j (9) (0) d (1) e (b) i (5) j (6) Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský35/39

Příklad Počet uzlů Mějme napsat funkci, která spočítá uzly ve stromu. Naše úloha se výrazně zjednoduší uvědomíme-li si její rekurzivní charakter a předpokládáme, že aktuální uzel je R: Je-li R prázdný strom (tj. R = NULL/null), pak počet jeho uzlů je nula. V opačném případě víme, že ve stromu určitě jeden uzel existuje (R) a počty uzlů v levém a pravém podstromu se dají určit obdobným způsobem rekurzivně. To znamená, že počet uzlů ve stromu s kořenem R je 1 + pocet_uzlu(a) + pocet_uzlu(b) Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský36/39

Analýza vyhledávání a vkládání Starosti při použití binárního stromu způsobuje především skutečnost, že se dost dobře neví, jak bude strom narůstat; neexistuje v podstatě žádná přesná představa o jeho tvaru. Jediné co se dá předpokládat je, že to nebude dokonale vyvážený strom. Průměrný počet porovnání potřebných pro lokalizaci klíče v dokonale vyváženém stromu je přibližně h = log n. Průměrný počet porovnání v našem případě bude určitě větší než h. Otázkou je o kolik bude větší. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský37/39

Analýza vyhledávání a vkládání Není těžké najít nejhorší případ. Předpokládejme, že všechny klíče jsou již setříděny (at už sestupně nebo vzestupně). Každý klíč je při budování stromu připojen nalevo (resp. napravo) ke svému rodiči a výsledný strom bude degenerovaný, jinými slovy stane se z něj lineární seznam. Vyhledávání v takovém případě bude vyžadovat n/2 porovnání. Nyní se pokusme stanovit průměrnou délku cesty vyhledávání vzhledem ke všem n klíčům a všem n! stromům, které lze vygenerovat z n! permutací n klíčů. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský38/39

Analýza vyhledávání a vkládání Průměrná délka cesty: a n = 2[ln(n) + γ] 3 = 2 ln(n) c Protože průměrná délka cesty v dokonale vyváženém stromu je přibližně a n = log(n) 1 dostáváme vztah a n lim n a n = 2 ln n log n = 2 ln 2 = 1, 386 Budeme-li se snažit za každou cenu zkonstruovat dokonale vyvážený strom, místo náhodného, můžeme za předpokladu shodné pravděpodobnosti vyhledání všech klíčů, očekávat průměrné zlepšení vyhledávání nejvíce o 39%. Prakticky je toto zlepšení významnější. Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský39/39