HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Paikkatiedon hallinta ja analyysi 4. Paikkatiedon indeksointi Antti Leino <antti.leino@cs.helsinki.fi> 29. maaliskuuta 2005 Tietojenkäsittelytieteen laitos
Sisältö Tilan täyttävät käyrät ja niihin perustuvat approksimaatiot R-puu johdannaisineen ja suorakulmioapproksimointi Lawder King 2000: Using Space-lling Curves for Multi-Dimensional Indexing Manolopoulos Nanopoulos Papadopoulos 2003: R-trees Have Grown Everywhere Hellerstein Naughton Pfeffer 1995: Generalized Search Trees for Database Systems
Lähtökohta Perinteisessä tietokannassa indeksointi perustuu hakuavaimeen Avainkentässä oltava arvo Eri tietueilla eri avaimet Muillekin kentille voi tehdä indeksejä Arvo voi olla tyhjä Indeksi antaa viitteen osumatietueiden hakuavaimiin Hakuehtona tyypillisesti yhtäsuuruus tai 1-ulotteinen väli
Järjestys Tavanomaisten relaatiotietokannan tietotyyppien arvoalue on täysin järjestetty On olemassa relaatio a, b : (a b) (b a) a, b, c : (a b) (b c) a c a, b : (a b) (b a) a = b Tällaiset ehdot täyttäville tietotyypeille indeksin rakentaminen on ollut tunnettu tehtävä jo pitkään Perinteinen ratkaisu B-puu
B-puu Kohteen löytämiseen riittää tasan yhden polun kulkeminen Kaikki polut juuresta lehtiin yhtä pitkiä Jokainen sivu (juurta lukuunottamatta) aina vähintään puolillaan tietueita Puun koko O(n) Kohteen haku, lisäys ja poisto vievät O(log n) ajan
Ongelma B-puu sopii mainiosti täysin järjestetyn datan indeksointiin Entäpä paikkatieto? Kaksi vaihtoehtoa Laaditaan 2-ulotteiselle tiedolle 1-ulotteinen järjestys Yleistetään B-puu sellaisen aineiston indeksointiin, joka ei ole tällä tapaa järjestetty
Ratkaisu 1: tilan täyttävät käyrät Käyrä, jonka fraktaalidimensio = 2 Jatkuva käyrä, joka täyttää koko (rasteri)avaruuden Ensimmäisenä esitteli Giuseppe Peano (1890) Yleisesti käytössä David Hilbertin (1891) esittämä Verraten yleinen myös Z-käyrä
Miksi tilan täyttävä käyrä? Perusajatus: se linearisoi moniulotteisen avaruuden Tämän jälkeen indeksointi helppoa Toivottavia ominaisuuksia: Lähekkäisyyden säilyminen Helppo muunnos 2- ja 1-ulotteisten koordinaattien välillä Nämä ominaisuudet ikävä kyllä ristiriitaisia Hilbertin käyrä säilyttää lähekkäisyyden melko hyvin Z-käyrällä pisteen sijainti on helposti laskettavissa koordinaateista
Z-järjestys Rasteripisteen järjestysnumero helposti laskettavissa Bittilimitys: otetaan bittejä vuorotellen (binäärimuotoisesta) x- ja y-koordinaatista Esimerkiksi (2 10,1 10 ) = (10 2,01 2 ) 1001 2 = 9 10
Indeksointi z-järjestyksen avulla Indeksointiavaimena näppärä käytää alkupään bittejä Tyhjä jono: koko avaruus Parillinen määrä bittejä = neliö Pariton määrä bittejä = kaksi päällekkäistä neliötä Kaikkia suorakulmioita ei voi esittää
Kohteen approksimointi Aluekohde approksimoidaan niiden Z-arvojen joukkona, jotka yhdessä kattavat kohteen Tässä siis {0011, 001, 0110, 100, 110000} Approksimaation rakeisuus on suoraan sen pisimmän z-arvon pituus
Z-approksimoinin ominaisuuksia Alue, jonka z-arvo on z a sisältyy alueeseen, jonka z-arvo on z b täsmälleen silloin, kun z b on z a :n alkuosa Z-arvojen aakkosjärjestys = niiden osoittamien alueiden järjestys z-käyrällä Peräkkäisten Z-arvojen osoittamat alueet välillä kaukana toisistaan
Kysely z-approksimoidusta indeksistä Tehtävä: haetaan kohteet, jotka ovat hakuehtonelikulmion kattamalla alueella Haetaan indeksisolmut, jotka kattavat hakuehdon pag es ; mat ch next_match(0); while mat ch do pag e {p mat ch p}; pag es pag es {pag e}; mat ch next_match(start(pag e + 1));
Z-alueiden haku Hakuehto: (2 x 5) (1 y 5) Haetaan piste 001001 Haetaan vuorotellen ensimmäinen kulloisenkin indeksiruudun jälkeinen piste, joka on hakualueella Nämä määrittävät indeksiruudut, joita hakualue leikkaa: {0010, 0011, 0110, 10000, 100011, 1001, 1100}
Seuraavan osuman etsintä Z-järjestetyn indeksin algoritmi next_match if ollaan hakualueen ulkopuolella then Etsi merkitsevin muutettava bitti; if tämä bitti on nollattava then (ollaan tässä suunnassa hakualueen yläpuolella) Valitse muista koordinaateista vähiten merkitsevä äskeistä merkitsevämpi bitti, jota voidaan kasvattaa ja silti pysyä hakualueen sisällä; else (ollaan tässä suunnassa hakualueen alapuolella) Valitse tämä bitti; Aseta valittu bitti 1:ksi; Nollaa kaikki vähemmän merkitsevät bitit; Kasvata kunkin koordinaatin tuottamia bittejä, kunnes piste on hakualueella;
next_match-esimerkki (000,000) (010,000) (010, 001) = 001001 (010, 010) = 001100 hakualueella (000,100) (010,100) = 011000 (010,110) (100,000) (100, 001) = 100001 (101,000) (101,001) = 100011 (100, 010) = 100100 hakualueella (110,000) (100,100) = 110000
Hilbertin käyrä Vierekkäiset käyrän pisteet ovat vierekkäisiä myös lähtöavaruudessa Mahdollistaa hiukan monipuolisemman lohkojaon Toisaalta pisteen sijainnin laskeminen monimutkaista Perusalgoritmi puurakenteen avulla
Sijainti Hilbertin käyrällä Laskettavissa puun avulla Puurakenteen käyttö algoritmin osana hankalaa Tasojen määrän lisääminen kasvattaa puun kokoa
Sijaintipuu tilakoneena Sijaintia Hilbertin käyrällä osoittava puu esitettävissä myös tilakoneena Melko pian tilakoneen koko jää puun kokoa pienemmäksi
Sijainti Hilbertin käyrällä current_level 1; current_node root; D 2 ; repeat p x current_level. y current_level; d bits current_node(p); D D.d; if current_level < lea f _level then current_node (p, d); current_level current_level + 1; until current_level > lea f _level;
Esimerkki pisteen sijainnin laskennasta Koordinaattien 1. bitit (1, 0), so. oikea alaneljännes Juurisolmusta saadaan avaimen biteiksi 11 Siirrytään puussa 2. tasolle (1,0):n osoittamaa haaraa Koordinattien 2. bitit (1, 1), so. oikea yläneljännes Tästä solmusta saadaan avaimen biteiksi 00 Ollaan lehtisolmussa, avain 1100 2 = 12 10
Kysely Hilbertin käyrään perustuvasta indeksistä Hakemiston sivut eivät välttämättä nelikulmioita Tehtävänä etsiä ne hakemistosivut, jotka hakualue leikkaa Perusalgoritmi kuten z-käyrän tapauksessa pag es ; mat ch next_match(0); while mat ch do pag e {p mat ch p}; pag es pag es {pag e}; mat ch next_match(start(pag e + 1));
Seuraavan osuman etsintä Hiukan hankalahkoa, koska käyrä erisuuntainen eri puolilla Joka iteraatiokierroksella rajoitutaan pienempään alipuuhun Rajoitetaan etsintä niihin alipuihin, jotka leikkaavat hakualueen Jokaisen iteraatiokierroksen lopussa katsotaan, oliko löydetty osuma aiemmin käyrällä kuin edellisillä kierroksilla löydetty Jos osumia ei löytynyt, kiivetään puussa ylöspäin, kunnes löytyy Jos tämäkään ei auta, seuraavaa osumaa ei ole
next_match Hilbertin käyrälle c_level 1; c_search_space root; repeat X derived_key(c_sear c h_spac e, c_pag e_ke y); * Y min(der i ved_ke y(r)) R = quadrant(c_search_space,?) R c_quer y_reg i on Y X; c_search_space quadrant(c_search_space,y ); c_quer y_reg i on c_quer y_reg i on c_search_space; next_mat ch next_mat ch.y ; if X = Y then if c_quer y_reg i on = c_search_space then return c_pag e_ke y; else if c_quer y_reg i on = c_search_space then return(next_mat c h täytettynä nollilla); else return(min(derived_key(p c_quer y_reg i on))); c_level c_level + 1; until c_level > lea f _level;
next_match: jatkoa Edellisen sivun algoritmissa monimutkainen osa Y min(d er i ved_ke y(r)) R = quadrant(c_sear ch_spac e,?) R c_quer y_reg i on Tähän sisältyy Y X ; c_sear ch_spac e:en kohdistuva binäärihaku Sen niiden osien muistiinmerkitseminen, joihin voi jatkossa palata Tarvittaessa ja mahdollisuuksien mukaan palaaminen ylemmälle tasolle return( ), jos palaamiseen olisi tarvetta muttei mahdollisuuksia
next_match: esimerkki Ensimmäinen osuma: Löydetään vasen alaneljännes: Y = 00 Sen oikea yläneljännes: Y = 10, next_mat ch = 0010 Tämä sisältyy kokonaan hakualueeseen: next_mat ch = 001000 2 = 8 10 Osuma sisältyy sivuun 1, joka käsittää Hilbertin käyrän pisteet 017