Stromy. Jan Kybic.

Podobné dokumenty
Prioritní fronta, halda

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

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

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

Spojový seznam. Jan Kybic.

Stromy, haldy, prioritní fronty

Algoritmy a datové struktury

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

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

Rozptylovací tabulky

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

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

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

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í

Třídění a vyhledávání Searching and sorting

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í

Dynamické datové struktury II.

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

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

BINARY SEARCH TREE

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

Radek Mařík

STACK

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

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2013/2014 Radim Farana. Obsah. Strom

Dynamické datové struktury IV.

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.

BINARY SEARCH TREE

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

Datové struktury Úvod

TGH07 - Chytré stromové datové struktury

Rekurzivní algoritmy

a) b) c) Radek Mařík

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

Dynamic programming. Optimal binary search tree

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

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

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

ADT STROM Lukáš Foldýna

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

TGH07 - Chytré stromové datové struktury

Úvod do teorie grafů

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

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

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

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

Algoritmy na ohodnoceném grafu

Binární vyhledávací stromy II

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

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

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

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í

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

IB111 Úvod do programování skrze Python

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

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

Algoritmy I, složitost

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

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

Rozptylování, stromy - zákl. vlastnosti

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

Algoritmizace prostorových úloh

TGH05 - Problém za milion dolarů.

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

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

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

Časová složitost / Time complexity

SQL tříhodnotová logika

Da D to t v o é v ty t py IB111: Datové typy

Datové struktury 2: Rozptylovací tabulky

Rekurze a rychlé třídění

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

Dynamické datové struktury I.

Časová a prostorová složitost algoritmů

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

Jednoduché datové struktury a stromy

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

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

Záznam, zásobník a fronta

Konečný automat. Jan Kybic.

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

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

Programování v Pythonu

5. Vyhledávání a řazení 1

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

R zné algoritmy mají r znou složitost

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

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

6. Tahy / Kostry / Nejkratší cesty

Vzdálenost uzlů v neorientovaném grafu

Algoritmizace prostorových úloh

3 Algoritmy řazení. prvku a 1 je rovněž seřazená.

Abstraktní datové typy

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

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

Transkript:

Stromy Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 1 / 44

Stromy Binární vyhledávací stromy Množiny a mapy 2 / 44

Strom (Tree) Strom skládá se s uzlů (nodes) spojených hranami (edges). je souvislý a acyklický a Kořenový strom orientovaný graf, má jeden význačný uzel = kořen (root) b c z kořene vede do každého jiného uzlu právě jedna orientovaná cesta d e f do kořene nevstupuje žádná hrana, do každého jiného uzlu vstupuje právě jedna hrana 3 / 44

Vlastnosti stromů každé dva uzly jsou spojeny právě jednou neorientovanou cestou počet hran = počet uzlů - 1 pokud jednu hranu vyjmeme, graf bude nesouvislý pokud jednu hranu přidáme, graf bude obsahovat cyklus Názvosloví kořen, list, vnitřní uzel, rodič, (pravý/levý) potomek (syn), sourozenci, stupeň uzlu, hloubka (výška) Poziční strom potomci jsou označeni čísly (=levý/pravý) některý potomek může chybět 4 / 44

Binární strom poziční strom každý uzel má nanejvýš dva potomky. Úplný binární strom s n uzly každý uzel má právě dva potomky Počet uzlů v hloubce i je 2 i n = h i=0 2i = 2 h+1 1 Všechny listy mají hloubku h = log 2 (n + 1) 1 = log 2 n 1 Počet listů je (n + 1)/2, počet vnitřních uzlů je (n 1)/2. Pro každý binární strom s n uzly a hloubkou h log 2 n 1 h n 1 5 / 44

Příklady stromů Unixová struktura adresářů Images courtesy of Brad Miller, David Ranum. 6 / 44

Příklady stromů Gramatická struktura věty. Images courtesy of Brad Miller, David Ranum. 6 / 44

Příklady stromů Struktura aritmetického výrazu (7 + 3) (5 2) Images courtesy of Brad Miller, David Ranum. 6 / 44

Reprezentace stromu záznam class BinaryTree: def init (self, data,left=none,right=none): self.data = data self.left = left self.right = right 7 / 44

Reprezentace stromu záznam class BinaryTree: def init (self, data,left=none,right=none): self.data = data self.left = left self.right = right Reprezentace výrazu (7 + 3) (5 2): t=binarytree( *, BinaryTree( +,BinaryTree(7),BinaryTree(3)), BinaryTree( -,BinaryTree(5),BinaryTree(2))) 7 / 44

Reprezentace stromu záznam class BinaryTree: def init (self, data,left=none,right=none): self.data = data self.left = left self.right = right Reprezentace výrazu (7 + 3) (5 2): t=binarytree( *, BinaryTree( +,BinaryTree(7),BinaryTree(3)), BinaryTree( -,BinaryTree(5),BinaryTree(2))) V této reprezentaci strom=kořen. Prázdný strom = None. 7 / 44

Reprezentace stromu záznam class BinaryTree: def init (self, data,left=none,right=none): self.data = data self.left = left self.right = right Reprezentace výrazu (7 + 3) (5 2): t=binarytree( *, BinaryTree( +,BinaryTree(7),BinaryTree(3)), BinaryTree( -,BinaryTree(5),BinaryTree(2))) V této reprezentaci strom=kořen. Prázdný strom = None. Implicitní (default) parametry mohou a nemusí být zadány. Soubor binary_tree 7 / 44

Procházení stromu preorder nejdřív aktuální uzel, pak oba podstromy (prefixová notace) abdecfg inorder levý podstrom, pak aktuální uzel, pak pravý podstrom (infixová notace) dbeafcg postorder nejdřív oba podstromy, pak aktuální uzel (postfixová notace) debfgca a b c d e f g 8 / 44

Procházení stromu implementace def to_string_preorder(tree): return ( str(tree.data)+" "+ to_string_preorder(tree.left) + to_string_preorder(tree.right) if tree else "" ) 9 / 44

Procházení stromu implementace def to_string_preorder(tree): return ( str(tree.data)+" "+ to_string_preorder(tree.left) + to_string_preorder(tree.right) if tree else "" ) print(to_string_preorder(t)) * + 7 3-5 2 9 / 44

Procházení stromu implementace def to_string_preorder(tree): return ( str(tree.data)+" "+ to_string_preorder(tree.left) + to_string_preorder(tree.right) if tree else "" ) print(to_string_preorder(t)) * + 7 3-5 2 def to_string_postorder(tree): return ( to_string_postorder(tree.left) + to_string_postorder(tree.right) + " " + str(tree.data) if tree else "" ) 9 / 44

Procházení stromu implementace def to_string_preorder(tree): return ( str(tree.data)+" "+ to_string_preorder(tree.left) + to_string_preorder(tree.right) if tree else "" ) print(to_string_preorder(t)) * + 7 3-5 2 def to_string_postorder(tree): return ( to_string_postorder(tree.left) + to_string_postorder(tree.right) + " " + str(tree.data) if tree else "" ) print(to_string_postorder(t)) 7 3 + 5 2 - * 9 / 44

Procházení stromu implementace (2) def to_string_inorder(tree): if not tree: # prázdný strom return "" if tree.left: # binární operátor return ( "(" + to_string_inorder(tree.left) + str(tree.data) + to_string_inorder(tree.right) + ")" ) return str(tree.data) # jen jedno číslo 10 / 44

Procházení stromu implementace (2) def to_string_inorder(tree): if not tree: # prázdný strom return "" if tree.left: # binární operátor return ( "(" + to_string_inorder(tree.left) + str(tree.data) + to_string_inorder(tree.right) + ")" ) return str(tree.data) # jen jedno číslo print(to_string_inorder(t)) ((7+3)*(5-2)) 10 / 44

Vyhodnocení výrazu def evaluate(tree): """ Vyhodnotí aritmetický výraz zadaný stromem """ if tree.data== + : return evaluate(tree.left) + evaluate(tree.right) if tree.data== - : return evaluate(tree.left) - evaluate(tree.right) if tree.data== * : return evaluate(tree.left) * evaluate(tree.right) if tree.data== / : return evaluate(tree.left) / evaluate(tree.right) return tree.data # jen jedno číslo print(evaluate(t)) 30 Soubor binary tree 11 / 44

Stromy Binární vyhledávací stromy Množiny a mapy 12 / 44

Binární vyhledávací stromy motivace (Binary search trees) Aktualizovatelná struktura pro rychlé vyhledávání porovnatelných dat. Setříděné pole vkládání O(n), vyhledávání O(log n) Spojový seznam vkládání O(1), vyhledávání O(n) Vyhledávací strom vkládání O(log n), vyhledávání O(log n) 13 / 44

Množina Podporované operace add(key) vložení prvku delete(key) odstranění prvku contains(key) obsahuje množina daný prvek? Pomocné funkce: size / len Rychlé operace (složitost O(log n) nebo lepší) 14 / 44

Binární vyhledávací strom Vlastnosti každý uzel obsahuje klíč klíč v uzlu není menší, než všechny klíče v jeho levém podstromu klíč v uzlu není větší, než všechny klíče v jeho pravém podstromu 15 / 44

Reprezentace vyhledávacího stromu class BinarySearchTree: def init (self,key,left=none,right=none): self.key = key self.left = left self.right = right Strom = uzel. Prázdný strom reprezentujeme jako None. Soubor binary_search_tree.py 16 / 44

Vyhledávání ve stromu def contains(tree,key): """ Je prvek key ve stromu? """ if tree: # je strom neprázdný? if tree.key==key: # je to hledaný klíč? return True if tree.key>key: return contains(tree.left,key) else: return contains(tree.right,key) return False 17 / 44

Vytvoření ve stromu Hledání ve stromu je ekvivalentní binárnímu vyhledávání. Sestrojíme strom ze setříděného pole. def from_array(a): """ Build a tree (containing only keys) from an array """ def build(a): if len(a)==0: return None if len(a)==1: return BinarySearchTree(a[0]) m=len(a)//2 return BinarySearchTree(a[m],left=build(a[:m]), right=build(a[m+1:])) a=sorted(a) return build(a) 18 / 44

Vytisknutí stromu def print_tree(tree,level=0,prefix=""): if tree: print(" "*(4*level)+prefix+str(tree.key)) if tree.left: print_tree(tree.left,level=level+1,prefix="l:") if tree.right: print_tree(tree.right,level=level+1,prefix="r:") 19 / 44

Vyhledávácí strom příklad import binary_search_tree as bst t=bst.from_array([21, 16, 19, 87, 34, 92, 66]) bst.print_tree(t) 34 L:19 L:16 R:21 R:87 L:66 R:92 20 / 44

Vkládání do stromu def add(tree,key): """ Vloží key do stromu a vrátí nový kořen """ if tree is None: return BinarySearchTree(key) if key<tree.key: tree.left=add(tree.left,key) elif key>tree.key: tree.right=add(tree.right,key) return tree # hodnota již ve stromu je 21 / 44

Vkládání do stromu příklad print_tree(t) 34 L:19 L:16 R:21 R:87 L:66 R:92 t=add(t,41) t=add(t,16) print_tree(t) 34 L:19 L:16 R:21 R:87 L:66 L:41 R:92 22 / 44

Příklad: strom jako množina Vypiš všechny možné součty hodů na dvou kostkách. s=none for i in range(1000): s=add(s,random.randrange(1,7)+random.randrange(1,7)) print_tree(s) 7 L:4 R:9 L:3 R:6 L:2 L:5 L:8 R:11 L:10 R:12 23 / 44

Převod na pole Projde uzly stromu podle velikosti a uloží do pole. def to_array(tree): a=[] def insert_inorder(t): nonlocal a if t: insert_inorder(t.left) a+=[t.key] insert_inorder(t.right) insert_inorder(tree) return a print(to_array(s)) [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] nonlocal přístup k proměnné vnější funkce (jen Python 3) Soubor binary_search_tree.py 24 / 44

Odstranění prvku ze stromu 25 / 44

Odstranění prvku implementace def delete(tree, key): """ Smaže key za stromu tree a vrátí nový kořen. """ if tree is not None: if key < tree.key: # najdi uzel key tree.left = delete(tree.left, key) elif key > tree.key: tree.right = delete(tree.right, key) else: # uzel nalezen, má syny? if tree.left is None: return tree.right # jen pravý syn nebo nic elif tree.right is None: return tree.left # jen levý syn nebo nic else: # nahradíme uzel maximem levého podstromu w = rightmost_node(tree.left) tree.key = w.key tree.left = delete(tree.left, w.key) return tree 26 / 44

Odstranění prvku (2) def rightmost_node(tree): while tree.right: tree=tree.right return tree 27 / 44

Odstranění prvku příklad t=from_array([21, 16, 19, 87, 34, 92, 66]) print_tree(t) 34 L:19 L:16 R:21 R:87 L:66 R:92 t=delete(t,87) print_tree(t) 34 L:19 L:16 R:21 R:66 R:92 28 / 44

Množinový rozdíl (set difference) Find elements in array y but not in array x. def set_difference(x,y): t=none for i in y: t=add(t,i) for j in x: t=delete(t,j) return to_array(t) 29 / 44

Množinový rozdíl příklad x = [ 442, 59, 691, 84, 699, 603, 697, 669, 591, 795, 439, 198, 207, 785, 101, 372, 804, 728, 837, 605, 336, 667, 969, 860, 241, 728, 866, 82, 317, 154, 340, 992, 535, 331, 900, 177, 735, 256, 903, 195, 182, 190, 191, 647, 399, 707, 927, 817, 905, 477, 194, 205, 896, 930, 757, 388, 354, 987, 137, 403, 272, 576, 406, 589, 28, 38, 179, 486, 814, 310, 102, 794, 158, 173, 543, 499, 923, 353, 610, 927, 721, 125, 324, 23, 753, 527, 292, 622, 44, 475, 345, 158, 612, 331, 525, 225, 261, 943, 592, 21 ] y = [ 21, 622, 603, 866, 173, 256, 753, 439, 310, 477, 804, 345, 592, 194, 589, 817, 905, 794, 707, 336, 44, 179, 190, 23, 667, 728, 837, 101, 721, 82, 860, 207, 177, 28, 331, 647, 900, 525, 158, 75, 406, 354, 125, 930, 195, 154, 353, 691, 292, 987, 795, 158, 102, 969, 403, 591, 699, 182, 896, 324, 605, 198, 241, 923, 475, 84, 728, 340, 38, 543, 331, 137, 785, 943, 527, 903, 225, 486, 442, 399, 814, 927, 735, 612, 261, 388, 669, 317, 59, 927, 610, 499, 576, 697, 272, 205, 757, 535, 372, 992, 191 ] 30 / 44

Množinový rozdíl příklad x = [ 735, 909, 600, 717, 575, 349, 756, 762, 950, 8, 129, 368, 226, 248, 198, 875, 3, 566, 611, 115, 351, 136, 114, 394, 550, 910, 198, 479, 516, 371, 780, 290, 931, 81, 689, 700, 132, 133, 930, 298, 233, 383, 923, 425, 419, 455, 400, 641, 753, 78, 722, 44, 239, 957, 832, 253, 660, 232, 165, 730, 831, 422, 112, 9, 747, 992, 456, 580, 168, 879, 399, 544, 481, 797, 857, 839, 479, 998, 135, 193, 828, 630, 748, 897, 447, 363, 664, 847, 247, 943, 470, 157, 823, 788, 601, 140, 233, 343, 73, 456 ] y = [ 717, 580, 290, 233, 226, 363, 481, 8, 140, 132, 747, 823, 566, 931, 239, 660, 232, 115, 233, 923, 455, 689, 136, 371, 756, 419, 193, 198, 722, 422, 81, 368, 910, 394, 470, 550, 950, 73, 762, 343, 3, 135, 516, 383, 133, 897, 400, 748, 780, 797, 248, 909, 129, 998, 664, 857, 753, 700, 735, 992, 847, 456, 930, 575, 399, 839, 943, 544, 479, 730, 447, 198, 832, 253, 641, 875, 44, 157, 112, 479, 831, 828, 78, 425, 611, 456, 601, 247, 349, 788, 298, 21, 114, 168, 630, 165, 879, 957, 351, 600, 9 ] print(set_difference(x,y)) [21] Složitost O(n log n) místo O(n 2 ). 30 / 44

Složitost Vkládání, vyhledávání i mazání = 1-2 průchody stromem = O(h) Dokonale vyvážený strom = rozdíl počtu uzlů podstromů stejného rodiče se liší nejvýše o 1. 31 / 44

Složitost Vkládání, vyhledávání i mazání = 1-2 průchody stromem = O(h) Dokonale vyvážený strom = rozdíl počtu uzlů podstromů stejného rodiče se liší nejvýše o 1. hloubka h = O(log n) složitost vkládání, vyhledávání i mazání O(log n) 31 / 44

Složitost Vkládání, vyhledávání i mazání = 1-2 průchody stromem = O(h) Dokonale vyvážený strom = rozdíl počtu uzlů podstromů stejného rodiče se liší nejvýše o 1. hloubka h = O(log n) složitost vkládání, vyhledávání i mazání O(log n) Nejhorší případ Degenerovaný strom s hloubkou n 1 Složitost vkládání, vyhledávání i mazání O(n) 31 / 44

Vyvažování stromu Dokonalé vyvážení je obtížné, stačí hloubka h = O(log n) Náhodná data Omezení na tvar stromu AVL stromy (Adelson-Velsky a Landis) red-black trees (červeno-černé stromy) 2-3 stromy... Při přidávání/odebírání elementů strom vyvažujeme Vyvažování má složitost O(log n) 32 / 44

AVL stromy (Adelson-Velsky a Landis) Rozdíl hloubek podstromů stejného rodiče se liší nejvýše o 1. Pro AVL strom platí h < c log 2 (n + 2) + b kde c = log 1 2 φ 1.44, b 1.328 a φ = 1 2 ( 5 + 1) 1.618 (zlatý řez) Pro každý binární strom h > log 2 (n + 1) 1 33 / 44

AVL stromy (Adelson-Velsky a Landis) Rozdíl hloubek podstromů stejného rodiče se liší nejvýše o 1. Pro AVL strom platí h < c log 2 (n + 2) + b kde c = log 1 2 φ 1.44, b 1.328 a φ = 1 2 ( 5 + 1) 1.618 (zlatý řez) Pro každý binární strom h > log 2 (n + 1) 1 V každém uzlu si pamatujeme h(l) h(r) { 1, 0, 1} 33 / 44

Maximálně nevyvážené AVL stromy 34 / 44

Rotace Nevyváženost odstraníme rotací 35 / 44

Rotace Nevyváženost odstraníme rotací 35 / 44

Rotace Nevyváženost odstraníme rotací 35 / 44

Rotace Problém 35 / 44

Rotace Dvojitá rotace Implementace např. Problem Solving with Algorithms and Data Structures https://interactivepython.org/runestone/static/pythonds/trees/avltreeimplementation.html 35 / 44

Stromy Binární vyhledávací stromy Množiny a mapy 36 / 44

Množina Podporované operace add(key) vložení prvku delete(key) odstranění prvku contains(key) obsahuje množina daný prvek? Pomocné funkce: size / len Rychlé operace (složitost O(log n) nebo lepší) 37 / 44

Asociativní mapa Associative map Funkce klíč hodnota Podporované operace (key value) put(key,value) vložení položky delete(key) odstranění prvku contains(key) obsahuje mapa daný prvek? get(key) value nalezení/vyzvednutí hodnoty Pomocné funkce: size / len Rychlé operace (složitost O(log n) nebo lepší) 38 / 44

Asociativní mapa Associative map Funkce klíč hodnota Podporované operace (key value) put(key,value) vložení položky delete(key) odstranění prvku contains(key) obsahuje mapa daný prvek? get(key) value nalezení/vyzvednutí hodnoty Pomocné funkce: size / len Rychlé operace (složitost O(log n) nebo lepší) Množina je speciální případ mapy. 38 / 44

Reprezentace class BinarySearchTree: def init (self, key,value=none,left=none,right=none): self.key = key self.value = value self.left = left self.right = right Soubor binary_search_tree.py 39 / 44

Vyhledávání v mapě def get(tree,key): """ Vrátí value prvku s klíčem key, jinak None """ if tree: # je strom neprázdný? if tree.key==key: # je to hledaný klíč? return tree.value if tree.key>key: return get(tree.left,key) else: return get(tree.right,key) return None 40 / 44

Vkládání do mapy def put(tree,key,value): """ Vloží pár key -> value, vrátí nový kořen """ if tree is None: return BinarySearchTree(key,value=value) if key<tree.key: tree.left=put(tree.left,key,value) elif key>tree.key: tree.right=put(tree.right,key,value) else: tree.value=value # klíč již ve stromu je return tree 41 / 44

Mapa příklad tabulka symbolů t=none t=put(t, pi, 3.14159) t=put(t, e, 2.71828) t=put(t, sqrt2, 1.41421) t=put(t, golden,1.61803) print_tree(t) pi -> 3.14159 L:e -> 2.71828 R:golden -> 1.61803 R:sqrt2 -> 1.41421 print(get(t, pi )) 3.14159 print(get(t, e )) 2.71828 print(get(t, gamma )) None Implementace funguje i pro řetězcové klíče. 42 / 44

Vyhledávací stromy Datová struktura pro porovnatelné klíče Může reprezentovat množinu i mapu. Základní operace (vkládání, hledání, mazání) mají složitost O(log n). Vyšší režie (oproti např. poli) Stromů je mnoho typů B-stromy k-d stromy, R-stromy prefixové stromy ropes... 43 / 44

Náměty na domácí práci Reprezentujte strom pomocí dvou tříd, aby nebylo potřeba vracet nový kořen. Doplňte detekci chyb. Zefektivněte implementaci, aby nedocházelo k neustálému přepisování odkazů. Zrychlete operaci delete pro případ mazání uzlu se dvěma syny. Implementujte Eratosthenovo síto pomocí množin. Implementujte AVL strom. Ověřte experimentálně časovou složitost operací se stromem. Přepište algoritmy bez použití rekurze. Najděte množinový rozdíl dvou polí pomocí třídění. 44 / 44