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

Podobné dokumenty
Stromy, haldy, prioritní fronty

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

Rekurzivní algoritmy

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 výpočetní geometrie

Datové struktury 2: Rozptylovací tabulky

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

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

Dynamické programování

TGH07 - Chytré stromové datové struktury

Datové struktury 1: Základní datové struktury

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

Prioritní fronta, halda

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

TGH07 - Chytré stromové datové struktury

Dynamické datové struktury III.

Algoritmy na ohodnoceném grafu

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

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

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

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

Techniky návrhu algoritmů

Dynamické datové struktury IV.

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

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

TGH05 - Problém za milion dolarů.

PROHLEDÁVÁNÍ GRAFŮ. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

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

Algoritmy a datové struktury

Stromy. Jan Kybic.

Datové struktury Úvod

Použití dalších heuristik

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

NPRG030 Programování I, 2018/19 1 / :03:07

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

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

Vzdálenost uzlů v neorientovaném grafu

Binární Vyhledávací Stromy, u kterých je. složitost operací v nejhorším. rovná O(log n)

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

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

TOKY V SÍTÍCH II. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

ADT STROM Lukáš Foldýna

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

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.

TGH08 - Optimální kostry

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

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

Časová a prostorová složitost algoritmů

TGH06 - Hledání nejkratší cesty

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

Jan Březina. 7. března 2017

Grafové algoritmy. Programovací techniky

TGH06 - Hledání nejkratší cesty

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

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

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

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

Algoritmická matematika 1

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.

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

Grafové algoritmy. Programovací techniky

Algoritmus pro hledání nejkratší cesty orientovaným grafem

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

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

Úvod do teorie grafů

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

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

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í

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

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

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

Lineární algebra : Násobení matic a inverzní matice

6. Tahy / Kostry / Nejkratší cesty

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

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

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

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

Prioritní fronta, halda (heap), řazení

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

ALGORITMY A DATOVÉ STRUKTURY

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

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

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

PŘEDNÁŠKA 2 POSLOUPNOSTI

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

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

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

Hledáme efektivní řešení úloh na grafu

Dynamické programování. Optimální binární vyhledávací strom

Radek Mařík

Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika

opakování reprezentace grafů, dijkstra, bellman-ford, johnson

BINARY SEARCH TREE

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

4EK311 Operační výzkum. 5. Teorie grafů

Algoritmy I, složitost

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

H {{u, v} : u,v U u v }

Transkript:

Základní datové struktury III: Stromy, haldy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA) ZS 2010/11, Přednáška 4 Evropský sociální fond. Praha & EU: Investujeme do vaší budoucnosti prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 1 / 24

Motivace Volání rekurzivní funkce Motivace 1: Volání rekurzivní funkce Stromy jako DS jsou potřebné pro řešení rekurzivně definova(tel)ných problémů. Příklad: graf volání QuickSortu. 179 24125 2621714 19128 23 291112 175 25 9125 21412811125 1717 24261923291725 5 2 8 5 9 1214121112 192317 24 262925 3 5 5 8 11 121212 14 17 19 23 25 26 29 prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 2 / 24

Motivace Rekurzivně definova(tel)ná množina dat Motivace 2: Rekurzivně definova(tel)ná množina dat Množina všech permutací dané posloupnosti. * * * * 1 * * * 2 * * * 3 * * * 4 * * * 2 1 * * 2 3 * * 2 4 * * 2 4 1 * 2 4 3 * prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 3 / 24

Stromy v teorii grafů Volné stromy Volné stromy Definice 1 Volný strom je každý souvislý acyklický a neorientovaný graf. Les je každý acyklický a neorientovaný graf. Poznámka: Většina algoritmů nad stromy funguje i nad lesy. prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 4 / 24

Stromy v teorii grafů Volné stromy Vlastnosti volných stromů Věta 2 Nechť G = (V (G), E(G)) je neorientovaný graf. Pak následující tvrzení jsou ekvivalentní. 1 G je volný strom. 2 Jakékoli 2 uzly v G jsou spojeny jedinečnou jednoduchou cestou. 3 G je souvislý, ale pokud vyjmeme jakoukoli hranu z E(G), výsledný graf bude nesouvislý. 4 G je souvislý a E(G) = V (G) 1. 5 G je acyklický a E(G) = V (G) 1. 6 G je acyklický, ale pokud přidáme jakoukoli hranu do E(G), výsledný graf bude obsahovat aspoň jeden cyklus. prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 5 / 24

Stromy v teorii grafů Kořenové stromy Kořenové stromy Definice 3 Kořenový strom je volný strom, ve kterém jeden z uzlů, r, je odlišen od ostatních jako kořen a hrany jsou orientované stejným směrem vzhledem ke kořenu r. Nechť uzel u leží na (jedinečné) cestě z kořene r do uzlu v. Pak u je předek v a v je potomek u. Nejbližší předek uzlu je jeho rodič a nejbližší potomek je jeho syn. Každý uzel kromě kořenu má jedinečného rodiče. Uzly se stejným rodičem jsou sourozenci. Uzel, který nemá potomky, se nazývá list. Ostatní uzly jsou vnitřní. Stupeň vnitřního uzlu je počet jeho synů. k-ární strom: každý vnitřní uzel má stupeň nejvýše k. prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 6 / 24

Stromy v teorii grafů Kořenové stromy Hloubka a výška Definice 4 Uzly u ve vzdálenosti k od kořenu r tvoří hladinu uzlů v hloubce (depth) d(u) = k. Hloubka stromu d(t ) je hloubka od kořene nejvzdálenějšího listu. Výška (height) uzlu u je h(u) = d(t ) d(u). Výška podstromu T s kořenem r je h(r ) = max u T (d(u) d(r )). Kořen r má hloubku d(r) = 0. Poznámka: Pokud nebude řečeno jinak, stromem budeme dále rozumět kořenový strom. prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 7 / 24

Stromy jako datové struktury Uspořádané stromy Uspořádané stromy k-ární stromy jsou z implementačních důvodů obvykle uspořádané. Definice 5 Uspořádaný strom. Synové každého vnitřního uzlu jsou očíslovány (zleva doprava) čísly {1,..., #počet synů}. Dva kořenové stromy se stejnými uzly v jiném pořadí jsou různé uspořádané stromy. prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 8 / 24

Stromy jako datové struktury Poziční stromy Poziční stromy k-ární stromy jsou z implementačních důvodů ještě častěji poziční. Definice 6 Poziční strom. Synové každého vnitřního uzlu jsou označeny různými čísly. Pokud žádný syn není označen číslem i, pak i-tý syn chybí a příslušný podstrom je prázdný (NIL). Dva kořenové stromy se stejnými podstromy ale jiným označením pozic jsou různé poziční stromy. k-ární strom je poziční strom, kde každý uzel má syny označeny čísly k. prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 9 / 24

Stromy jako datové struktury Binární stromy Binární stromy Definice 7 k-ární strom pro k = 2 se nazývá binární. Alternativní rekurzivní definice binárního stromu. Definice 8 Binární strom (BS) T je datová struktura definovaná nad konečnou množinou uzlů, která buď neobsahuje žádné uzly nebo obsahuje 3 disjunktní množiny uzlů: kořen, BS zvaný levý podstrom a BS zvaný pravý podstrom. Pokud není levý podstrom prázdný (NIL), jeho kořen je levým synem kořenu. Podobně pro pravý podstrom. prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 10 / 24

Stromy jako datové struktury Plné, výškově vyvážené a úplné stromy k-ární stromy Plné, výškově vyvážené a úplné k-ární stromy Definice 9 (a) Plný k-ární strom: Každý vnitřní uzel má stupeň právě k. (b) Výškově vyvážený strom: Hloubka libovolných dvou listů se liší nejvýše o 1. (c) Úplný k-ární strom: Výškově vyvážený plný k-ární strom, plněný zleva doprava, kde nejvýše 1 vnitřní uzel má stupeň menší než k. Užší definice: plný k-ární strom, jehož všechny listy mají stejnou hloubku. prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 11 / 24

Stromy jako datové struktury Vlastnosti úplných k-árních stromů Vlastnosti úplných k-árních stromů Věta 10 Nechť T je úplný k-ární strom o n uzlech. Pak Hloubka d(t ) je log k n d(t ) log k n. Počet uzlů v hloubce i < d(t ) je k i. Pro n = kd(t )+1 1 k 1 mají všechny listy hloubku d(t ) a všechny vnitřní uzly stupeň k. Počet listů je pak k d(t ) a počet vnitřních uzlů je k d(t ) 1 k 1. Domácí úkol: Najděte přesný výraz pro d(t ). prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 12 / 24

Stromy jako datové struktury Vlastnosti binárních a úplných binárních stromů Vlastnosti úplných binárních stromů (ÚBS) Věta 11 Nechť T je ÚBS o n uzlech. Pak (a) Hloubka d(t ) = log n. (b) Počet uzlů v hloubce i < d(t ) je 2 i. (c) Počet vnitřních uzlů je n/2 a počet listů je n/2. (d) Pro n = 2 d(t )+1 1 mají všechny listy hloubku d(t ). Věta 12 Nechť T je libovolný binární strom o n uzlech. Pak (e) log n d(t ) n 1. (f) Počet uzlů stupně 2 = počet listů minus jedna. (Snadno indukcí.) prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 13 / 24

Implementace binárních stromů Implementace obecného binárního stromu pomocí spojových struktur Implementace binárního stromu pomocí spojových struktur struct node { int val; node *parent; node *left; node *right } prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 14 / 24

Implementace binárních stromů Implementace ÚBS pomocí pole Implementace ÚBS pomocí pole Věta 13 Nechť T je ÚBS o n uzlech. Předpokládejme, že uzly T jsou číslovány zleva doprava shora dolů a že kořen má číslo 1. Pak lze ÚBS reprezentovat pomocí jednorozměrného pole A[1,..., n] tak, že uzel stromu i je reprezentován prvkem pole A[i]. Indexy rodiče, levého syna a pravého syna uzlu i v poli A lze spočítat pomocí následujících funkcí: parent(i) = i/2. left(i) = 2i. right(i) = 2i + 1. prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 15 / 24

Binární halda Definice Binární halda (heap) Definice 14 Uvažujme pole A[1,..., Length(A)] ordinálního typu implementující ÚBS pomocí funkcí parent, left, right. Pak binární halda o velikosti Heap Size(A) Length(A) je dynamická množina uložená v A[1,..., Heap Size(A)], jejíž prvky splňují H-vlastnost: Pro každý prvek s indexem 1 < i Heap Size(A) platí A[parent(i)] A[i]. (1) prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 16 / 24

Binární halda Udržování H-vlastnosti Algoritmus udržování H-vlastnosti Algoritmus 15 Vstup: Pole A a index i takový, že binární podstromy s kořeny v A[left(i)] a A[right(i)] jsou binární haldy (splňují H-vlastnost), ale přitom A[i] < A[left(i)] nebo A[i] < A[right(i)]. procedure heapify(a, i) { (1) l left(i); (2) r right(i); (3) if (l Heap Size(A) & A[l] > A[i]) (4) then Largest l else Largest i; (5) if (r Heap Size(A) & A[r] > A[Largest]) (6) then Largest r; (7) if (Largest i) (8) then {A[i] A[Largest]; heapify(a, Largest)} } prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 17 / 24

Binární halda Udržování H-vlastnosti Složitost algoritmu udržování H-vlastnosti Věta 16 Časová složitost operace heapify na podstromu o n uzlech (s kořenem A[i]) je t HP (n) t HP (2n/3) + Θ(1) (2) (což znamená t HP (n) = O(log n), viz BI-ZDM). Důkaz. Po provedení Θ(1) operací, procedura heapify se volá rekurzivně pro levý nebo pravý podstrom a ten má v nejhorším případě velikost 2n 3 (případ, kdy poslední hladina stromu je zaplněna přesně z jedné poloviny). prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 18 / 24

Binární halda Algoritmus konstrukce haldy Konstrukce haldy Algoritmus 17 Vstup: libovolné pole A[1,..., Length(A)]. procedure buildheap(a) { (1) Heap Size(A) Length(A); (2) for (i = length(a)/2 downto 1) (3) do heapify(a, i) } prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 19 / 24

Binární halda Algoritmus konstrukce haldy Složitost algoritmu konstrukce haldy Věta 18 Časová složitost t BH (n) = O(n). Důkaz. Protože se n/2 krát volá heapify, které trvá O(log n), je t BH (n) = O(n log n). Protože halda je ÚBS, platí, že ve výšce h je nejvýše n 2 uzlů. heapify haldy o výšce h trvá O(h). Tedy h+1 t BH (n) = log n h=0 n 2 h+1 O(h) = O n log n h=0 h = O(2n) = O(n). 2 h prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 20 / 24

HeapSort HeapSort Algoritmus 19 Vstup: libovolné pole A[1,..., Length(A)]. procedure HeapSort(A) { (1) buildheap(a); (2) for (i length(a) downto 2) (3) do { A[1] A[i]; (4) Heap Size(A) Heap Size(A) 1; (5) heapify(a, 1) } } Věta 20 Časová složitost t HS (n) = O(n log n). Důkaz. t HS (n) = t BH (n) + 2 i=n 1 (t HP(i) + Θ(1)) = O(n) + O( n 1 i=2 log i) = O(log(n!)) = O(n log n). prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 21 / 24

Prioritní fronta Prioritní fronta Definice 21 Prioritní fronta je dynamická množina umožňující efektivní vkládání libovolných nových prvků a jejich vybírání v pořadí jejich velikosti pomocí následujících operací: getmax(a), extractmax(a), insert(a, val). prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 22 / 24

Prioritní fronta Operace nad prioritní frontou function getmax(a) { return A[1] } procedure extractmax(a) { (1) if (Heap Size(A) < 1) (2) then error(heapunderflow); (3) max A[1]; (4) A[1] A[Heap Size[A]]; (5) Heap Size(A) Heap Size(A) 1; (6) heapify(a, 1); (7) return max} } prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 23 / 24

Prioritní fronta Operace nad prioritní frontou procedure insert(a, val) { (1) Heap Size(A) Heap Size(A) + 1; (2) i Heap Size(A); (3) while (i > 1 & A[parent(i)] < val) (4) do { (5) A[i] A[parent(i)]; (6) i parent(i); (7) } (8) A[i] val } prof. Pavel Tvrdík (FIT ČVUT) Stromy a haldy BI-EFA, 2010, Předn. 4 24 / 24