Binární vyhledávací stromy



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

Algoritmy a datové struktury

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

Abstraktní datové typy FRONTA

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

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

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

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

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

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

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

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

ADT STROM Lukáš Foldýna

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í:

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

Binární vyhledávací strom. Proč binární? Vyhledávání

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2013/2014 Radim Farana. Obsah. 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 výpočetní geometrie

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

Implementace aritmetického stromu pomocí směrníků

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

Stromy, haldy, prioritní fronty

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

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

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

Radek Mařík

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

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

a) b) c) Radek Mařík

Časová a prostorová složitost algoritmů

Dynamické datové typy a struktury

Předmět: Algoritmizace praktické aplikace

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

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

Radomíra Duží L Datový typ množina

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.

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

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í

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Implementace LL(1) překladů

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

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

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

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Úvod do logiky (VL): 4. Zjištění průběhu pravdivostních hodnot formule tabulkovou metodou

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

Cvičení 7: Delphi objekty CheckedBox, Radio- Button, EditBox

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

Úvod do programování

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

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

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

Soustavy lineárních rovnic

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

Laboratorní práce: SNMP - Linux snmputils

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

Anotace. Objekt self, Zapouzdření, polymorfismus,

Násobení pomocí sčítání

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

Anotace. Jednotky (tvorba a využití), struktury (typ record),

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

R zné algoritmy mají r znou složitost

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Programovací jazyk Pascal

Zveme Vás na přednášku na téma: Termín a místo konání: Zveme Vás na přednášku na téma: Termín a místo konání: Zveme Vás na přednášku na téma:

Na zde uvedené zboží, zakoupené na adrese Vám nabízíme individuální slevy.

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

Databázové systémy Cvičení 5.2

XML a DTD. <!DOCTYPE kořenový_element [deklarace definující vlastnosti jednotlivých elementů a atributů]> externí deklarace:

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

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

TGH07 - Chytré stromové datové struktury

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

Náznak ukázky syntaxe a sémantiky pro projekt. 1 Syntaktické prvky. Poslední aktualizace: 8.

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

Dynamické datové struktury II.

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

Tematický celek 03 - Cvičné příklady

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

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

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

66. ročník Matematické olympiády 2016/2017

Dynamické datové struktury III.

VY_32_INOVACE_08_2_04_PR

Sada 1 - Základy programování

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

57. ročník Matematické olympiády 2007/2008

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

Struktura programu v době běhu

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

Teória grafov. Stromy a kostry 1. časť

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

66. ročník Matematické olympiády 2016/2017

Reprezentace dat v informačních systémech. Jaroslav Šmarda

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

Transkript:

Binární vyhledávací stromy Definice: Binární vyhledávací strom (po domácku BVS) je buďto prázdná množina nebo kořen obsahující jednu hodnotu a mající dva podstromy (levý a pravý), což jsou opět BVS, ovšem takové, že všechny hodnoty uložené v levém podstromu jsou menší než hodnota v kořeni, a ta je naopak menší než všechny hodnoty uložené v pravém podstromu. Pokud x je kořen a Lx a Rx jeho levý a pravý podstrom, pak kořenům těchto podstromů (pokud nejsou prázdné) budeme říkat levý a pravý syn vrcholu x a naopak vrcholu x budeme říkat otec těchto synů. Pokud je některý z podstromů prázdný, pak vrchol x příslušného syna nemá. Vrcholu, který nemá žádné syny, budeme říkat list vyhledávacího stromu. Všimněte si, že pokud x má jen jediného syna, musíme stále rozlišovat, je-li to syn levý nebo pravý, protože potřebujeme udržet správné uspořádání hodnot. Také si všimněte, že pokud známe syny každého vrcholu, můžeme již rekonstruovat všechny podstromy. Názorný obrázek: Vysvětlení: Každý prvek BVS je zároveň vrcholem Vrchol 8 je kořen stromu Vrcholy 3, 1, 6, 45, 19, 65 mají potomky Vrcholy 0, 2, 5, 7, 11, 23, 56, 100 jsou listy, nemají žádného následovníka Všechny vrcholy nalevo od kořene stromu jsou menší než je hodnota kořene Všechny vrcholy napravo od kořene stromu jsou větší než je hodnota kořene - 1 -

Každý BVS také můžeme popsat velmi jednoduchou strukturou v paměti: type TStrom = ^vrchol; vrchol = record levy, pravy : pvrchol; klic : integer; end; Vysvětlení: klic = data vrcholu levy, pravy = potomci Názorná ukázka, jakým způsobem se rozmísťují jednotlivé hodnoty v BVS Máme množinu čísel [8, 3, 45, 1, 6, 19, 65, 0, 2, 5, 7, 11, 23, 56, 100], kde číslo 8 bude kořenem Jako druhé číslo je v seznamu číslo 3. Jelikož je číslo 3 menší než je kořen, proto se číslo 3 vykreslí vlevo od kořene. Číslo 45 je naopak větší než je kořen, proto se vykreslí napravo od kořene. Viz obrázek Dalšími čísly v seznamu jsou čísla 1 a 6. Protože číslo 1 je menší než kořen a zároveň menší než vrchol s číslem 3, zapíše se vlevo od čísla 3. Číslo 6 je taktéž menší než je kořen, ale zároveň větší než je vrchol s číslem 3, proto se zapíše vpravo od vrcholu s číslem 3 Obdobně se to děje s ostatními čísly. Dalším číslem je 19, je větší než 8 a zároveň menší než 45, proto se vykreslí vlevo od čísla 45. A tak stejně s ostatními čísly, až dojdeme k poslednímu číslu a vznikne nám toto: - 2 -

Samotné vytvoření binárního vyhledávacího stromu se děje pomocí následující procedury procedure VytvorBVS(x: integer; var S: TStrom); var nvrchol: TStrom; begin if s=nil then begin new(nvrchol); nvrchol^.klic:=x; nvrchol^.pocet:=1; nvrchol^.levy:=nil; nvrchol^.pravy:=nil; s:=nvrchol; end if x<s^.klic then VytvorBVS(x, s^.levy) if x>s^.klic then VytvorBVS(x, s^.pravy) s^.pocet:=s^.pocet+1; end; Vysvětlení příkazů: var nvrchol: TStrom; vytvořím si proměnou nvrchol, která bude typu TStrom if s=nil then podmínka k zjištění, zda-li je strom prázdný nebo je odkaz na syna NILL new(nvrchol); vytvořím nový vrchol nvrchol^.klic:=x; přiřadím hodnotu novému vrcholu nvrchol^.pocet:=1; nastavíme počet na jedničku (pro zjištění, zda-li se některé číslo nevyskytuje vícekrát) nvrchol^.levy:=nil; nvrchol^.pravy:=nil; do levého i pravého koř. přiřadíme nil s:=nvrchol; nyní stromu přiřadíme nvrchol if x<s^.klic then VytvorBVS(x, s^.levy) když je vkládaný prvek(x) menší než je vrchol (klic) tak zapiš vlevo - 3 -

if x>s^.klic then VytvorBVS(x, s^.pravy) když je vkládaný prvek(x) větší než je vrchol (klic) tak zapiš vpravo s^.pocet:=s^.pocet+1; zde zvýšíme počet o jedničku Rušení vrcholů v binárním vyhledávacím stromu Vysvětlili jsme si, jak vytvořit BVS. Nyní si ukážeme, co se stane se stromem, když zrušíme některý z vrcholů. Máme vytvořený strom, řekněme, že budeme chtít zrušit např. vrchol číslo 3. Vidíme, že nám zmizel vrchol číslo 3, a že se vrchol s číslem 5 posunul na jeho místo. Stalo se to proto, že číslo 5 leží na intervalu právě mezi čísly 1 a 6 a nemá žádného následovníka (potomka). Z toho důvodu nemůže být vrchol číslo 3 nahrazen např. vrcholem s číslem 6, protože tento vrchol má potomky. Kdybychom teď smazali vrchol s číslem 5, tak se nám místo něj vypíše číslo 6. Opět z toho důvodu, že leží mezi čísly 1 a 7 a nemá žádného potomka. - 4 -

Nyní ještě pro zopakování si vyzkoušíme zrušit vrchol na pravé větvi. Např. vrchol s číslem 45. Už určitě víte, který vrchol jej nahradí. Máte pravdu, bude to vrchol s číslem 56. A na závěr zrušíme kořen tj. vrchol s číslem 8. Který vrchol se vypíše místo něj? Ano, bude to vrchol s číslem 11. Před zrušením Vrchol s číslem 11 nahradil kořen proto, že splňuje následující podmínky: 1. nemá žádného potomka 2. leží na intervalu mezi čísly 3 a 45 Po zrušení - 5 -