Jednoduché datové struktury a stromy

Podobné dokumenty
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í

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

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

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

Algoritmy a datové struktury

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

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

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

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

vyhledávací stromové struktury

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

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

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

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

Šablony, kontejnery a iterátory

ADT STROM Lukáš Foldýna

Datové struktury 2: Rozptylovací tabulky

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

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

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

Stromy. Jan Kybic.

1 Nejkratší cesta grafem

TÉMATICKÝ OKRUH TZD, DIS a TIS

Stromy, haldy, prioritní fronty

Standardní algoritmy vyhledávací.

Stromové struktury v relační databázi

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

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

Šablony, kontejnery a iterátory

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

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

IB111 Úvod do programování skrze Python

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

Stromové struktury v relační databázi

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

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

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í

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

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

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

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

Funkční objekty v C++.

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

SQL tříhodnotová logika

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

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

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

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

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

Dynamické datové struktury IV.

Algoritmy I, složitost

Základy algoritmizace. Hašování

ADT/ADS = abstraktní datové typy / struktury

Prioritní fronta, halda

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.

a) b) c) Radek Mařík

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

Dynamické datové struktury II.

Dynamické datové struktury I.

Časová a prostorová složitost algoritmů

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

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

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

Dynamické datové struktury III.

Abstraktní datové typy

Semestrální práce 2 znakový strom

George J. Klir Vilem Vychodil (Palacky University, Olomouc) State University of New York (SUNY) Binghamton, New York 13902, USA

Časová složitost algoritmů

TÉMATICKÝ OKRUH Počítače, sítě a operační systémy

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

Algoritmizace prostorových úloh

ABSTRAKTNÍ DATOVÉ TYPY

Kapitola 11: Indexování a hešování. Základní představa

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

Algoritmy výpočetní geometrie

Základní datové struktury

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

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

Grafové algoritmy. Programovací techniky

Množina v C++ (set, multiset).

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.

Algoritmizace prostorových úloh

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

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

TGH07 - Chytré stromové datové struktury

PRAKTICKÁ EFEKTIVITA KONTEJNERŮ

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

PROGRAMOVÁNÍ V C++ CVIČENÍ

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

Dynamické datové typy a struktury

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Grafové algoritmy. Programovací techniky

Algoritmizace prostorových úloh

Výčtový typ strana 67

map, multimap - Asociativní pole v C++.

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

Radek Mařík

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

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

Transkript:

155OB poznámky 2015-10-25 Jednoduché datové struktury a stromy 2015-10-25 1 / 69

Obsah 1 Jednoduché datové struktury a stromy Jednoduché datové struktury Binární stromy AVL stromy Quadtrees a Octrees B-stromy R-stromy Jednoduché datové struktury a stromy 2015-10-25 2 / 69

O notace Asymptotická složitost (konstantní, lineární, kvadratická, logaritmická,... ) pokud existuje x 0 takové, že f (x) = O(g(x)) pro x f (x) M g(x) pro x > x 0 říklady O(1) indexování prvku v poli O(log 2 N) vyhledání prvku v seřazeném poli metodou půlení intervalu O(N) vyhledání prvku v neseřazeném poli lineárním (sekvenčním) vyhledáváním O(N log N) seřazení pole reálných čísel podle velikosti (např. algoritmem Mergesort) O(N 2 ) diskrétní Fourierova transformace (DFT) O(2 N ) přesné řešení problému obchodního cestujícího (či jiného N-úplného problému hrubou silou) Jednoduché datové struktury a stromy 2015-10-25 3 / 69

Třída Object Jednoduché datové struktury a stromy omocná třída Object používaná v následujících ukázkách class Object { public : Object ( ) { t o t a l ++; i n i t ( ) ; } e x p l i c i t Object ( unsigned i n t k ) : key_ ( k ) { t o t a l ++; } Object ( const Object& obj ) { copy ++; key_ = obj. key_ ; } unsigned i n t key ( ) const { return key_ ; } bool operator < ( const Object& obj ) const { l t ++; return key_ < obj. key_ ; } bool operator == ( const Object& obj ) const { eq++; return key_ == obj. key_ ; } bool operator > ( const Object& obj ) const { gt ++; return key_ > obj. key_ ; } bool operator <= ( const Object& obj ) const { le ++; return key_ <= obj. key_ ; } bool operator >= ( const Object& obj ) const { ge++; return key_ >= obj. key_ ; } s t a t i c void sequential_keys ( ) { rand_key = 0; } private : void i n i t ( ) ; unsigned i n t key_ ;... atd... Jednoduché datové struktury a stromy 2015-10-25 4 / 69

Třída Object - pokračování Náhodně generované klíče třídy Object void Object : : i n i t ( ) { i f (! rand_key ) { key_ = ++max_key ; return ; } ; static std : : set <unsigned int > used_keys ; i f ( max_key <= 0) max_key = 17; for ( ; ; ) { const unsigned i n t k = 1 + i n t ( max_key ( rand ( ) / ( RAND_MAX + 1. 0 ) ) ) ; i f ( used_keys. f i n d ( k ) == used_keys. end ( ) ) { used_keys. i n s e r t ( k ) ; i f ( k > max_key ) max_key = k ; key_ = k ; return ; } } } max_key += 100; Jednoduché datové struktury a stromy 2015-10-25 5 / 69

demo-1 Jednoduché datové struktury a stromy Vytvoření statického pole o sto prvcích typu Object #include <iostream > #include <algorithm > #include <vector > #include " o b j e k t. h " i n t main ( ) { std : : cout << " Object demo 1\ n " ; } const i n t M = 100; Object p [M] ; Výstup Object demo 1 o b j e c t s 100 copy c t o r 0 operator < 0 operator == 0 operator > 0 operator <= 0 operator >= 0 Jednoduché datové struktury a stromy 2015-10-25 6 / 69

demo-2 Jednoduché datové struktury a stromy Vytvoření statického pole o sto prvcích typu Object a setřídění #include <iostream > #include <algorithm > #include " o b j e k t. h " i n t main ( ) { std : : cout << " Object demo 2\ n " ; } const i n t M = 100; Object p [M] ; std : : s o r t ( p, p+m) ; Výstup Object demo 2 o b j e c t s 100 copy c t o r 188 operator < 782 operator == 0 operator > 0 operator <= 0 operator >= 0 Jednoduché datové struktury a stromy 2015-10-25 7 / 69

Obsah Jednoduché datové struktury a stromy Jednoduché datové struktury 1 Jednoduché datové struktury a stromy Jednoduché datové struktury Binární stromy AVL stromy Quadtrees a Octrees B-stromy R-stromy Jednoduché datové struktury a stromy 2015-10-25 8 / 69

Hashovací tabulka Jednoduché datové struktury a stromy Jednoduché datové struktury Keys Hash Table Objects 0 John Smith Lisa Smith Sam Doe David Göthberg 1. 872 873. 998 999. Lisa Smith +1-555-8976 John Smith +1-555-1234 Sam Doe +1-555-5030 Jednoduché datové struktury a stromy 2015-10-25 9 / 69

Jednoduché datové struktury demo-hash-1 - hašovací funkce Uložní milionu zaznamů a jejich vyhledání Hash demo ========= V hashovaci tabulce ulozeno 1000000 objektu V e l i k o s t hashovaci t a b u l k y 1400017 ( load f a c t o r 1. 4 ) ocet pokusu je 1989046, t j. v prumeru 2.0 na jednu operaci hledani Maximalni pocet pokusu pro jedno hledani 98 Na prvni pokus nalezeno 692225 objektu t j. 69.2% řehešování při zaplnění tabulky (demo-hash-2) Hash demo ========= rehash 300007 ==> 600043 rehash 600043 ==> 1200109 rehash 1200109 ==> 2400221 V hashovaci tabulce ulozeno 1000000 objektu V e l i k o s t hashovaci t a b u l k y 2400221 ( load f a c t o r 2. 4 ) ocet pokusu je 1231753, t j. v prumeru 1.2 na jednu operaci hledani Maximalni pocet pokusu pro jedno hledani 23 Na prvni pokus nalezeno 858228 objektu t j. 85.8% Jednoduché datové struktury a stromy 2015-10-25 10 / 69

Jednoduché datové struktury earsonova hašovací funkce pro řetězce Funkce mapuje daný řetězec s délky N na osm znaků h j (unsigned char) h = T [ ( s [ 0 ] + j ) % 2 5 6 ] ; f o r ( unsigned i =1; i <N; i ++) h = T [ h ^ s [ i ] ] ; / / XOR kde T je náhodná tabulka hodnot 0 až 255. Funkce je velmi citlivá na změny vstupního řetězce. Takto vygerovaných 8 bajtů definuje 16 hexadecimálních číslic, resp. 64-bitové celé číslo bez znaménka. říklad (demo-pearson): little-endian big-endian A --> FB43FAA1006B61F1 f1616b00a1fa43fb 17393300886343271419 Aaaaaa --> 55C85C57BDB3C85 853cdbbe575cc855 9600790116203022421 Aaaaab --> 066995F0B11A8190 90811ab1f0956906 10412633165005154566 šnek --> 21F6FD0F1BF36983 8369f31b0ffdf621 9469366989081146913 Jednoduché datové struktury a stromy 2015-10-25 11 / 69

Spojové seznamy Jednoduché datové struktury a stromy Jednoduché datové struktury Jednoduchý spojový seznam 0 Cyklický spojový seznam Obousměrný spojový seznam 0 0 Jednoduché datové struktury a stromy 2015-10-25 12 / 69

říklad - spojový seznam (1/5) Jednoduché datové struktury rázdný spojový seznam s nulovým ukazatelem na prázdný seznam uzlů. 0 Jednoduché datové struktury a stromy 2015-10-25 13 / 69

říklad - spojový seznam (2/5) Jednoduché datové struktury rázdný spojový seznam s nulovým ukazatelem na prázdný seznam uzlů. 0 Vytvoříme nový uzel a zařadíme jej do seznamu. 0 Jednoduché datové struktury a stromy 2015-10-25 14 / 69

říklad - spojový seznam (3/5) Jednoduché datové struktury rázdný spojový seznam s nulovým ukazatelem na prázdný seznam uzlů. 0 Vytvoříme nový uzel a zařadíme jej do seznamu. 0 Na začátek seznamu přidáme další uzel. 0 Jednoduché datové struktury a stromy 2015-10-25 15 / 69

říklad - spojový seznam (4/5) Jednoduché datové struktury rázdný spojový seznam s nulovým ukazatelem na prázdný seznam uzlů. 0 Vytvoříme nový uzel a zařadíme jej do seznamu. 0 Na začátek seznamu přidáme další uzel. 0 okračujeme přidáním třetího uzlu. 0 Jednoduché datové struktury a stromy 2015-10-25 16 / 69

Jednoduché datové struktury říklad - spojový seznam (5/5) rázdný spojový seznam s nulovým ukazatelem na prázdný seznam uzlů. 0 Vytvoříme nový uzel a zařadíme jej do seznamu. 0 Na začátek seznamu přidáme další uzel. 0 okračujeme přidáním třetího uzlu. 0 ro přidáním uzlu do spojového seznamu stačí nastavit dva ukazatele. 0 Jednoduché datové struktury a stromy 2015-10-25 17 / 69

demo-spojsez Jednoduché datové struktury a stromy Jednoduché datové struktury Vyhledání N=1000 záznamů v jednoduchém spojovém seznamu Jednoduchy spojovy seznam o b j e c t s 1000 copy c t o r 0 operator < 0 operator == 500500 operator > 0 operator <= 0 operator >= 0 N (N + 1)/2 = 500500 Jednoduché datové struktury a stromy 2015-10-25 18 / 69

Jednoduché datové struktury Kořenový strom a reprezentace spojovým seznamem A A 0 B C D B C D 0 0 F G 0 F 0 0 G 0 0 Kořenový strom na obrázku vlevo a jeho implementace spojovými seznamy, kde každý uzel obsahuje ukazatel na seznam potomků a ukazatel na seznam sourozenců, tj. uzlů se společným rodičem. Jednoduché datové struktury a stromy 2015-10-25 19 / 69

Obsah Jednoduché datové struktury a stromy Binární stromy 1 Jednoduché datové struktury a stromy Jednoduché datové struktury Binární stromy AVL stromy Quadtrees a Octrees B-stromy R-stromy Jednoduché datové struktury a stromy 2015-10-25 20 / 69

Binární stromy Jednoduché datové struktury a stromy Binární stromy Binární vyhledávací strom je datová struktura pro kterou platí každý uzel má maximálně dva potomky, kterým obvykle říkáme levý resp. pravý potomek levý potomek má klíč menší než je klíč jeho rodiče, pravý potomek má klíč větší (platí pro všechny klíče levého, resp. pravého, podstromu) výška stromu je délka nejdelší cesty od kořene k listu ve vyváženém stromu se hloubka všech listů liší maximálně o 1 (délka nejkratší a nejdelší cesty od kořene se liší maximálně o 1) Dokonale vyvážený binární strom výšky 5 (počet uzlů je 2 6 1). Jednoduché datové struktury a stromy 2015-10-25 21 / 69

Binární stromy Jednoduché datové struktury a stromy Binární stromy ro vložení nového vrcholu je binární strom prohledáván od kořene a pokud není daný vrchol nalezen, je nový vrchol vložen na místo kde prázdný ukazatel ukončuje prohledávání. Zrušení listu nebo vrcholu s jedním potomkem je triviální, stačí upravit příslušné ukazatele. Zrušení vrcholu se dvěma potomky v binárním stromu prevedeme tak, že rušený vrchol nahradíme vrcholem s nejmenším ohodnocením z pravého podstromu (nebo vrcholem s maximálním ohodnocením v levém podstromu). Jednoduché datové struktury a stromy 2015-10-25 22 / 69

Binární stromy rázdný binární strom - vložen vrchol 9 do kořene 9 y x Jednoduché datové struktury a stromy 2015-10-25 23 / 69

Binární stromy Binární strom - vložení vrcholu 5 9 y 5 x Jednoduché datové struktury a stromy 2015-10-25 24 / 69

Binární stromy Binární strom - vložení vrcholu 10 9 y 5 10 x Jednoduché datové struktury a stromy 2015-10-25 25 / 69

Binární stromy Binární strom - vložení vrcholu 11 9 y 5 10 11 x Jednoduché datové struktury a stromy 2015-10-25 26 / 69

Binární stromy Binární strom - vložení vrcholu 7 9 y 5 10 7 11 x Jednoduché datové struktury a stromy 2015-10-25 27 / 69

Binární stromy Binární strom - vložení vrcholu 2 9 y 5 10 2 7 11 x Jednoduché datové struktury a stromy 2015-10-25 28 / 69

Binární stromy Binární strom - vložení vrcholu 8 9 y 5 10 2 7 11 x 8 Jednoduché datové struktury a stromy 2015-10-25 29 / 69

Binární stromy Binární strom - vložení vrcholu 6 9 y 5 10 2 7 11 x 6 8 Jednoduché datové struktury a stromy 2015-10-25 30 / 69

Binární stromy Binární strom - vložení vrcholu 1 9 y 5 10 2 7 11 x 1 6 8 Jednoduché datové struktury a stromy 2015-10-25 31 / 69

Binární stromy Binární strom - vložení vrcholu 3 9 y 5 10 2 7 11 x 1 3 6 8 Jednoduché datové struktury a stromy 2015-10-25 32 / 69

Binární stromy Binární strom - zrušení vrcholu 5 9 y 5 10 2 7 11 x 1 3 6 8 Jednoduché datové struktury a stromy 2015-10-25 33 / 69

Binární stromy Binární strom - po zrušení vrcholu 5 9 y 6 10 2 7 11 x 1 3 8 Jednoduché datové struktury a stromy 2015-10-25 34 / 69

Binární stromy Binární strom - zrušení vrcholu 6 9 y 6 10 2 7 11 x 1 3 8 Jednoduché datové struktury a stromy 2015-10-25 35 / 69

Binární stromy Binární strom - po zrušení vrcholu 6 9 y 7 10 2 8 11 x 1 3 Jednoduché datové struktury a stromy 2015-10-25 36 / 69

Binární stromy Binární strom - zrušení vrcholu 11 9 y 7 10 2 8 11 x 1 3 Jednoduché datové struktury a stromy 2015-10-25 37 / 69

Binární stromy Binární strom - po zrušení vrcholu 11 9 y 7 10 2 8 x 1 3 Jednoduché datové struktury a stromy 2015-10-25 38 / 69

Binární stromy říklad - vytvoření a prohledání binárního stromu Vytvoření stromu je stejné pro náhodné i setříděné klíče B i n a r n i strom / demo b i n t r e e o b j e c t s 1000 copy c t o r 0 operator < 499500 operator == 499500 operator > 0 operator <= 0 operator >= 0 Vytvoření a prohledání stromu pro náhodné a setříděné klíče (zdegeneruje v sekvenční prohledávání) Binarni strom / nahodne k l i c e Binarni strom / setridene k l i c e o b j e c t s 1000 o b j e c t s 1000 copy c t o r 0 copy c t o r 0 operator < 508254 operator < 999000 operator == 508274 operator == 1001000 operator > 0 operator > 0 operator <= 0 operator <= 0 operator >= 0 operator >= 0 Jednoduché datové struktury a stromy 2015-10-25 39 / 69

Obsah Jednoduché datové struktury a stromy AVL stromy 1 Jednoduché datové struktury a stromy Jednoduché datové struktury Binární stromy AVL stromy Quadtrees a Octrees B-stromy R-stromy Jednoduché datové struktury a stromy 2015-10-25 40 / 69

AVL stromy Jednoduché datové struktury a stromy AVL stromy G.M. Adelson-Velsky a.m. Landis 1962. AVL strom je binární samovyvažovací vyhledávací strom, který pracuje v logaritmickém čase. Jde o první datovou strukturu s takovýmito vlastnostmi. V AVL stromu se pro každý uzel liší výška podstromů jeho potomků maximálne o 1; jde tedy o strom výškově vyrovnaný. V článku An algorithm for the organization of information (roceedings of the USSR Academy of Sciences 146: 263-266) dokázali, že AVL-strom bude maximálně o 45 % vyšší než dokonale vyvážený strom složený ze stejných vrcholů Jednoduché datové struktury a stromy 2015-10-25 41 / 69

AVL stromy AVL stromy Vlastnosti vrcholů AVL stromu Vrchol má maximálně dva následníky (je to binární strom). V levém podstromu vrcholu jsou pouze vrcholy s menší hodnotou klíče (je to binární vyhledávací strom). V pravém podstromu vrcholu jsou pouze vrcholy s větší hodnotou klíče (je to vyhledávací strom). Délka nejdelší větve levého a pravého podstromu se liší nejvýše o 1 (vyvážení AVL stromu). Jednoduché datové struktury a stromy 2015-10-25 42 / 69

Vyvažování AVL stromu AVL stromy x -2 y 0 y -1 x 0 T3 T2 T1 T2 T3 T1 Jednoduché datové struktury a stromy 2015-10-25 43 / 69

Vyvažování AVL stromu AVL stromy x 2 z 0 y -1 x -1 y 0 z 1 T1 T2 T2 T4 T1 T3 T4 T3 Jednoduché datové struktury a stromy 2015-10-25 44 / 69

Obsah Jednoduché datové struktury a stromy Quadtrees a Octrees 1 Jednoduché datové struktury a stromy Jednoduché datové struktury Binární stromy AVL stromy Quadtrees a Octrees B-stromy R-stromy Jednoduché datové struktury a stromy 2015-10-25 45 / 69

Quadtrees Jednoduché datové struktury a stromy Quadtrees a Octrees Quadtree je datová struktura, která je odvozena postupným dělením 2D prostoru na kvadranty, které můžeme číslovat například takto: 3 2 0 1 Každý kvadrant může být prázdný (), zaplněný (F) nebo částečně zaplněný (). Částečně zaplněné kvadranty se dále rekurzivně dělí podle potřeby. Quadtrees se používají jednak pro kódování rastrů ale i pro prostorové indexování. Octrees podobně dělí 3D prostor na octanty. Jednoduché datové struktury a stromy 2015-10-25 46 / 69

Dášeňka čili život štěněte Quadtrees a Octrees Jednoduché datové struktury a stromy 2015-10-25 47 / 69

Quadtrees a Octrees Quadtrees čtyři základní kvadranty Jednoduché datové struktury a stromy 2015-10-25 48 / 69

Quadtrees a Octrees Quadtrees částečně zaplněné kvadranty Jednoduché datové struktury a stromy 2015-10-25 49 / 69

Quadtrees a Octrees Quadtrees druhá úroveň rozkladu Jednoduché datové struktury a stromy 2015-10-25 50 / 69

Quadtrees a Octrees Quadtrees třetí úroveň rozkladu Jednoduché datové struktury a stromy 2015-10-25 51 / 69

Quadtrees a Octrees Quadtrees čtvrtá úroveň rozkladu... Jednoduché datové struktury a stromy 2015-10-25 52 / 69

Quadtrees a Octrees Linear quadtree notation ro adresování je potřeba tolik číslic 0 až 3, kolik je úrovní, symbol X vyplňuje adresy nelistových uzlů. 0112 0113 012X 013X 020X 021X 0222 0230 0321 0322 0323 1002 1003 102X 1030 1031 1032 1001 1301 1302 1310 1311 1330 1331 1333 3010 3012 3013 310X 3110 3111 3113 Jednoduché datové struktury a stromy 2015-10-25 53 / 69

Quadtrees a Octrees Quadtrees a boolovské množinové operace A B A B A B Jednoduché datové struktury a stromy 2015-10-25 54 / 69

Obsah Jednoduché datové struktury a stromy B-stromy 1 Jednoduché datové struktury a stromy Jednoduché datové struktury Binární stromy AVL stromy Quadtrees a Octrees B-stromy R-stromy Jednoduché datové struktury a stromy 2015-10-25 55 / 69

B-stromy B-stromy R. Bayer a. McCreight 1970 B-stromy jsou zobecněním binárních stromů v tom ohledu, že (interní) uzly mohou mít více potomků z jistého, obvykle fixního, intervalu. Definice podle Knutha B-strom (B-tree) řádu m je strom, který splňuje následující požadavky Každý uzel má maximálně m potomků Každý uzel s výjimkou kořene a listů má minimálně m/2 potomků Kořen má minimálně dva potomky (pokud není listem) Všechny listy jsou na stejné úrovni a nesou informace Nelistový uzel s k potomky obsahuje k 1 klíčů oznámka: Řád m B-stromu je někdy definován jako minimální počet klíču v uzlu, maximální počet klíčů v uzlu je pak 2 m a maximální počet potomků 2 m + 1. Jednoduché datové struktury a stromy 2015-10-25 56 / 69

B-stromy B-stromy vyvážené vyhledávací stromy hlavní motivací je snaha minimalizovat počet přístupů na disky velikost uzlů B-stromu se navrhuje navrhuje tak, aby odpovídala čtení jedné stránky z disku Na následujícím obrázku jsou klíče uložené v uzlech B-stromu znázorněny žlutě, pro každý uložený klíč (v nelistovém uzlu) jsou definovány dva ukazatele na dceřiné uzel s menšími, resp. většími, klíči. S výjimkou kořene nesmí počet klíču uložených v uzlu klesnout pod dolní mez daného intervalu (typicky jsou uzly zaplněny alespoň z poloviny). Jednoduché datové struktury a stromy 2015-10-25 57 / 69

B-stromy Vkládání klíčů do 2-3 B-stromu 2-3 B-strom má interní uzly s minimálně dvěma a maximálně třemi potomky Klíče se přidávají výhradně do listů B-stromu, při přeplnění dochází ke štěpení uzlů, štěpení může pokračovat rekurzivně až ke kořenu. 1 2 4 1 2 1 3 5 2 2 4 1 3 1 3 5 6 7 2 4 1 3 4 2 6 1 3 5 7 Jednoduché datové struktury a stromy 2015-10-25 58 / 69

B-stromy Demo btree 1 - naplnění 2-3 stromu klíčí 1... 7 4 2 6 1 3 5 7 depth nodes pointer node 0 : 4 0x8e64008 1.. 0 0 0 0 0x8e64040 3.. 0 0 0 0 1 : 2 0x8e640a8 2.. 0x8e64008 0x8e64040 0 0 0x8e640e8 5.. 0 0 0 0 0x8e64130 7.. 0 0 0 0 2 : 1 0x8e64180 6.. 0x8e640e8 0x8e64130 0 0 0x8e641a8 4.. 0x8e640a8 0x8e64180 0 0 2 : 3 1 : 6 2 : 5 2 : 7 Jednoduché datové struktury a stromy 2015-10-25 59 / 69

B-stromy Schéma transformace adres při rozdělení uzlu Výška B-stromu se mění pouze při rozštěpení kořene. Rekurzivní štěpění uzlů vyžaduje pro implementaci vkládání použití zásobníku, alternativně mohou uzly udržovat ukazatele na rodičovské uzly. 1 A B C D 2 L X R 3 4 A B C D 0 1 2 L 3 4 1 A B X C D 2 L R 3 4 A B X C D 0 1 2 L R 3 4 Jednoduché datové struktury a stromy 2015-10-25 60 / 69

B-stromy Jednoduché datové struktury a stromy B-stromy 7 14 22 1 3 31 33 34 36 38 45 48 49 56 72 73 75 101 108 112 122 140 143 154 156 157 165 166 173 184 189 196 204 205 206 213 214 217 218 221 226 240 27 39 53 119 151 159 200 207 220 85 176 klíče v uzlu jsou setříděny, pro jejich hledání lze použít metodu půlení, nemá smysl pro B-stromy malých řádů Jednoduché datové struktury a stromy 2015-10-25 61 / 69

B-stromy Rušení klíčů v B-stromu ro rušení klíče v B-stromech se používají dvě hlavní strategie rušení klíče probíhá v jediném průchodu stromem od kořene, ale před každým vstupem do uzlu je strom upraven tak, aby zrušení uklíče nespustilo rekurzivní úpravy. po zrušení klíče je strom restrukturalizován tak, aby splňoval definiční vlastnosti B-stromu, minimální a maximální počet klíčů v uzlu ři rušení klíče je třeba ošetřit dvě situace daný klíč je separátorem ukazatelů na dceřiné uzly po zrušení klíče v listu poklesne počet klíčů pod dolní přípustnou hodnotu okud je v listů více než minimální počet klíčů, pak je operace zrušení klíče triviální. oznámka: V databázovém systému ostgresql jsou zrušené řádky pouze označeny jako zrušené a ponechány v databázi. Správce databáze proto musí spouštět program vacuum, aby fyzicky uvolnil prostor po zrušených řádcích. Jednoduché datové struktury a stromy 2015-10-25 62 / 69

Rušení klíčů v B-stromu B-stromy B-strom řádu 5 (s minimální počtem klíčů v uzlu 2 a maximálním 4) s vyznačeným klíčem K určeným ke zrušením. C H M T W A B D F G J K L N O Q R S U V X Y Zrušení klíče v uzlu při kterém počet klíčů neklesne pod povolenou mez je triviální. C H M T W A B D F G J L N O Q R S U V X Y Jednoduché datové struktury a stromy 2015-10-25 63 / 69

B-stromy Rušení klíčů v B-stromu o zrušení klíče U klesne počet klíčů daného uzlu pod hodnotu 2. C H M T W A B D F G J L N O Q R S U V X Y Q R S T V C H M S W A B D F G J L N O Q R T V X Y Jednoduché datové struktury a stromy 2015-10-25 64 / 69

B-stromy Rušení klíčů v B-stromu říklad zrušení klíče H v nelistovém uzlu C H M S W A B D F G J L N O Q R T V X Y V daném případě můžeme zrušený uzel nahradit maximálním klíčem z levého podstromu nebo minimálním klíčem z pravého podstromu. C G M S W A B D F J L N O Q R T V X Y Jednoduché datové struktury a stromy 2015-10-25 65 / 69

Obsah Jednoduché datové struktury a stromy R-stromy 1 Jednoduché datové struktury a stromy Jednoduché datové struktury Binární stromy AVL stromy Quadtrees a Octrees B-stromy R-stromy Jednoduché datové struktury a stromy 2015-10-25 66 / 69

R-stromy Jednoduché datové struktury a stromy R-stromy Antonin Guttman 1984, ACM Digital Library příklad Wikipedie Jednoduché datové struktury a stromy 2015-10-25 67 / 69

Boost C++ libraries Jednoduché datové struktury a stromy R-stromy Instalace apt get i n s t a l l l i b b o o s t a l l dev nebo podrobněji kapitola Getting started. http://www.boost.org/ Sestavení a překlad (demo.cpp) # include <iostream > # i n c l u d e <boost / array. hpp> using namespace std ; i n t main ( ) { boost : : array < i n t, 4> a r r = { { 1, 2, 3, 4 } } ; / / prevzato do standardu c++11 f o r ( auto a : a r r ) cout << a << " " ; r e t u r n 0; } c++ I path / to / boost_1_59_0 std=c++11 o demo demo. cpp kde cestu k hlavičkovým souborům (parametr -I) musíme zadávat pouze v případě, že se nenacházejí na cestě definované v systému. Jednoduché datové struktury a stromy 2015-10-25 68 / 69

Boost Geometry Jednoduché datové struktury a stromy R-stromy http://www.boost.org/libs/geometry/doc/html/index.html Jednoduché datové struktury a stromy 2015-10-25 69 / 69