Syntax highlighting of Archiv/Implementace databázových systémů/RTree

{{Zkazky|
* '''R-stromy''' - ''Napsal jsem, k čemu jsou dobré, definici a štěpení uzlů dle Guttmana a Greeneové. Dále jsem se zmínil o některých variantách R stromů. Zkoušející se pak jen zeptali na pár otázek.''

* '''R-Stromy (Pokorný)''' - ''Zadefinovať, k čomu slúžia, nákres, štiepenie Gutmann, Green. Rozhovor pokračoval k MOO, MOK - aproximáciám, aké sú výhody jednotlivých prístupov - náročnosť uloženia vs. schopnosť aproximácie. Žiadne detaily, stačilo rozumieť. R+ stromy som len popísal kritériá výberu osi a distribúcie, vravel som, že to kludne na papier dopíšem, ale Pokorný to zjavne nevyžadoval.''

* '''R-stromy (Skopal)''' - tuhle otazku jsem tak nejak cekal :-) Bohuzel pan Skopal zkousi pro me dost neprijemnym stylem .. po prvni vete vas dokaze zaskocit nejakou treba i jednoduchou a ne spatne minenou otazkou, na kterou rychle nevite, co odpovedet a pak se do toho tak zamotate, ze zacnete placat nesmysly..on se vas snazi k necemu dokopat, ale kdyz nevite kam presne miri, da se to jen tezko odhadnout..navic z jeho vyrazu nejde vycist, jestli je to jeste v pohode nebo jste na pokraji vyhozeni :-) Nastesti jsem u pana Skopala delal predtim jednu zkousku, tak uz jsem vedel, ze takhle zkousi, ale zas tak zly to neni, jak to v prubehu zkousky vypada...navic me potesilo, ze me nerozebral hned na zacatek uplne a vcas toho nechal.. 
}}
{| class="wikitable" style="float:right; clear:right;" 
! scope="row" colspan="2"| štěpení uzlu R-Stromu m=3, M=8
|-
| scope="row" colspan="2"| [[Soubor:Rtreetable.png]]
|- style="vertical-align:top;" 
| 
dle '''Guttmana''':

'''PickSeeds''': největší nevyužitá plocha B,H=44

;'''∀PickNext'''
[[File:Guttman.png]]
: ⇒ BDIE, FGHCA
| 
dle '''Greene''':
;Pick Axis
*'''PickSeeds''': největší nevyužitá plocha B,H=44
*spočteme normované vnitřní vzdálenosti:
**y: 5/8
**x: 3/8
*vybereme tu s větší normovanou vzdáleností, tedy y
'''Distribute''': setřídíme objekty podle y souřadnice a rozdělíme

[[File:Green.png]]
: ⇒ ABCDE, FGIH
|}

Typické dotazy na prostorová data jsou:
*vyhledej bod v prostoru
*vyhledej oblast v prostoru
*vyhledej okolí oblasti (bodu)
===R-stromy===
💡 obdoba B-stromů pro prostorové objekty (ale hledání může jít současně více cestami)
*∀uzel '''E''' má '''m až M synů''' (až na kořen - má aspoň 2 syny) a platí: '''m ≤ M/2'''
** E.p - '''identifikátor prostorového objektu''' (listy) nebo '''pointer na syna'''
** E.I - '''MBR (minimum bounding rectangle)''' - minimální ohraničující obdélník - MOO (💡 n-dimensionální)
**: 💡 jednotlivé oblasti se mohou překrývat
*všechny cesty v R-stromu jsou stejně dlouhé (listy na stejné úrovni) ≤ logₘ ''n''

'''INSERT''' - štěpení uzlu při jeho ''M''+1 přeplnění (hledám co nejmenší využití prostoru)
;'''Guttman''' 

* '''PickSeeds''' -  vybrat dvojici prvků s největší nevyužitou plochou
💡 napáchaly by největší škodu, pokud bychom je dali do stejné skupiny
* '''∀(zbývající uzel)''' '''PickNext''' - postupně k nim přiřazujeme zbylé prvky aby přírustek nev.plochy byl co nejmenší 
**|přírustek k původnímu MBR 1.skupiny pomocí dalšího uzlu - přírustek pův. MBR 2.skupiny pomocí stejného uzlu| 
** vybereme maximální rozdíl (💡 přidání do op. skupiny by napáchalo největší škodu) 
'''Greenová''' (snažíme se odstranit překrytí listů - při štěpení vyberem jednu z os)
;'''ChooseAxis'''
* '''PickSeeds''' - z Guttmana
* ∀ osu a MBR(2 prvků) spočti maximální normalizovanou vzdálenost (💡 vnitřní vzdálenost vydělím hranou MBR 2 prvků v dané ose)
*: → vyberu osu s největší normalizovanou vzdáleností
*'''Distribute''' - větší půlka ⌈(M+1)/2⌉ se hodí do jednoho uzlu a zbytek do druhého uzlu.
:💡 ne vždy je nalezena vhodná osa – může vést ke špatným výsledkům
===R+-stromy===
{{TODO|projit}}
* přiřazuje prostorové objekty do všech listů, do kterých zasahují (je tedy duplikován)
* vnitřní (nelistové) MOO uzly se nepřekrývají
* u uzlů není zaručena minimální zaplněnost
* větší (objekt může být ve více uzlech) a náročnější na údržbu než R-stromy

===R*-stromy===
{{TODO|projit}}
*více optimalizačních ktitérií oproti R-stromům – uvažují také okraj a překrytí
*rozdíl od R-Stromů: algoritmem na rozdělení přetečené stránky, bere v úvahu více trideni podle os, při přetečení provádí reinsertování, taky algoritmem na hledání listu pro insert (overlap místo nejmenšího rozšíření)
*při INSERTu se v předposlední úrovni vybírá takový list, kde když bude, tak celá ta množina bude mít nejmenší překrytí s ostatními množinami (dalšími listy), ve vyšších úrovních se vybírá uzel, který způsobí nejmenší zvětšení prostoru (jako u R-stromů)
*štěpení
**pro každou osu se prvky setřídí podle souřadnice x1 a x2
**pro každé setřídění jsou vytvořeny všechny kombinace rozdělení prvků tak, aby v každé skupině bylo aspoň m prvků (tzn. m prvků bude v první a druhé skupině vždy stejných, zbylé se rozdělí dle uspořádání)
**pro každou takovou distribuci se spočítají
***h-objem (součet objemů jednotlivých skupin)
***h-okraj (součet okrajů – ve 2D obvod, ve 3D ohraničující –plocha – skupin)
***h-překrytí (překrytí první a druhé skupiny)
**	pro každou osu se spočítá S (suma h-okrajů všech distribucí v dané ose) a vybere se osa s nejmenším S
**	v této ose se vybere distribuce, která má nejmenší h-překrytí, v případě rovnosti rozhoduje menší h-objem


{{collapse|1=další stromy|2=
další:
;radix (r^d) stromy
*uvažujme r=2, d=2 rozděluje plochu na 4 čtverce a každý čtverec je reprezentován uzlem stromu, a rekurzivně je dále členěn. Objekt může být uložen v mnoha listech. Strom může být nevyvážený.
*	vhodné pouze pokud se celé vejdou do vnitřní paměti
*organizace prostoru – číslování do šířky, adresování cestou, z-uspořádání (peanova křivka), naivní uspořádání, spirálové uspořádání, hilbertova křivka (všechny po sobě jdoucí buňky jsou sousední v prostoru) – volbu organizace je vhodné přizpůsobit datům, pro čtvercové oblasti je vhodné spirálové uspořádání, pro obdélníky je vhodné naivní uspořádání ve směru delší strany
;K-D-stromy
*binární strom – ve vnitřím uzlu je osa podle níž se prostor půlí, v listech jsou B-kostky
;Buddy-stromy
*nepokrývají (nutně) celý prostor
*vhodné pro ukládání bodů (pokud chci složitější struktury je potřeba zdvojnásobit dimenzi a ukládat zvlášť dolní a zvlášť horní mez)
**při slévání se slévají dvě stránky, ale výsledné dělení musí být opět B-dělením (lze k němu dojít pomocí půlení prostoru) – slévat lze kostky, které jsou v poloze „buddy“ – tj. ohraničující kostka sjednocení těchto kostek má s ohraničujícími kostkami ostatních kostek v uzlu prázdný průnik
;prostorové spojení
**motivace: najdi všechny lesy v daném městě – uvažujme jakoby databázi s tabulkou lesů (id_lesu, název_lesu, území) a tabulkou města (id_města, název, území), snahou je vytvořit predikát, který bude fungovat jako spojení v relačních DB – nejčastěji by měl vracet dvojice, které mají neprázdný průnik (ale lze uvažovat i jiné predikáty)
**výsledkem spojení může být buď konkrétní průnik, nebo pouze ukazatele na překrývající se objekty (tzv. Id-spojení)
**prostorové spojení pomocí hnízděných cyklů
***obdoba spojení pomocí setřízení a porovnávání jako u relačních DB není možná prostorové objekty nelze jednoznačně uspořádat do 1 dimenze, jedinou variantou jsou tak hnízděné cykly (porovnají se všechny prvky z tabulky A se všemi z tabulky B) – to je náročné a tak se pokusíme optimalizovat:
****spočítá se spojení MOO těch objektů (kandidáti na správné hity)
****pomocí kvalitnějších aproximací se provede filtrace na jisté hity, jisté chybné hity a nerozhodnuté dvojice
****nerozhodnuté dvojice se rozhodnou pomocí přesné geometrie
***prostorové spojení pomocí z-uspořádání
****vytvoří se mřížka, políčka se očíslují pomocí z-uspořádání (Peanova křivka), objekt je potom aproximován množinou z-hodnot, při porovnávání objektů lze hledat z-hodnotu jednoho objektu mezi z-hodnotami druhého objetku
***prostorové spojení pomocí R-stromů
****nechť jsou prostorové relace uloženy v R-stromech, postupným procházením stromů je možné eliminovat řadu uzlů, protože mají prázdný průnik
***zametací algoritmus
****dvě prostorové relace (uvažujme 2D, obdélník, ev. MOO), každý obdélník je definován svým levým dolním a pravým horním rohem, provedu projekci do jedné osy, najdu obdélník s nejmenší x1 (z obou relací), nechť je to obdélník S1, nyní hledám všechny obdélníky z druhé relace (R), které mají ri.x1 menší než s1.x2. Pokračuji výběrem dalšího obdélníku, ale S1 již neuvažuji (nebude mít průnik s žádným dalším obdélníkem)
}}

{{zdroje|
* zapsáno podle: http://siret.ms.mff.cuni.cz/members/hoksza/lectures/ndbi003
*''viz [[wen:R-Tree]]''
}}