Zpráva k semestrální práci z pedmtu 36PT programovací techniky



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

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

Cykly Intermezzo. FOR cyklus

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 a datové struktury

Správa obsahu ízené dokumentace v aplikaci SPM Vema

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

Datový typ POLE. Jednorozmrné pole - vektor

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

Promnné. [citováno z

Abstraktní datové typy FRONTA

Zbytky zákaznického materiálu

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

PÍRUKA A NÁVODY PRO ÚELY: - RUTINNÍ PRÁCE S DATY

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 IV.

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

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

Dynamické datové struktury I.

Binární vyhledávací stromy

Semestrální práce 2 znakový strom

Každý datový objekt Pythonu má minimáln ti vlastnosti. Identitu, datový typ a hodnotu.

POPIS TESTOVACÍHO PROSTEDÍ 1 ZÁLOŽKA PARSER

Dynamické datové struktury III.

IMPORT DAT Z TABULEK MICROSOFT EXCEL

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

Vysoká škola báská Technická univerzita Ostrava Institut geoinformatiky. Analýza dojíždní z dotazníkového šetení v MSK. Semestrální projekt

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

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

a) b) c) Radek Mařík

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

TGH07 - Chytré stromové datové struktury

VYTVÁENÍ VÝBROVÝCH DOTAZ

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

1 KOMBINATORIKA, KLASICKÁ PRAVDPODOBNOST

4. Lineární diferenciální rovnice rovnice 1. ádu

OCR (optical character recognition) - rozpoznávání textu v obraze

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í

Časová a prostorová složitost algoritmů

Stromy, haldy, prioritní fronty

Algoritmy výpočetní geometrie

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

Rozvrhování na více procesorech

Instalace multiimportu

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

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

Prbh funkce Jaroslav Reichl, 2006

Datové typy a struktury

Pídavný modul rozvaha lze vyvolat z hlavní nabídky po stisku tlaítka Výkazy / pídavné moduly.

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

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

R O V N O B Ž N Í K (2 HODINY)

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:

Zadání druhého zápočtového projektu Základy algoritmizace, 2005

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.

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

Prioritní fronta, halda

Standardní algoritmy vyhledávací.

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

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

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

Protože pi každém volání funkce ff se zavolá funkce abc() práv jednou, je poet volání funkce abc() práv 7. Platí varianta d).

TGH07 - Chytré stromové datové struktury

MATEMATIKA MATEMATIKA

Pravdpodobnost výskytu náhodné veliiny na njakém intervalu urujeme na základ tchto vztah: f(x)

ADT STROM Lukáš Foldýna

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

Základní pojmy klasického sudoku hlavolamu. Techniky odkrývání bunk. Technika Naked Single. Technika Hidden Single

Univerzální ovlada LP20 DÁLKOVÝ OVLADA S MOŽNOSTÍ UENÍ SE OD PVODNÍCH OVLADA

ABSTRAKTNÍ DATOVÉ TYPY

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

Datové struktury Úvod

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

Grafové algoritmy. Programovací techniky

Úvodní studie (pokraov

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

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

KUSOVNÍK Zásady vyplování

Zpracování deklarací a přidělování paměti

1 Píklady popisu typických konstrukcí

Algoritmizace prostorových úloh

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

L I C H O B Ž N Í K (2 HODINY) ? Co to vlastn lichobžník je? Podívej se napíklad na následující obrázky:

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

Ing. Jaroslav Halva. UDS Fakturace

Funkční objekty v C++.

DUM. Databáze - úvod

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

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

GYMNÁZIUM CHEB. SEMINÁRNÍ PRÁCE Grafy funkcí sbírka ešených úloh. Radek HÁJEK, 8.A Radka JIROUŠKOVÁ, 8.A Cheb, 2006 Petr NEJTEK, 8.

Obsah Úvod...2 Slovníek pojm Popis instalace...3 Nároky na hardware a software...3 Instalace a spouštní...3 Vstupní soubory

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

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

DRUHY ROVNOBŽNÍK A JEJICH VLASTNOSTI 1 HODINA

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

Prezentaní program PowerPoint

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

Základní datové struktury

Algoritmizace prostorových úloh

Transkript:

Zpráva k semestrální práci z pedmtu 36PT programovací techniky Implementace algoritmu: Dvojrozmrný intervalový strom jméno a píjmení: Michal Trs studijní skupina: 12 roník: 2 cviení: pátek 7:30

1. Specifikace ešeného problému Dvourozmrný intervalový strom je datová struktura vhodná pro reprezentaci vyhledávacího prostru s operací hledání na intervalovou shodu. Tento datový typ je vhodné použít pro velký poet nemnných prvk (bod [x,y]), kde potebujeme asto vdt které body z prohledávaného prostoru padnou do obdélníku <Xmin,Xmax x <Ymin,Ymax. Viz Obr 1.1. y Ymax Ymin Xmin Xmax x Obr 1.1 - ešený problém 2. Rešerše Nejjednodušší algoritmus prohledávání na intervalovou shodu je Sekvenní vyhledávání (Popsáno viz použitá literatura kap. 4.2.1). Pokud je množina nad kterou vyhledáváme seazena, staí sekvenn od zaátku najít dolní mez a poté vypisovat prvky dokud je aktuální prvek menší než horní mez hledaného intervalu. ásten lze hledání urychlit tím, že do uritých míst seznamu budeme pistupovat pomocí pole. Další metodou jak efektivnji najít minimum od kterého probíhá vyhledávání je binární plení. Další použitelnou strukturou pro vyhledávání na intervalovou shodu jsou D-BVS. Jsou to D-rozmrné binární vyhledávací stromy kde se v každém pate stromu cyklicky mní klí podle kterého vyhledáváme. Napíklad máme-li 2-BVS hledáme na první úrovni podle 1.klíe (souadnice x), na druhé úrovni podle 2.klíe (souadnice y), na 3. úrovni znovu podle 1.klíe, atd. Výhodou tchto strom je, že prostor mžeme prohledávat také na úplnou a ástenou shodu. 3. Popis a vysvtlení algoritm 3.1 Jednorozmrný intervalový strom Nejprve vysvtlím konstrukci a prohledávání jednorozmrného stromu, protože tento strom je ve všech uzlech stromu dvourozmrného. Používá se pro vyhledávání interval v jednom rozmru. 3.1.1 Konstrukce stromu Základem je obousmrn zetzený seznam (dále jen SEZNAM) bod se souadnicemi x,y. Tento seznam musíme nejprve seadit podle souadnice podle které bude chtít vyhledávat. V našem pípad podle souadnice y. Nad takto seazeným Seznamem stavíme odspodu binární vyhledávací strom tak, že prvky SEZNAMu jsou listy stromu. 2 / 14 Michal Trs

Strom má tu vlastnost, že levý synové každého uzlu jsou menší nebo rovny uzlu a pravý synové mají vtší hodnotu klíe než uzel. Kdyby byl seznam nesetídn, toto by neplatilo a strom by nebyl použitelný pro vyhledávání. Tento strom je vidt na Obr 5.3. 3.1.2 Vyhledávání ve stromu Nech je hledaným intervalem interval <Ymin,Ymax. Hledáme hodnotu p Ymin. Postupujeme od koene, pokud je Ymin aktuální uzel pak jdi doleva, pokud Ymin aktuální uzel pak jdi doprava. Takto postupuj dokud není uzel list (tzn. našel jsem prvek p). Pokud je p Ymax je hledaná interval prázdný, jinak poínaje tímto prvkem p zani sekvenn procházet SEZNAM smrem k vtším prvk, dokud jsou prvky menší než Ymax. Tyto prvky jsou ukládány do výstupního seznamu. 3.2 Dvojrozmrný intervalový strom Používá se pro prohledávání 2D prostoru na intervalovou shodu podle dvou souadnic. Situace je znázornna na Obr 1.1 - ešený problém. Opt popíšu konstrukci a prohledávání stromu jako v pedchozím pípad. 3.2.1 Konstrukce stromu Základem je SEZNAM, tentokrát seazený podle souadnice x. Listy stromu nejsou prvky SEZNAMu (jako u 1D stomu), ale mají pouze hodnotu klíe a odkaz na jednorozmrný podstrom vytvoený ze seznamu. Tento seznam obsahuje pouze prvky kteí jsou synové tohoto uzlu (listu). Uzly vypadají stejn jako u 1D stromu, ale mají navíc ukazatel na 1D podstrom popsaný výše. Nad listy vygenerujeme opt vyvážený binární vyhledávací strom a každému vnitnímu uzlu piadíme podstrom generovaný podle souadnice y. Vlastní strom mžeme stavt odspodu od list, nebo od koene. Já jsem použil stavní od zdola které je podrobn popsáno v kapitole 4.3 u vysvtlování metody Create t2stromu. 3.2.2 Vyhledávání ve stromu Najdeme horní a dolní mez intervalu <Xmin,Xmax. Oznaíme si uzel u ve kterém se dlí cesta k minimu a maximu. Je dobe patrné, že levý a pravý syn obsahují dohromady všechny prvky padnoucí do intervalu plus njaké navíc, proto zaneme minimu vyhledávat v levém synovy. Postupujeme takto: Pokud je hodnota Xmin hodnota uzlu jdeme doleva a tudíž musíme zpracovat (prohledáme výše popsaným zpsobem 1D strom na shodu podle souadnice y) podstrom pravého syna tohoto uzlu, protože všechny body jsou zaruen mezi Xmin a Xmax a tudíž patí do hledaného intervalu. Pokud je Xmin hodnota uzlu jdeme doprava a podstrom nezpracováváme. tímto zpsobem pokraujeme dokud nenarazíme na list (tj. jsme na konci stromu). Obdobn postupujeme pi hledání maxima. Zaneme u pravého syna. Pokud jdeme doprava, zpracováváme levé podstromy tohoto uzlu. Pokud jdeme doleva, podstrom nezpracováváme. Koníme opt narazíme-li na list. 4. Popis implementace a datových struktur V této kapitole popíšu moji implementaci dvojrozmrného intervalového stromu. Programovací jazyk jsem zvolil Object Pascal Delphi 6. 3 / 14 Michal Trs

4.1 Pomocné datové struktury Jsou to struktury používané jedno a dvojrozmrným intervalovým vyhledávacím stromem. Postupn zde uvedu deklarace všech datových typ a vysvtlím co jednotlivé metody dlají a u nkterých jak fungují. tbod (useznam) reprezentuje bod v rovin o souadnicích x,y tbod = record x,y: integer; tcell (useznam) Buka spojového seznamu. ptrcell = ^tcell; tcell = record prev, next: ptrcell; point: tbod; tklic (useznam) výtový typ - používán v metodách pi specifikaci o jakou souadnici se jedná. Napi v procedue Serad. tklic = (x,y); tseznam (useznam) Vlastní spojový seznam. tseznam = class public constructor Create; destructor Destroy; {zrusi vsechna data v seznamu} procedure Prazdny; {vyhodi vsechny bunky, ale nerusi data!!!} procedure Pridej(bod: tbod); {pridani noveho prvku na konec} procedure SetAktualni(prvek: ptrcell); procedure ZaradPrvek(Prvek: ptrcell); function Prvni: ptrcell; function Dalsi: ptrcell; function PrvniHodn: tbod; function DalsiHodn: tbod; procedure Serad(klic: tklic); function QKonec: Boolean; function QPrazdny: Boolean; function PocPrvku: integer; procedure PripojSeznam(Sez: tseznam); {pripoji Sez nakonec seznamu} function SpojSeznamy(Sez1,Sez2: tseznam): tseznam; function GetAktualni: tbod; {preskoci prvky stejne hodnoty jak Hod podle x nebo y} function PreskocStejne(Hod: integer; klic: tklic): tseznam; private pprvku: integer; first, last, akt: ptrcell; Vysvtlení základních metod objektu: 4 / 14 Michal Trs

Create Destroy Pridej SetAktualni ZaradPrvek Prvni / PrvniHodn Dalsi / DalsiHodn Serad QKonec QPrazdny PocPrvku PripojSeznam SpojSeznamy GetAktualni PreskocStejne Vytvoí prázdný spojový seznam. Zruší instanci objektu všechny jeho data. Pidá nový Bod na konec seznamu. Nastaví prvek jako aktuální pozici v seznamu. Obdoba metody Pridej, ale pidává již vytvoený Prvek seznamu. Vrátí ukazatel na první buku seznamu / pímo hodnotu bodu v buce. Pitom nastaví aktuální pozici na zaátek. Posune se v seznamu o jednu pozici doprava a vrátí ukazatel na buku seznamu / pímo hodnotu bodu v buce. Seadí seznam bodle souadnice odpovídající klíi. azení je realizováno algoritmem QUICKSORT. Probíhá takto: Nejprve se v pamti alokuje dynamické pole ukazatel na buky seznamu. Tyto ukazatele se setídí. Dále je použita metoda Prázdný která vyprázdní seznam, ale zachová data v pamti. Do takovéhoto seznamu jsou pidány metodou ZaradPrvek již seazené prvky z pole. true pokud je aktuální prvek poslední. true pokud poet prvk je roven nule. Vrací poet prvk v seznamu. Pipojí seznam Sez na konec seznamu a tím pádem Sez zruší. Vrací nový objekt seznam. Symbolicky se dá tato operace zapsat takto: result:=sez1+sez2; Seznamy Sez1 a Sez2 zstanou nezmnné. Vrací hodnotu aktuálního bodu Peskoí buky seznamu které podle zvoleného klíe mají stejnou hodnotu souadnice jako práv aktuální. Zastaví se na poslední bue se stejnou hodnotou. Peskoené buky jsou ukládány do nového seznamu a ten je funkcí vrácen. funkce porovnej (useznam) Porovnají promnné A a B a vrací 1 pokud A B, 0 pokud A = B a -1 pokud A<B function Porovnej(A,B: tbod; klic: tklic): integer; overload;{body s prioritou klice} function Porovnej(A,B: integer): integer; overload; tfronta (istrom), t2fronta (i2strom) Fronta do které je možno ukládat Uzly strumu. Jsou to 2 rozdílné objekty které se liší pouze daty s kterými mohou pracovat. tfronta pracuje s objekty tuzel (píp. zddným tlist) a t2fronta s objekty t2uzel (píp. t2list). Vlastní fronta je implementována pomocí jednosmrn zetzeného spojového seznamu. Uvedu zde pouze deklaraci objektu tfronta, protože objekt t2fronta obsahuje zcela stejné metody. tfronta = class public constructor Create; destructor Destroy; procedure Pridej(Uzel: tuzel; dalsihodn:integer); procedure Odeber(var Uzel: tuzel; var dalsihodn:integer); function QPrazdna: boolean; private celo, tyl: tprvekfronty; pprvku: integer; 5 / 14 Michal Trs

Samotnou frontu tvoí buky objekty tprvekfronty. Nebudu zde uvádt jejich deklarace, protože je používán pouze samotná fronta. 4.2 Jednorozmrný intervalový strom Vše dále popisované v této podkapitole je implementováno v unit istrom.pas. Využívá unitu useznam. tuzel jednotlivé uzly z kterých je stavn strom tuzel = class; tuzel = class public constructor Create(levy: tuzel; pravy: tuzel; hodn: integer); function GetHodnota: integer; function GetLevy: tuzel; function GetPravy: tuzel; private l,p: tuzel; hod: integer; Vysvtlení jednotlivých metod: Create Vytvoí nový uzel, její parametry jsou levý a pravý syn a hodnota uzlu. GetHodnota Vrací hodnotu uzlu. GetLevy/GetPtavy Vrátí levého / pravého syna. tlist Je odvozen od tuzel. Formáln je s ním shodný, ale jeho synové jsou ukazatelé na tcell, tj. jsou to ukazatelé do spojového seznamu. tlist = class (tuzel) private l,p: ptrcell; public constructor Create(levy: ptrcell; pravy: ptrcell; hodn: integer); function GetLevy: ptrcell; function GetPravy: ptrcell; Create Vytvoí nový list, který bude ukazovat do seznamu a bude mít hodnotu hodn tstrom Vlastní jednorozmrný vyhledávací strom. Pracuje zcela nezávisle na dvojrozmrném stromu. tstrom = class public constructor Create(Seznam: tseznam); destructor Destroy; Function NajdiInterval(Ymin,Ymax: integer): tseznam; Function NajdiMin(Ymin: integer): ptrcell; function GetSeznam: tseznam; function GetKoren: tuzel; private 6 / 14 Michal Trs

koren: tuzel; S: tseznam; Vysvtlení implementace jednotlivých metod: Create Destroy NajdiMin NajdiInterval GetSeznam GetKoren Vytvoí nový jednorozmrný strom nad seznamem. Stavba stromu probíhá odspodu. Postupuje v tchto krocích: seadí seznam podle klíe vzestupn. nate první prvek seznamu do promnné lcell peskoí buky se stejnou hodnotou klíe nate další prvek do promné pcell z lcell a pcell vytvoí list a pidá jej do fronty1 takto pokraujeme dokud nejsme na konci seznamu pokud jsme na konci seznamu a v lcell máme natenou buku musíme list také vytvoit, ale s tím rozdílem, že pcell bude nil. Dokud není fronta1 prázdná, vyber vždy 2 prvky a vytvo z nich nový uzel a pidej ho do fronty2. Pokud ve front1 zbyl jeden prvek, nestavíme nad ním další uzel, ale rovnou jej pesuneme do fronty 2. fronta1:=fronta2; a vyprázdni frontu 2; Opakuj pedchozí 2 bodu dokud fronta neobsahuje pouze jeden prvek, pak skoni a tento prvek je koen stromu. Zruší strom se všemi daty Pomocí stromu najde prvek p, který je vtší nebo roven Ymin. Hledání je popsáno v kapitole 3.1.2. Najde interval <Ymin,Ymax. Výsledek který funkce vrací je SEZNAM. Nejprve volá funkci NajdiMin. Pokud vrácená hodnota této funkce je vtší než Ymin vrátí tato funkce nil tzn. hledaný interval je prázdný. Jinak poínaje tímto prvkem zane procházet prvky ze SEZNAMu a zane je ukládat do nového seznamu dokud je aktuální hodnota < Ymax. Tento nový seznam je výstup funkce. Vrátí seznam nad kterým byl strom postaven. Využito pi konstrukci dvojrozmrného stromu. Vrací koen stromu. 4.3 Dvojrozmrný intervalový strom Vše dále popsané je implementováno v unit i2strom.pas. Tato unita využívá useznam a istrom. Opt uvedu deklarace objekt Uzlu a Stromu a slovn vysvtlím jak pracují jednotlivé metody. t2uzel Základní kameny z kterých se skládá strom. Jsou podobné Uzlm jednorozmrného stromu, ale mají navíc položku podstrom, ve které je uložen strom generovaný podle souadnice y. t2uzel = class; t2uzel = class public constructor Create(levy: t2uzel; pravy: t2uzel; hodn: integer; podstrom: tstrom); destructor Destroy; virtual; function GetHodnota: integer; function GetLevy: t2uzel; function GetPravy: t2uzel; function GetPodStrom: tstrom; 7 / 14 Michal Trs

private l,p: t2uzel; hod: integer; Strom: tstrom; Vysvtlení metod: Create Vytvoí nový uzel. Promnné levy a pravy jsou levý a pravý syn. PodStrom je jednorozmrný strom. Destroy Zruší Uzel a všechna data která obsahuje (i podstrom) GetHodnota Vrátí hodnotu uzlu. GetLevy/GetPravy Vrátí levého / pravého syna. GetPodStrom Vrátí objekt jednorozmrný strom. t2list Odvozen z t2uzel. Vytvoil jsem si jej proto, že pomocí nj snadno zjistím, že jsem na konci stromu. Oproti t2uzel nemá žádné metody navíc, pouze má jednoduší constructor, který pravého a levého syna nastaví na nil. t2strom Rozhraní 2 rozmrného vyhledávacího intervalového stromu. Create postaví dvojrozmrný strom nad seznamem. Funkce najdi interval, hledá body padnoucí do zadaného intervalu. t2strom = class public constructor Create(seznam: tseznam); destructor Destroy; Function NajdiRozcesti(Xmin,Xmax: integer): t2uzel; Function NajdiInterval(Xmin,Xmax,Ymin,Ymax: integer): tseznam; private koren: t2uzel; Sez: tseznam; Vysvtlení metod: Create Pracuje v tchto krocích: Seadí seznam podle souadnice x Nate první hodnotu ze seznamu a z ní vytvoí list. Peskoí body se stejnou hodnotou souadnice x. Tyto hodnoty jsou uložené v seznamu. K tomu seznamu je pidána první hodnota a je poslán do konstruktoru jednorozmrného strumu. Tento strom je piazen tomuto listu. Vytvoený list uložíme do fronty1 To samé prove pro všechny další hodnoty x. Pokrauj tak dlouho, dokud nejsme na konci seznamu. Postupn vybírej listy po dvou z fronty1 a vytváej nad nimi uzly. Spoj seznamy z kterých byl vytvoen podstrom prvního a druhého nateného listu a pošly do konstruktoru jednorozmrného stromu. Tento strom bude podstromem tohoto uzlu. Pokud jsme na konci a je naten pouze první list z dvojice, tak druhému piadíme nil a vytvoíme uzel. Uzly pidáváme do fronty2 fronta1:=fronta2, pokud fronta1 obsahuje pouze 1 prvek, je tento prvek koen stromu. 8 / 14 Michal Trs

jinak vybírej uzly z fronty1 po dvou a vytváej nad nimi uzly výše popsaným zpsobem. Pokud zbude na konci fronty1 uzel pesu jej do fronty2. Destroy Zruší strom vetn všech dat. NajdiRozcestí Najde uzel ve kterém se dlí cesta k maximu a minimu. NajdiInterval popsáno v kapitole 3.2.2. 5. Ovení algoritmu V následujících podkapitolách si na dvou píkladech ukážeme jak probíhá vyhledávání ve dvojrozmrném intervalovém strom. 5.1 První píklad Mjme tyto body [0,6], [1,4], [2,4], [3,5], [5,6], [6,4], [6,9], [7,7], [7,8], [8,0]. Z nich je vytvoen dvojrozmrný intervalový strom (Obr 5.1, Obr 5.2, Obr 5.3). Hledejme napíklad interval <2,7 x <3,6. Nejprve hledáme uzel, kde se nám dlí cesta k horní a dolní mezi intervalu x. Tento bod je hned koen stromu. Proto od tohoto bodu pokrauje jinou cestou pi hledání minima a maxima. Nejprve si ukážeme hledání minima. Dobe je to vidt v Obr 5.1, cesta je vyznaena ervenými šipkami. Dolní mez intervalu je 2, proto v uzlu 1 jdeme doprava a levý podstrom do intervalu nepatí. Uzel 2 je roven dolní mezi proto pokraujeme doleva a pitom musíme zpracovat pravý podstrom s4, protože podle souadnice x padne do intervalu. V podstromu s4 hledáme na shodu podle y. Uzel = 5, Ymin = 3, jdeme doleva. Jsme v seznamu, nalezli jsme prvek [3,5], 5 je menší než Ymax = 6 a proto tento prvek zaadíme do výsledného seznamu. Další prvek v seznamu není a proto pokraujeme dále v prohledávání hlavního stromu podle x. Uzel s hodnotou 2 je list a to znamená že jsme s hledáním minima skonili. Ješt musíme prohledat podstrom s3 na shodu podle y. Hledání probíhá naprosto stejn jako u podstromu s4. Nalezený prvek [2,4] do intervalu patí a proto jej pidáme do výsledného seznamu. Nyní pokraujeme hledáním maxima. Uzel 6 je menší než Xmax = 7 a proto pokraujeme doprava, ale musíme zpracovat levý podstrom s11. Hledání v tomto podstromu je patrné z Obr 5.2. Hodnota koene je 6, což je více než Ymin = 3 a proto pokraujeme doleva. Uzel 4 je vtší než Ymin a proto pokraujeme opt doleva. Nalezli jsme prvek [6,4]. 4 je menší než Ymax = 6 a proto tento prvek do hledaného intervalu patí. Pidáme jej tedy do výstupního seznamu. Sekvenn zaneme procházet seznam dokud nebude hodnota vtší než Ymax, nebo bude konec seznamu. Další je prvek [5,6], 6 je menší nebo rovno Ymax = 6 a proto jej pidáme do seznamu. Další je prvek [6,9], 9 není menší než Ymax a proto koníme s procházením podstromu a vracíme se k hledání maxima podle souadnice x. Uzel 7 je menší nebo roven Xmax = 7 a proto jdeme doleva. Uzel 7 je zárove list a proto zde hledání maxima koní. Ješt musíme prohledat podstrom s7. Uzel 7 je vtší než Ymin = 6 a proto pokraujeme doleva. Nalezli jsme prvek [7,7], 7 je vtší než Ymax a proto tento prvek do intervalu nepatí. 9 / 14 Michal Trs

3 tstrom: s6 t2uzel: s15 1 6 s13 0 2 5 7 s14 t2list: 0 1 2 3 5 6 7 8 s9 s10 s11 s12 s1 s2 s3 s4 s5 s6 s7 s8 tseznam: 0,6 1,4 2,4 3,5 5,6 6,4 6,9 7,7 7,8 8,0 Obr 5.1- t2strom - dvojrozmrný intervalový strom (strom podle souadnice x) 10 / 14 Michal Trs

s1 6 0,6 nil s3 4 2,4 nil s4 5 3,5 nil s7 7 7,7 7,8 s9 4 1,4 0,6 s11 6 s12 7 4 9 6,4 5,6 6,9 nil 0 8 8,0 7,7 7,8 nil s13 5 4 6 1,4 2,4 3,5 0,6 nil s14 5 4 0 6 8 8,0 6,4 5,6 7,7 7,8 6,9 Obr 5.2 - ukázka podstrom dvojrozmrného stromu z Obr 5.1 tuzel: 3 4 8 tlist: tseznam: 0 5 7 8,0 1,4 2,4 6,4 3,5 0,6 5,6 7,7 7,8 6,9 9 nil Obr 5.3 - Jednorozmrný strom podle souadnice y (souasn podstrom s15) 11 / 14 Michal Trs

Obr 5.4 - výsledek testovací utility 5.2 Druhý píklad Druhý píklad jsem zvolil jednoduší. Náhodn jsem zvolil 4 body a dal vyhledat ¼ intervalu. Hledání stejn jako je popsáno v prvním píkladu. Na Obr 5.5 je situace rozkreslená do grafu. Je patrné, že vyjde stejný výsledek jako v testovací utilit na Obr 5.6 55 s7 14 56 s1 54 14,54 nil s2 41 55,41 nil 14 55 56 99 s5 s6 s1 s2 s3 s4 s3 95 56,95 nil s4 82 99,82 nil s5 41 55,41 14,54 s7 54 s6 82 99,82 56,95 41 82 55,41 14,54 99,82 56,95 Obr 5.5 - Kompletní dvojrozmrný intervalový strom 12 / 14 Michal Trs

Obr 5.6 - výsledek testovací utility 6. Výpoet a ovení složitosti algoritmu 6.1 Jednorozmrný intervalový strom 6.1.1 Operaní složitost vyhledávání Pi hledání intervalu musíme nejprve najít prvek p Ymin. Znamená to, že musíme jednou projít stromem od koene k listu. Poet provedených porovnání je roven výšce stromu. U binárního stromu je rovna log 2 n. Po nalezení prvku p zaneme sekvenn procházet seznam. Pi každém prchodu musíme porovnat jestli je aktuální prvek menší než Ymax. Tento poet odpovídá potu prvk odpovídající hledanému intervalu. Oznaíme ho m. Ve vtšin pípad je m log 2 n, proto jej nemžeme zanedbat. Celková složitost vyhledávání je tedy O(m+log 2 n). 6.1.2 Pamová složitost Strom se skládá ze spojového seznamu o n prvcích. Nad tímto seznamem je postaven strom o n - 1 uzlech. Celková složitost je S(n). 6.2 Dvojrozmrný intervalový strom 6.2.1 Operaní složitost vyhledávání Je patrné, že nalezení minima a maxima podle souadnice x je úmrné log 2 n. Dále musíme pro každou souadnici x ležící v intervalu prohledat podstrom na shodu podle souadnice y se složitostí O(m+log 2 n). To znamená, že složitosti musíme vynásobit. Dostaneme tedy O((log 2 n) 2 +m). 6.2.2 Pamová složitost Strom se skládá z n-1 uzl. Každý uzel obsahuje podstrom vystavný na seznamu. Souet prvk seznam v jedné úrovni je n a souet uzl podstrom v každé úrovni je n-1. Abychom dostaly celkový poet vynásobíme toto íslo potem úrovní stromu, kterých je log 2 n. Vyjde nám, že celková pamová složitost je S(n+n.log 2 n). 13 / 14 Michal Trs

6.3 Mení potu operací Pro ovení operaní složitosti jsem do kódu umístil poítadla, která poítala poet porovnání. Vždy jsem vygeneroval n náhodných bod z intervalu <0;99x<0;99. Poté jsem vyhledával body z intervalu <15;85x<15;85. To pibližn odpovídá ½ bod ležící v tomto intervalu ze všech vygenerovaných bod. To samé jsem provedla pro pípad kdy hledaný interval spluje pibližn 1/10 bod. Hledal jsem interval <34;66x<34;66. Zde popsané mení je vyneseno v tabulce. Kde n poet všech bod, p 1/2 hledaný interval je polovina všech bod, p 1/10 hledaný interval je 1/10 všech bod. n 50 100 500 1000 2000 5000 10000 P 1/10 48 85 146 208 296 462 632 P 1/2 88 143 581 1029 2002 4634 8312 Závislosti z tabulky jsou vyneseny do Grafu. p1/10 700 600 500 400 300 200 100 zmená hodnota teoretická hodnota p1/2 9000 8000 7000 6000 5000 4000 3000 2000 1000 0 0 2000 4000 6000 8000 10000 12000 n 0 0 2000 4000 6000 8000 10000 12000 n Graf 6.1-1/10 bud leží v hledaném inervalu Graf 6.2-1/2 bod leží v hledaném intervalu Z graf je velice dobe patrné, že pro menší poet bod ležící v hledaném intervalu má algoritmus skouten logaritmickou operaní složitost. Z Grafu 6.2 je patrné, že pi velkém potu prvk ležící v hledaném intervalu je složitost lineární. Je to zpsobeno sekvenním vyhledáváním po nalezení hodnoty Ymin v jednorozmrných podstromech. Znamená to, že m << log 2 n. 7. Použitá literatura Hudec, B.: Programovací techniky. Praha, VUT 2001. 14 / 14 Michal Trs