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

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í

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

TÉMATICKÝ OKRUH TZD, DIS a TIS

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

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

Dynamické datové struktury IV.

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

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

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

Stromy, haldy, prioritní fronty

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ávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Algoritmy a datové struktury

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

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.

Dynamické datové struktury III.

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

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

TGH07 - Chytré stromové datové struktury

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

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

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

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

ADT STROM Lukáš Foldýna

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

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

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

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

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

Binární vyhledávací stromy II

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

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

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

Datové struktury Úvod

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

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

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

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

Rekurzivní algoritmy

Prioritní fronta, halda

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

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

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

Dynamické datové struktury II.

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

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

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

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

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

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

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

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

Základy algoritmizace. Pattern matching

Algoritmy I, složitost

Semestrální práce 2 znakový strom

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

Definice. B-stromu. B-strom řádu m je strom, kde každý uzel má maximálně m následníků a ve kterém platí:

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

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

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

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

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

IB111 Úvod do programování skrze Python

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

Základní datové struktury

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

SQL tříhodnotová logika

Základy algoritmizace a programování

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

Algoritmy výpočetní geometrie

Stromy. Jan Kybic.

R zné algoritmy mají r znou složitost

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

Binární vyhledávací stromy

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

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

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

Metodický koncept k efektivní podpoře klíčových odborných kompetencí s využitím cizího jazyka ATCZ62 - CLIL jako výuková strategie na vysoké škole

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Dynamické datové struktury I.

Jazyk C++ II. STL knihovna kontejnery část 2

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

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

a) b) c) Radek Mařík

Radek Mařík

Datové struktury 2: Rozptylovací tabulky

Lineární spojový seznam (úvod do dynamických datových struktur)

Grafové algoritmy. Programovací techniky

Algoritmy na ohodnoceném grafu

Grafové algoritmy. Programovací techniky

Funkce, podmíněný příkaz if-else, příkaz cyklu for

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

Úvod do programovacích jazyků (Java)

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

Dijkstrův algoritmus

Stromové struktury v relační databázi

PŘETĚŽOVÁNÍ OPERÁTORŮ

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Transkript:

Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Red Black strom je binární strom s jedním dvouhodnotovým příznakem v uzlu navíc. Tento příznak představuje barvu uzlu, která může být červená nebo černá. Red Black strom zajišt uje, že žádná cesta z kořene do libovolného listu stromu nebude dvakrát delší než kterákoli jiná, to znamená, že strom je přibližně vyvážený. Každý uzel se skládá z položek: key, color, left child, right child a parent. Jestliže potomek nebo rodič uzlu neexistují, příslušný ukazatel je nastaven na null/null. Je vhodné uvažovat ukazatele NULL jako listy binárního stromu. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 1/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 2/33 Red Black strom Rotace Definice (Red Black strom). Binární vyhledávací strom je Red Black strom, jestliže splňuje následující kritéria: 1 Každý uzel je bud černý nebo červený. 2 Každý list (NULL) je černý. 3 Jestliže je daný uzel červený, pak jeho potomci jsou černí. 4 Každá cesta z libovolného uzlu do listu obsahuje stejný počet černých uzlů. Počet černých uzlů na cestě z uzlu x do listu (mimo uzel x) nazýváme černou výškou uzlu x, píšeme bh(x). Dále definujeme černou výšku stromu jako černou výšku kořene stromu. Věta Výška RB stromu s n vnitřními uzly je nejvýše 2 log(n + 1). c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 3/33 Operace a Delete pracují na Red Black stromu s n klíči v čase O(log n). Protože strom modifikují, mohou narušit vlastnosti Red Black stromu. Abychom tyto nežádoucí modifikace napravili, musíme změnit barvu některých uzlů a přestavět strukturu ukazatelů. Tuto strukturu měníme pomocí operací zvaných rotace, což jsou lokální operace nad stromem, které zachovávají pořadí klíčů. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 4/33 Rotace Rotace Rozeznáváme dva druhy rotací: levou a pravou. Levá rotace x pracuje s ukazatelem z x do y. Uzely se stane novým kořenem stromu, s uzlem x jako svým levým potomkem a levý potomek y se napojí jako pravý potomek x. Operace RightRotate(T, x) transformuje sestavu dvou uzlů na levé straně na sestavu uzlů na pravé straně obrázku výměnou konstantního počtu ukazatelů. Sestavu na pravé straně lze převést na sestavu na levé straně inverzní operací LeftRotate(T, y). Za uvedené dva uzly je možno považovat libovolné dva uzly v binárním vyhledávací stromu. Písmena α, β a γ reprezentují příslušné podstromy uzlů x a y. Rotace pochopitelně zachovávají pořadí klíčů ve stromu: key[α] < key[x] < key[β] < key[y] < key[γ]. Obě rotace pracují v čase O(1). Mění se pouze ukazatele, ostatní položky uzlů zůstávají nezměněny. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 5/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 6/33

Vložení nového uzlu do Red Black stromu s n uzly lze provést v čase O(log n). Uzel se vkládá stejným způsobem jako v normálním binárním vyhledávacím stromu. Nověpřidaný uzel je obarven červeně. Pro zachování vlastností Red Black stromu je nutno strom po přidání opravit přebarvením uzlů a provedením rotací. Kód metody můžeme rozdělit do tří kroků. Za prvé je nutno určit jak se poruší vlastnosti Red Black stromu na řádcích 1a2,když přidáme uzel a obarvíme jej červeně. Za druhé musíme prozkoumat celkový záměr cyklu while na řádcích 3 17. V cyklu while pak může nastat celkem šest případů, které se řeší přebarvením a rotací. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 7/33 void (RBTreeItem newitem) 1 RBTreeNode x = Tree(newItem); 2 x.mcolor = RBTreeNode.COLOR_RED; 3 while ((x!= mroot) && (x.mparent.mcolor == RBTreeNode.COLOR_RED)) 4 if(x.mparent==x.mparent.mparent.mleftchild) Které z vlastností Red Black stromu se mohou porušit na řádcích 1 a 2? Vlastnost 1 je určitě splněna, stejně jako vlastnost 2, protože nově vložený uzel je červený a potomci jsou NULL (černí). Vlastnost 4, která říká, že počet černých uzlů na libovolné cestě z daného uzlu musí být stejný, je splněna, jelikož vložený uzel x nahradil (černý) NULL a uzel x je červený se dvěma černými potomky NULL. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 8/33 Proto lze porušit jedině vlastnost 3, která vyžaduje, že červený uzel nesmí mít červeného potomka. Vlastnost 3 se poruší pokud rodič uzlu x je červený a uzel x je obarven na červeno na řádku 2. Účelem cyklu while na řádcích 3 až 17 je přesunování narušení třetí vlastnosti nahoru po stromu při zachování vlastnosti 4. Na počátku každého průchodu cyklem, x ukazuje na červený uzel s červeným rodičem jedinou anomálii ve stromu. Existují pouze dvě možnosti ukončení cyklu: ukazatel x se dostal až na kořen stromu nebo se provedla rotace a vlastnost 3 je splněna. 3 while ((x!= mroot) && (x.mparent.mcolor == RBkTreeNode.COLOR_RED)) 4 if(x.mparent==x.mparent.mparent.mleftchild) V cyklu while může nastat celkem 6 případů z nichž tři jsou symetrické v závislosti na tom, zda rodič p[x] uzlu x je levým nebo pravým potomkem prarodiče p[p[x]] uzlu x, což se detekuje na řádku 4. p[x] není kořen stromu a p[p[x]] existuje. Důležitým předpokladem je, že kořen stromu je černý toto je zaručeno na řádku 18, vždy když se ukončuje cyklus. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 9/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 10/33, 1. případ v cyklu, 1. případ v cyklu 5 RBTreeNode y=x.mparent.mparent.mrightchild; 6 if (y.mcolor == RBTreeNode.COLOR_RED) // případ 1 7 x.mparent.mcolor = RBTreeNode.COLOR_BLACK; 8 y.mcolor = RBTreeNode.COLOR_BLACK; 9 x.mparent.mparent.mcolor=rbtreenode.color_red; 10 x = x.mparent.mparent; Případ 1 se liší od případů 2a3barvoustrýce uzlu x. Řádek 5 nastavuje ukazatel y na strýce x tj. right[p[p[x]]]. Jestliže y je červený provedou se příkazy případu 1, jinak se provede případ 2 nebo 3. Ve všech případech je prarodič uzlu x černý, zatímco rodič p[x] je červený, takže vlastnost 3 je porušena jen mezi x a p[x]. Případ 1 se provede pokud oba uzly p[x] a y jsou červené. Protože p[p[x]] je černý můžeme obarvit p[x] a y na černo, čímž vyřešíme problém dvou červených barev po sobě a zachováme vlastnost 4. Jediný problém může nastat pokud p[p[x]] má také červeného rodiče. Z toho plyne nutnost opakovat cyklus while s p[p[x]] jako novým ukazatelem x. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 11/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 12/33

, 2. případ v cyklu, 2. a 3. případ v cyklu else 11 if (x == x.mparent.mrightchild) // případ 2 12 x = x.mparent; 13 LeftRotate(x); Vpřípadech 2a3mástrýc y uzlu x barvu černou. Případy se liší podle toho, je-li xlevýnebo pravý potomek p[x]. Řádky 12 a13představují druhý případ, ve kterém je x pravý potomek. Použitím levé rotace lze tento případ převést jednoduše na případ 3. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 13/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 14/33, 3. případ v cyklu, 2. a 3. případ v cyklu // případ 3 14 x.mparent.mcolor = RBTreeNode.COLOR_BLACK; 15 x.mparent.mparent.mcolor=....color_red; 16 RightRotate(x.mParent.mParent); Vpřípadu 3 (řádky 14 16) je x levým potomkem. Protože x i p[x] mají červenou barvu, rotace neovlivní ani černou výšku bh ani vlastnost 4. Kdykoliv se dostaneme do třetího případu, at už přímo nebo přes případ druhý, strýc uzlu x je černý, jinak by byl řešen případ první. Provedeme několik změn barev a pravou rotaci čímž zachováme vlastnost 4 a tím cyklus while skončí, poněvadž již nemáme za sebou v řadě dva červené uzly (rodič p[x] je nyní černý). c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 15/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 16/33 příklad 1/2 // if (x.mparent == x.mparent.mparent.mleftchild) else // symetrické k 1. větvi // left a right jsou přehozeny // while 18 mroot.mcolor = RBTreeNode.COLOR_BLACK; c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 17/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 18/33

příklad 2/2 - Analýza Výška Red Black stromu s n uzly je úměrná log n, přidání uzlu proběhne v čase O(log n). Cyklus while se opakuje jen pokud se provede případ 1. Tudíž cyklus while se provede také v čase O(log n). Celkem je složitost vložení uzlu do Red Black stromu O(log n). Je zajímavé, že se nikdy neprovedou více než dvě rotace (případ 2 a 3). c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 19/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 20/33 Delete Delete - Analýza Stejně jako jiné základní operace nad stromy je možno i rušení uzlu provést v čase O(log n). Zrušení uzlu je komplikovanější než vložení. Metoda Delete je odvozena od procedury rušení uzlů v binárním vyhledávacím stromu. Po zrušení uzlu je potřeba zavolat pomocnou metodu, která změní některé barvy a provede rotace nutné pro zachování vlastností Red Black stromu. Výška Red Black stromu s n uzly je O(log n), metodu Delete lze vykonat v čase O(log n). Při vkládání je proveden konstantní počet změn barev a nejvýše tří rotace (složitost O(log n)). Celková časová složitost je tedy O(log n). c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 21/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 22/33 Uložení řetězců - Binární strom Pro uložení množiny řetězců si můžeme vybrat z několika datových struktur. Jednou z možností je použití hashovacích tabulek. Jejich výhodou je rychlý přístup k datům, ale nevýhodou je ztráta informace o relativním pořadí. Jinou možností je uložení řetězců do binárního vyhledávacího stromu, jehož výhodou je malá prostorová složitost. Dále můžeme použít tzv. vyhledávací trie, jsou rychlé ale mají velkou prostorovou složitost. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 23/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 24/33

Uložení řetězců -Trie Trie Vyhledávací trie ukládají řetězce znak po znaku. Každé vstupní slovo je zobrazeno pod uzlem, který jej reprezentuje. Ve stromě, který reprezentuje např. slova skládající se jen z malých písmen, má každý uzel 26 následovníků (anglická abeceda). Vyhledávání je velmi rychlé, v každém uzlu vlastně přistupujeme k prvku pole (jednomu z 26), testujeme na NULL/null a vybíráme větev. Trie bohužel mají nadměrnou prostorovou složitost. Uzel, ze kterého vychází 26 větví typicky vyžaduje 104 bytů, uzel s 256 větvemi spotřebuje 1kB. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 25/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 26/33 Ternární stromy Ternární stromy Ternární strom (TS) kombinuje přednosti ds trie a binárních vyhledávacích stromů -časovou efektivitu a prostorovou efektivitu. Stejně jako trie postupují znak po znaku. Stejně jako binární stromy jsou prostorově efektivní, každý uzel má 3 potomky (oproti dvěma u binárních stromů). Při vyhledávání se porovnává aktuální znak řetězce se znakem v uzlu. Pokud hledaný znak je menší než aktuální uzel, pokračujeme levým potomkem. Je-li větší pokračujeme pravým potomkem. Pokud jsou si znaky rovny, pokračujeme prostředním potomkem a vyhledáváme následující znak v řetězci. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 27/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 28/33 - Implementace 1/2 - Implementace 2/2 public class TernaryTree TernaryTreeNode mroot = null; public void (String term) mroot = Term(mRoot, term, 0); private TernaryTreeNode Term(TernaryTreeNode node,string term,int i) if (node == null) node = new TernaryTreeNode(term.charAt(i)); node.mleftchild = null; node.mmiddlechild = null; node.mrightchild = null; if (term.charat(i) < node.mchar) node.mleftchild = Term(node.mLeftChild, term, i); else if (term.charat(i) > node.mchar) node.mrightchild = Term(node.mRightChild, term, i); else if (index!= term.length()-1) node.mmiddlechild = Term(node.mMiddleChild, term, ++index); c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 29/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 30/33

- modifikace Ternární stromy - Find Existuje několik způsobů vkládání nového řetězce do ternárního stromu. Jedním ze způsobů je vyvážený TS, kdy jako kořen podstromu vybíráme vždy medián z příslušné množiny. Další možností je ta, že nejprve setřídíme vstupní množinu a jako kořen stromu vložíme prostřední řetězec, obdobně postupujeme dále. Vyhledávání slova is začíná v kořenu stromu, pokračuje dolů a nalezne uzel ohodnocený s a zastavuje se po dvou porovnáních. Při vyhledávání řetězce ax provede tři porovnání pro první znak a advě porovnání pro druhý znak x, hledání pak končí neúspěchem nebot slovo není ve stromě. Idea ternárních stromů vznikla již kolem roku 1964, bylo dokázáno mnoho teoretických poznatků ots, např. že vyhledání řetězce délky k ve stromě on uzlech bude vyžadovat v nejhorším případě O(k + n) porovnání. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 31/33 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 32/33 Ternární stromy - vyhledávání na částečnou shodu Vyhledávaný řetězec může obsahovat jak běžné znaky, tak symbol pro neznámý znak.. Prohledávání slovníku na řetězec.u.u.u nalezne slovo auhuhu, zatímco vzor.a.a.a nalezne 94 slov, včetně banana, casaba, apajama. (Tento vzor nenalezne samozřejmě abracadabra.) Máme nalézt všechna slova ve slovníku, která leží v Hammingově vzdálenosti od klíčového slova. Například hledání všech slov ve vzdálenosti 2 od Dobbs najde Debby, hobby, a 14 dalších slov. Efektivně nemůžeme řešit dotazy jako např. *less. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 33/33