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



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

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

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

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

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

Algoritmy a datové struktury

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

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.

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í v C++ 1, 16. cvičení

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

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

Binární vyhledávací stromy II

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ární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

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í stromy pokročilé partie

Stromy. Jan Kybic.

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

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

Dynamické datové struktury III.

Rekurzivní algoritmy

Dynamické datové struktury II.

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

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í

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

Radek Mařík

BINARY SEARCH TREE

Vzdálenost uzlů v neorientovaném grafu

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

a) b) c) Radek Mařík

Grafové algoritmy. Programovací techniky

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

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

Maturitní téma: Programovací jazyk JAVA

Grafové algoritmy. Programovací techniky

Algoritmy výpočetní geometrie

BINARY SEARCH TREE

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

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

Datové struktury 2: Rozptylovací tabulky

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

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

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

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

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

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

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

STROMY A KOSTRY. Stromy a kostry TI 6.1

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

LDF MENDELU. Simona Fišnarová (MENDELU) Základy lineárního programování VMAT, IMT 1 / 25

TGH07 - Chytré stromové datové struktury

Datové struktury Úvod

Časová a prostorová složitost algoritmů

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

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

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

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

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

Algoritmizace a programování

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

Stromové struktury v relační databázi

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

Základy algoritmizace. Hašování

SQL tříhodnotová logika

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

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

které je z různých pohledů charakterizují. Několik z nich dokážeme v této kapitole.

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)

Základní datové struktury

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

Prioritní fronta, halda

TÉMATICKÝ OKRUH TZD, DIS a TIS

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

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

Algoritmizace prostorových úloh

ABSTRAKTNÍ DATOVÉ TYPY

Transkript:

Volné stromy Úvod do programování 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. Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 1/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 2/39 Volné stromy 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. Kořenový strom (rooted tree) jevolný strom, který obsahuje jeden odlišný uzel. Tento odlišný uzel se nazývá kořen. Uvažujme uzel xvkořenovém stromu T skořenem r. Libovolný uzel y na jednoznačné cestě odkoř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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 3/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 4/39 Jestliže poslední hrana na cestě zkořene r do uzlu x je hrana (y, x), potom se uzel y nazývá rodič uzlu x auzelx 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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 5/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 6/39

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. 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. 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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 7/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 8/39 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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 9/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 10/39 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ý. 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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 11/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 12/39

Ú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 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 13/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 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. 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]. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 15/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 16/39 Vkládání do binárního stromu (Insert) Vkládání do binárního stromu 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. 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. Vpří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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 17/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 18/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; c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 19/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 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 ( ; ; ) 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; c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 21/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 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; c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 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. Vpří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ě vlevé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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 25/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 26/39 BinaryTree.Find() Implementace 1/1 Hledání minima a maxima 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; c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 27/39 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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 28/39 Rušení uzlů v binárním stromu (Delete) Rušení uzlů v binárním stromu 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. Pokud má x nula dětí to znamená, že uzel x je list a lze jej snadno od stromu odříznout. jedno dítě uzelx 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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 29/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 30/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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 31/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 32/39 Průchod stromem Průchod stromem 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. 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. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 33/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 34/39 Průchod stromem 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) c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 35/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 36/39

Analýza vyhledávání a vkládání 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ší. 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íč jepř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íčů. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 37/39 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 38/39 Analýza vyhledávání a vkládání Průměrná délka cesty: a n = 2[ln(n)+γ] 3 = 2ln(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 = 2lnn = 2ln2= 1, 386 log n 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ší. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 39/39