Vous êtes sur la page 1sur 19

Ortogonalni opseg pretrazivanja

Upiti baza podataka Na prvi pogled cini se da baze podataka ima veoma malo dodorinih tacaka sa geometirjom. Ipak mnoge vrste pitanja od sada zvani upiti o podacima u bazi podataka mogu se prestaviti pomocu geometrije. U tom cilju trasvormisacemo zapis baze podataka u tacke koje se nalaze u multidimenzionalnom prostoru i transformisacemo sapise o upitima na skupu tacaka. Demonstiriacemo na ovom primjeru

Slika 5.1 Uzecemo u obzir da je baza podataka za licnu administraciju. U takvoj bazi se cuva ime , adresa, datum rodjenja, plata, itd od svakog zaposlenog. Tipican upit bi mogao biti izvjestaj o svim zaposlenim radnicima koji su rodjeni uizmedju 1950 i 1955 i koji zaradjuju izmedju 3000 i 4000 mjesecno. Da bi se ovo forimulisalio kao geometriski problem mi ce mo prestaviti cvakog zaposlenog kao yacku y ravni. Prva kordinata tacke ce biti datum rodjenja prestavljena kao intedzer x. 10000X godina +100x mjeseci +dan a druga kordinata je mjesecna plata. Ta tacka takodje sadrzi informaciju kao sto je adresa u unae zaoposlenog. Geometriski upit glasio bi. Obuhvati sve tacke koje su im prve kordinate izmedju 19 500 000 i 19 559 990 i druge kordinate izmedju 3000 i 4000.Slika 5.1 Sta ako unesemo jos informacija o boroju djece svakog zaposlenog upit bi glasio izvjestaj bi glasio Obuhvati sve tacke koje su im prve kordinate izmedju 1950 i 1955 i druge kordinate izmedju 3000 i 4000 i imaju izmedju 2 ili 3 djeteta. U ovom slucaju mi prestavljamo zaposlene kao tacke u trodimenzionalnom prostoru: prva kordinata prestavlja datum rodjenja druga platu a treca broj djece.

Generalno ako smo zainteresovani za resavanje upita u x polja zapisa baze mi cemo trensformisati evidenciju tacaka u x-dimenzionalni prostor.

5.1 Jednodimezionalna pretraga


Pre nego sto pokusamo da se pozabavimo dodimenzionalnom ili vecom pretragom hajde da se pozabavimo jednodimezionalnom pretragom. Podaci koje su nam dati je skup tacaka u jednodimezionalnom prostoru drugim rijecima data nam je skup realnih brojeva. Upit trazi tacke unutar 1dimenzionalnog prostora. Drugim rijecima trazimo tacke u intervalu [x:x']. Neka je P={p1,p2,...,pn} dat skup tacaka na realnoj pravoj. Mozemo rijesiti 1-dienzionalni pretragu efektivno pomocu skoro poznatih struktura podataka: Uravnotezeno binarno drvo pretrage. Ova solucija ce nemoze generalizovati pa da se primjeni na vece dimenzije. Lie od T pohranjuju take od P, unutranji vorovi od T pohranjuju odvjajue vrednosti da novode pretragu. Oznacavamo odvajajuce vrednosti pohranjene u voru V sa xv. Pretpostavljamo da lijevo pod drvo vora V sadri sve take manje ili jednake xv i da desno pod drvo sadri sve take striktno vee nego Xv Da navedmo take u upitu polja/dometa [x : x] radimo sledee. Traimo sa x i x u T. Neka i bidi dve liske gdje predraga zavrava (tim redom). Onda take u intervalu [x : x] su one pohranjene u liskama izmedju i plus moguce, taka pohranjena u i taka pohranena u . Kada pretraujemio unutar intervala [18:77] u drvetu sa slike 5.2, npr., moramo da navedemo sve take pohranjene u tamnosivom liu, plus take pohranjene u listu . Kako moemo pronai listove izmedju i ? Kako slika 5.2 predlae, to je lie odredjnih pod drveta izmedju puteva pretrage do i . (na slici 5.2, ova pod drvea su tamno siva, gdje su vorovi na putevima za pretragu svjetlo siva.)

Slika 5.2

Preciznije, pod drvea koja odaberemo su ukorenjena u vorovima v izmedju dva pretrazna puta iji su roditelji na putevima pretrage. Da bi se pronali ove vorove prvo traimo vor vsplit (djeljenje) gdje se putanje do x i x razilaze. Ovo se postie na sledei nain. Neka lc(v) i rc(v) oznaavaju lijevi i desni potomak, tim redom od vora v. FINDSPLITNODE(T,jc,jc') Input. A tree T and two values x and x' with x ^ x1. Output. The node v where the paths to x and x1 split, or the leaf where both paths end. 1. v - root(T) 2. while v is not a leaf and (x' <= xv or x > xv) 3. do if x'<=xv 4. then v <- lc(v) 5. else v <- rc(y) 6, return v

Poevi od vsplit tada nastavljamao pretranim putem od x. U svakom voru gdje put ide lijevo, navodimo svo lie u desnom pod drvetu, zato to je ovo pod drvo izmedju dva puta pretrage. Slino pratimno put od x i navodimo liske u lijevom pod drvetu vorova gdje put ide desno. Konano, moramo da provjerimo take pohranjene u liskama gdje se putevi zavravaju; one jesu ili nisu u dometu [x : x]. Sledee emo opisati algoritam upita u vie detalja. On koristi podrutinu i zove se ReportSubtree, koji prolazi pod drvea ukorjenjena u dataom voru i navodi take pohranjene u njenim liskama. Sobzirom da je broj unutranjih vorova biloo kog binarnog drveta manji nego broj njegovog lia, ova podrutina trai koiinu vremena koja je linearna u broju navedenih taaka.

Prvo moramo dokazati tanost algoritma. Lema 5.1 algoritam 1DRangeQuery prijavljuje tano one take koje lee u dometu upita. Dokaz. Prvo mormao pokazati da bilo koja navedena taka p lei u dometu upita. Ako p je pohranjeno u listu gdje je put do x ili x zavrava onda p je provjereno eksplicitno za ukljuenje u domet upita. Inae, p je navedeno u pozivu do ReportSubtree. Pretpostavimo da je ovaj poziv uinjen kada smo pratili put do x. Neka v bude vor na putu takvom da je p prijavljeno u pozivu od ReportSubtree(rc(v)). Zato to v i stoga i rc(v) lee u lijevom pod drvetu vsplit, imamo p <= xv split. Zatop to put pretrage od x ide desno u vsplit ovo znai da je p < x. Sdruge strane, put pretrage od x ide lijevo od v i p je u desnom pod drvetu od v, tako da je x < p. Iz toga slijedi da je p [jc : x'}. Dokaz da p lei u dometu kada je navedeno dok pratimo put ka x je simetrian. Preostaje nam da dokemo da je svaka taka p iz dometa prijavljena. Neka bude list gdje je p pohranjeno i neka v bude najnii predak od da je posjeen od strane algoritma upita. Mi tvrdimo da je v = . to implicira da je p prijavljeno ili navedeno. Pretpostavimo kontradikciju da v (=/nije jednako) . Primjetimo da v nemoe biti vor posjeen u pozivu od REPORTSUBTREE, zato sto su svi potomci takvog vora posjeeni. Odatle v je ili na pretranom putu ka x ili ka pretranom putu ka x ili oboje. Zato to su sva tri sluakja slina, uzimamo u obzir samo trei sluaj. Pretpostavimo prvo da je u lijevom pod drvetu od v. Onda put pretrage od x ide desno ka v (inae v ne bi bilo najnii posjeeni predak). Ali ovo implicira da je p < x . Slino, ako je u desnom pod drvetu od v, onda put od x ide lijevo u v i p > x. U oba sluaja , pretpostavka da p lei u dometu je kontradiktoran sto je trebalo i dokazati. Sada skrecemo svoju panju uinku strukture podataka. Zato to je uraavnoteena pretraga binarnog drveta ona koristi O(n) pohrane i moe biti sagradjena u O(nlogn) vremenu.Sta je sa vremenom upita? U najgorem sluaju sve take bi mogle biti u dometu upita. U ovo sluaju vreme upita e biti (n), to se ini loim. Zaista, nemamo potrebe za bilo kojom strukturom podataka da postignemo (n) vreme upita; jednostavno obiljeavajui sve take protiv dometa upita vosi ka istom rezultatu. Sa druge strane, vreme upita od (n) nemoe biti izbjegnuto kada trebamo da navedemo sve take. Zbog toga emo dati vie preradjenu analizu vremena upita. Preradjena analiza uzima ne samo n, broj taaka u setu p, uobzir, ali takodje i k, broj navedenih taaka. Drugim rijeima pokazacemo da je algoritam upita output-sensitive, koncept kojim smo se sreli u poglavlju 2.

Prisjetimo se da je vreme potroseno u pozivu ka REPORTSUBTREE linearno u broju prijavljenih taaka. Odatle, ukupno vreme potroeno u svim takvim pozivima je O(k). Preostali vorovi kojiu su posjeeni su vorovi na putu pretrage od x ili x. Zato to T je urovnoteeno/balansirano, ovi putevi imaju duinu od O(log n). Vreme koje smo potroili nba svakom voru je O(1) tako da ukupno vreme potroeno u ovim vorovima je O(log n ), to daje vreme upita od O(log n + k). Sledei teorem rezimira rezultate za jednodimezionalnu pretragu Teorema 5.2 Neka p bude skup od n taaka u jednodimezionalnom prostoru. Skup p moe biti pohranjen uravnoteenom u trvetu binarne pretrage, koja koristi O(n) pohrane i ima O(n log n) vremena izgradnje, takvog da take u dometu upita mogu biti navedene u vremenu O (k+ log n), gdje je k je broj navedenih taaka.

5.2 Kd-Drvo
Sada idemo ka dvodimezionalnim kvadratim dometima problema pretrage. Neka P bude skup od n taaka u ravni. U ostaku ovog djela pretpostaviemo da nijedne dvije take u P imaju istu x kordinatu. I da ni jedne dve tacke nemaju istu y kordinatu. Ova ogranienja nisu mnoga realistina, posebno ne ako take prestavljaju zaposlenike a kordinate siu stvari tipa plata ili broj djece. Srecom , ogranienja mogu biti prevazidjena sa lijepim trikom koji mo opisati u djelu 5.5. Dvodimezionalna pravoguaonu dometni upita na P trazi za take od P koje lee unutar provougaonuka [x : x1] x [\y : y']. Taka p := (px,Py) lei unutar ovog pravougaonika ako I samo ako

px [x : x1] i py[\y : y'] Mogli bi smo rei da dovdimezionalni upit se sastoji od dva jednodimezionalna pod upita jedan na x kordinate i jedan na y kordinati. U prijanjim djelovima U dvodimezionalnom slucaju svaka dacka ima dve vrednosi koje su bitne : njihovu x i y kordinatu. Odatle prvo djelimo x kordinatu zatim na y kordinatu onda opet na x kordinatu itd Preciznije, proces ide na sledeci nain. U korjenu djelimo skup P sa vertikalnom linije l u dva pod skupa ugrubo iste veliine. Linija razdvajanja je pohranjena u korjenu. Plijevo, podskup taaka na lijevoj strani linije razdvajanja je pohranjeno u lijevom pod drvetu, a Pdesno podskup koji se nalazi desnoij strani linije razdvajanja. Kod lijevog potomka od korijena podjelicemo Plijevo u dva pod skupa sa horizontalnom linijom take ispod nje ili na njoj su pohranjene u ljevom pod skupu lijevog potomka, a take iznad linije su pohranjene u desno pod drvo. Lijevi potomak sam pohranjuje liniju razdvajanja. Slino, skup Pright je podjeljeno sa horzontalnom linijom u dva pod skupa koji su pohranjeni u lijevom i desnom pod drvetu desnog potomci. Dalje potomke korjena opet djelimo vertikalnoim linijom. Upste, dijelim sa vertikalnom linijom u corovima cija je dubina parna i dijelimo sa horiyontalnim linijama cija dubina je neparna. Slika 5.3 pokazuje kako se radi djeljenje i kako odgovarajuce binarno drvo izgleda. Ovakvo drvo se naziva KdDrvo.

Slika 5.3 Moemo napraviti napraviti Kd drvo sa rekurzivnom procedurom opisano ispod . Ova procedura ima dva parametra: Skup taaka i broj(integer). Prvi parametar je skup za koji elimo da sagradimo Kd-drvo; u poetku ovo je skup P. Drug parametar je dubina rekurzije ili drugoim reima dubina korjena pod drveta od kog pozivamo rekurzivno gradjenje. Parametar dubine je 0 u prvom pozivu. Dubina je bitna za to, kao sto je objasnjeno gore, sto objenjava da li moramo razdvojiti sa vertikalnom ili horizontalnom linijom. Procedura vraca korijen od Kd-drveta.

Algoritam koristi skup tacaka na razdvajajucoj liniji ona koja utvrdjuje sredinu x ili y kordinate pripada podskupu sa leve ili ispod linije razdvajanja. Da bi ovo radilo kako treba, sredina skupa od n trebala bi biti definisana [n/2] najmanji broj. To znaci da sredina od dve vrednosti je manji broj sto osigurava zavrsetak algoritma. Prije nego sto dodjemo do upita algoritma, hajde da analiziramo konstruktorsko vreme od dvodimezionalnog kd-drveta. Najskuplji korak jeste do da se izvrsava na svakom rekuryivnom poyivu nalazenja razdvajajuce linije. To zahtjeva odredjivanje srednje x kordinate ili srednje y kordinate u zavisnosti da li je dubina parna ili neparna. Nalazenje sredine moze biti gotovo u linearnom vremenu. Linearno vreme algoritma za nalazenje sredine je kompliovano. Bolji pristup je unapred sortirati skup tacaka na x i y kordinati. Parametari su postavljeni P se sada prenosi u obliku dve sortirane liste, jedna na x kordinatama druga na y kordinatama. Imajuci u vidu da su sortirane liste , sada je lakse naci sredinu x kordinate (ako je dubina parna) ili sredinu y kordinata (ako je dubina neparna) u linearnom vremenu. Takodje je lakse napraviti sortiranu listu od dobijene liste za dva rekurzivna poziva u linearnom vremenu. Otuda vreme izgradnje T(n) zadovoljava ponavljanje

koji resava O(n log n). Ovo je granica suma vremena koja se potrosi na sortiranjee tacaka na x i y kordinati.

Granica kolicine prostora za skaldistenje svakog lista Kd-trveta je razlicita tacka od P. Dakle postoji n lisca. Zato sto je Kd binarno drvo i svaki list i interni cvor koristi O(1) skladista to implicira da ukupan iznos skladista je O(n). Ovo dovadi do sledece leme. Lema 5.3 Kd-drvo sa skup od n tacaka koristi O(n) skladista i moze da se napravi u O(n log n) vremenu. Sada cemo se okrenuti ka algoritmu upita. Razdvajajuca linija particije korjena ravni JE smjestena u dve

polovine ravni. Tacke u ljevoj polovini ravni su smjestene u lijevo pod drvo i tacke u desnoj polovini ravni su smjestene u desno pod drvo. U izvesnom smislu lijevo djete korjena odgovara odgovara lijevoj polovini ravni i deno djete korjena odgovara denoj polovini ravni. () I druga cvorista u kd-drvetu odgovaraju takodje regiji ravni. Lijevo djete lijevog djeteta od korjena odgovara granicnoj regiji desno od razdvajajuce liije smjestene u korjenu i ogranicen odozgo od linije razdvajanja lijevog djeteta od korjena. U principu regija koja odgovara cvoru v je pravougaonik koji moze biti neogranicen sa jedne ili vise strana. Granica razdvajajuce linije smjestena na predacima (ancestors) od V vidi sliku 5.4. Oznacimo regiju koja odgovara cvoru

slika 5.4

v od region(v). Regija korjena Kd-drveta je jednostavno cijela ravan. Primjetimo da je tacka pohranjena u pod drvetu ukorenjena u cvoru v ako i samo ako lezi u region(v). Npr. Pod drvo cvora v u slici 5.4 pohranjuje tacke prikazane kao crne tacke. Stoga moramo da pretrazimo pod drvo ukorjenjeno u v samo ako je upit pravougaonika preseca region(v). Ova obzervacija vodi do sledeceg algoritma upita: prolazimo Kd-drvetom ali posjecujemo samo cvorove cija regija je presjecena pravougaonikom upita. Kada je regija u cjelom sadrzana u pravogaoniku upita mozemo prijaviti sve tacke pohranjene u njegovom pod drvetu. Kada prolazak dosegne list moamo da provjerimo da li je tacka koje je pohranjena u listu sadrzana u regiji upita i ako je tako prijaviti je. Slika 5.5 prikazuje algoritam upita. (Primjetmo da kada kd drvo sa slike 5.5 nije moglo biti konsturisano algoritmom BUILDKDTREE; tezisna linije nije uvjek odabrana kao vrjednost dijeljenja) Sivi cvorovi su posjecenji kada izvrsimo upit nad sivim pravougaonikom. Cvor oznacen sa * odgovara regiji koja je kompletno sadrzana u pravougaoniku upita; Na slici ova pravougaona regija je prikazna tamnije. Odatle, tamono svio pod drvo ukorjenjeno u ovom cvoru je predjeno i sve tacke sadrzane u njemu su prijavljene. Drugi list koji je posjecen odgovara regijama koje su samo djelimicno unutra upitnog pravougaonika. Odatle, tacke pohranjene u njima moraju biti testirane za ukljucenje u upitni domet; ovo rezultuje u tome da tacke p6 i p11 su prijavljene a tacke a tacke p3, p12 i p13 nisu prijavljene. Algoritam upita je opisan sledecom rekurzivnom procedurom, koja uzima za argumente

slika 5.5 korjen Kd drveta i upit dometa R. Ona koristi podprogram (podrutina) REPORTSUBTREE(V), koji prolazi pod drvo ukorjenjeno u cvoru v i prijavljuje svetacke pohranjene u njhovom liscu/liskama. Prisjetimo se da lc(v) i rc(v) oznacavaju lijevo dijete od cvora v.

Glavni test sto algoritam upita izvodi je da li upit dometa R presjeca regiju koja odgovara nekom cvoru v. Da bi bili u mogucnosti da uradimo ovaj test mozemo racunati region(v) za sve cvorove v tokom predprocesne faze i pohraniti ih, ali ovo nije neophodno: Moze se odrzati trenutna regija kroz rekurzivne pozive koristeci linije pohranjene u unutrasnjim cvorovima. Npr., regija koja odgovara lijevom djetetu cvora v na parnoj dubinu moze biti izracunata iz region(v) ovako.:

gdje l(v) je razdvajajuca linije pohranjena u v i l(v)left je polu ravan na lijevo od i ukljucujuci l(v). Primjetimo da algoritam upita prikazan iznad nikad ne predpostavlja da upit dometa R je pravougaonik. Zaista, ovo radi za svaki drugi domet upita takodje. Sada cemo analizirat vreme koje upit sa dometom pravougaonika zahtjeva Lema 5.4 Upit sa aksizom paralelnom pravougaoniku u Kd-drvetu pohranjujuci n tacaka moze biti izvrsen u vremena gdje je k broj prijavljenih tacaka.

Dokaz. Prvo umimo u obzir da vreme za prolazak pod drveta i prijavljivanje tacaka pohranjeno u njigovim liskama je linearno broju prijavljenih tacaka. Odatle, ukupno vreme potrebno za prolazenje pod drveca u koracima 4 i 8 je O(k), gdje je k ukupan broj prijavljenih tacaka. Preostaje nam da vezemo broj posjecenih cvorova algoritmom upita koji nisu u jednom od predjenih pod-drveta.(Ovo su svjetlo sivi cvorovi na slici 5.5) Za svaki takav cvor v uptini domet pravilno presjeca region(v) to jest region(v) je presjecena ali nije potpuno sadrzana u dometu. Drugim recima granica dometa upita presjeca region(v) da bi analizirali broj takvih cvorova povezacemo broj regija presjecenih bilo kojom vertikalnom linijom. Ovo ce nam dati gornju granicu na broj podrucija koja presjecaju lijevu ui desnu granicu upitnog pravougaonika. Proj regija presjecenih donjim i gornjiom ivicom dometa upita moze biti povezana na isti nacin. Neka l bude vertikalna linija i neka T bude Kd-drvo. Neka l(root (T)) bude linija razdvajanja pohranjena u korijenu kd-drveta. Linija l presjeca ili regiju lijevo od l(root(T)) ili regiju desno l(root(T)) ali ne i oboje. Ova abzorvacija se cini da pokazuje da Q(n), broj brjesecenih regija u Kd-drvetu pohranjujuci skup od n tacaka, zadovoljava ponavljanje Q(n)=1+ Q(n/2). Ali ovo nije istina, zato sto linije razdvajanja horizontalne u djeci korjena. Ovo znaci da ako linija l presjeca na primjer region(lc(root(T))), onda ce uvjek presjecati regije odgovarajuce oboma od djece lc(root(T)). Odatle rekurzivna situacija koju dobijamo nije ista kao orginalna situacija i ponavljanje od gore nije tacno. Da prevazidjemo ovaj problem moramo da se osiguramo da rekurzivna situacija je precizno ista kao prvobitna situacija: Korjen pod drveta mora sadrzavati vertikalnu liniju razdvajanja. Ovo nas vodi da redefinisemo Q(n) kao broj prjesecenih regija u Kd-drvetu pohranjujuci n tacke ciji korjen zadrzi vertiklanu liniju razdvajanja. Da bi smo napisali ponavljanje za Q(n) moramo sada da idemo dva koraka u dubinu drveta. Svaki od cetiri cvora na dubini dva u drvetu odgovara regiji koja sadrzi n/4 tacaka. (Preciznije, regija moze sadrzavati najvise [[n/2]/2]=[n/4] tacaka, ali asimptotski ovo ne utice na rezultat od ponavljanja ispod.) Dva od 4 cvora odgovaraju presjecenim regijama, tako da moramo da brojimo broj presjecenih regija u ovom pod drvecu rekurzivno. Sta vise, l presjeca regiju korjena i jednog od njegove djece. Odatel Q(n) zadovoljava pojavljivanje

Pojavljivanje se rijesava do

Drugm recima svaka vertikalna linija presjeca

regija u kd-drvetu. Na slican nacin mozemo

dokazati da ukupan broj regija presjecenih horizontalnom linijom

ukupna broj regija

presjecenih granicom od pravougaonog upita dometa je povezan sa

takodje.

Analiza vremena upita koji smo dali gore je prilicno pesimisticna. Povezali smo broj regija presjecenih sa ivicom pravougaonog upita sa brojm regija koji presjecaju linijama kroz njih. U mogim prakticnim situacijama domet ce biti mali. Kao rezultat ivice su kratke i presjecace mnogo manje regija. Npr. Kada trazimo unutar dometa [x:x]x[y:y] ovaj upit efikasno pita da li tacka (x y) je u skupu - vreme upita je povezano sa O(log n ). Sledeci teorem sumira ucinak Kd-drveta. Teorema 5.5 Kd-drvo za skup P od n tacaka u ravni koristi O(n) prostora i moze se izgraditi u O(n log n ) vremenu, a pravougaoni upit dometa za Kd-drvo uzima vremena gdje je k broj od prijavljenih tacaka. Kd-drvo moze biti koristeno i za tacke smjestene u trodimezionalnom i vecem prostoru. Algoritam konstrukcije je veoma slican planiranom slucaju: U korjenu mi cemo podjeliti tacke u dva pod-drveta priblizno iste velicine iznad vertikalne ravni na x1 osi. Drugim rijecima korjen tacke je podjeljen na prve kordinate tacaka. Djeca od korjena djele se na druge kordinate tacaka, a cvorista na dubini dva trece kordinate i na kraju do dubine d-1 gdje je su poslednje koridnate. Na dubini d mi pocinjemo opet sve ispocetka, djeljenjem prve kordinate.Rekurzija se zaustavlja kada je samo jedna tacka ostala koju smjestamo kao list. Zato sto je d-dimazionalno kd-drvo za skup od n tacaka binarnog drveta sa n lisca koristi se O(n) prostora. Knstrukcisko vreme je O(n log n). Cvorista u d-dimezionalnom kd-drvetu prestavlja regije u ravni. Algoritam upita posjecuje ta cvorista cije regije pravilno presjecaju upit dometa i prolaz kroz pod-drveta koje su ukorjenjene u cvoristima te regije i upotpunosti sadrzana dometu upita. Moze se pokazati da je vreme upita ograniceno

5.3 Drvo opsega Kd-drvo gdej je opisano u prethodnoj sekciji ima vrijeme upta. Dakle kada je broj prijavljenih tacaka mail vreme upita je relevantno velika. U djelu gdje se upisuju drugi podaci strukture pravougaonog dometa upita duzine drveta ima bolje upitno vreme

Cjena koju moramo paltiti za ovo poboljsanje je povecanje prostora od O(n) za Kd-drvo do O(nlog n) za drvo opsega.Kao sto smo posmatrali u u 2-dimezionalnom upitu dometa je u sustini sastavljen od dva jednodimezionalna pod drveta jedno na x kordinati tacaka a drugo na y kordinati. Ovo nam daje ideju da razdvojimo naizmjenicni skup tacaka na x i y kordinate, vodeci do Kd-drveta. Da bi ste dobili drvo opsega trebamo posmatrati na drugaciji nacin. Neka P bude skup od n tacaka u ravni koje zelimo da pred obradimo za pravougaoni upitni opseg. Neka Ix: x'] x [y: y'] bude upitni opseg. Prvo dadnemo paznju na trazenje tacaka cije x kordinate leze u Ix: x'], interval x od pravougaonog upita ,a kasnije ce mo se pobrinuti za y kordinate. Ako se samo brinemo o x kordinatama onda je to jednodimezionalni upit. U poglavlju 5.1 vidjeli smo odgovor na takav upit.: sa binarnim drvetom pretrage na sackama na x kordinati. Algoritma upita ide otprilike ovako. Pretrazimo sa x i x' drvo sve dok nedobijemo cvoriste Vsplit gdje se put pretrage razdvaja. Od lijevog djeteta od Vsplit mi nastavljamo pretragu sa x i na svaki cvor v gdje je put pretrage od x ide lijevo mi saopstavamo da su to sve tacke pod drveta od v. Slicno ovome mi nastavljamo pretragu sa x' na desnom djetetu od Vsplit i svaki cvor v gdje put pretrage x' ide deno mi prestavljamo da su to tacke od lijevog pod drveta od v. Konacno provjeravomo lisce i

gde postoje dvaputa do kraja, da se vidi da li sadrze tacku u opsegu. U stvari mi smo izbrali kolekciju od O(log n ) pod drveta koja koja sadrzi tacno tacke koje leze na x intervalu upita pravougaonika.

Kanonski podskup od v nazovimo, podskup tacaka koje su smjestene u listovima pod-drveta ugnjezdenog u cvor v. Kanonski podskup od korjena drveta na primjer je ceo skup P. Kanonski podskup od lisca je jednostavno tacka smjestenau listu. Oznacicemo kanonsko pod-drvo cvora v sa P(v). Upravo smo vidjeli da podskup tacaka x kordinate koji lezi u opsegu upita moze biti izrazen kao nepovezana unija O(log n ) kanonskog pod-drveta; gdje su skupovi P(v) od cvorova v korjeni oznacenih pod-drveta. Mi nismo zainteresovani za sve tacke u takvom kanonskom pod-drvetu P(v) samo zelimo izvjestiti one koje leze na y kordinatama intervala [y: y']. Ovo je takodje jos jedan jednodimezionalni upit koji mozemo rijesiti poduslovom da imamo dostupno binarno drvo pretrage na y-kordinatama tacaka u P(v). Ovo vodi sledece sturkture za prvougaoni opseg upita na skup P od n tacaka u ravni. Glavno drvo je uravnotezeno binarno drvo pretrage T gradeno na x kordinatama tacaka u P. Za bilo koji unutrasni cvor v u T kanonski pod skup P(v)je smjesten u Uravnotezeno binarno drvo pretrage 'Tassoc (v) na y-kordinati tacaka. Cvor v smjesten kao pokazivac korjena od T assco(v) zovemo povezana struktura od v. Ova struktura podataka se nayiva drvo opsega. Slika 5.6 pokazuje strukturu drveta opsega. Strukture podataka gdje cvorovi imaju pokazivace na povezane strukture se cesto naziva vise-stepena struktura podataka. Glavno drvo T se zove prvo-stepeno drvo a povezane strukture drugo-stepeno drvo. Visestepena struktura podataka igra glavnu ulogu u kompjuterskoj geometriju: Vise primjera mozete pronaci u Poglavlju 10 i 16.

Slika 5.6

Drvo opsega moze biti konstruisano sledecim rekurzivnim algoritmom koji prima kao ulaz skup P:={p1,...Pn} tacaka sortirani na x-kordinati i vraca kojen 2-dimenzionalnog drveta opsega T. Kao u prethodnoj sekciji pretpostavimo da dve tacke imaju iste x ili y kordinate. Mi trebamo da se oslobodimo ove pretpostavke u odeljku 5.5

Kada pretrazujemo povezanu strukturu izvjestaj tacaka a ne samo y kordinate. Lema 5.6 Drvo opsega skupa od n tacaka zahtjeva prostor ravni O(nlog n). Dokaz. Tacka p u P je prostor samo ako je u vezi sa strukturom cvorova na putu u T, pred list koji sadrzi p. Otuda za svecvorove u datoj dubini tacka p je smjestena na tacno jednu udruzenu strukturu. Zato sto jednodimezionalno drvo opsega koristi linearni prostor iz toga sledi da udruzene strukture od svih corova na bilo kojoj dubini od T sajedno koriste O(n) prostor. Dubina T je O(log n) . Dakle ukupan iznos prostora zahtjeva ogranicnje od O(n log n). Algoritam BUILD2DRANGETREE kao sto je opisano ne donosi optimalnu izgradnju O(n log n). Da bi dobili ovo vreme moramo biti vrlo pazljivi. Izgradnja binarnog drveta pretrage na ne sortiran skup od n kljuceva uzima O(n log n) vremena. Ali mi mozemo postici bolje vreme ako tacke u Py presortiramo na y kordinatu. Onda binarno drvo pretrage mozemo izgradjivati odozdo na gore u linearnom vremenu. Tokom algoritma izgradnje mi odrzavamo skup tacaka u dve liste jednu sortiranu na x kordinati i jednu sortiranu na y kordinati. Ovo vreme koje potrosio na cvor u glavnom drvetu T je velicine kakonskog pod-drveta. Ovo implicira da ukupno vreme izgradnje je isto kao kolicina prostora, naime O(n log n). Algoritam upita prvo uzma O(log n) kanonske podskupove koji zajedno sadrze tacke cije x kordinate leze u opsegu [x:x']. Ovo moze biti zavrseno sa jednodimezijonalnim algoritmom upita . Od tih pod drveta mi dobijamo izvjestaj o tackama cije y kordinate leze na opsegu [y:y']. I za ovo mi koristimo jednodimezionalni algoritam upita. Vreme je primjenjeno u povezanu strukturu prostora u izabranom pod drvetu. Prema tome algoritam upita je je prakticno isto sto jednodimezionalni algoritam upita 1DRANGEQUERY; jedina razlika je u tome sto se poziva na REPORTSUBTREE koje zamjenjujemo pozivom 1DRANGEQUERY.

Lema 5.7 Upit sa paralelnom osom pravougaonika u drvetu opsega sa smjestenih n tacaka uzima O(log (na)2 n + k) vremena, gdje je k broj prijavljnih tacaka. Dokaz. Na svakom cvoru v u glavnom drvetu T mi potrosimo konstantno vreme da odlicimo gdje ce se put pretrage nastaviti i vjerovatno ce mo pozvati 1DRANGEQUERY. Teorema 5.2 govori da vreme koje potrosimo u ovo m rekurzionom pozivu je O(log n +kv), gdje je kv broj tacaka prijavljenih u ovom pozivu. Otuda ukupno vreme koje potrosimo je

zbir svih cvorova koje su posjetili u glavnom drvetu. Primjetimo da je zbir

jednako k

ukupnom broju prijavljenih tacaka. Sta vise put pretrage od x i x' u glavnom drvetu je dugacak O(log n). Otuda

lema sledi. Teorema 5.8. Neka P bude skup od n tacaka u ravni. Opseg drveta za P koristi O(n log n) prostora i moze se konsturisati u O(n log n) vremena. Po upitu ovo drvo opsega moze prijaviti tacku u P koja lezi u pravougaoniku upitnog opsega za vremena, gdje je k broj prijavljenih tacaka.

5.4

Vise dimezionalno drvo opsega.

Prilicno je jednostavno da dvodimezionalno drvo opsega pretvorimo u visedimezionalno. Sada cemo opisati globalni pristup. Neka P bude skup tacaka u d-dimezionalnom prostoru. Pravimo balansirano binarno drvo pretrage na prvim kordinatama tacaka. Kanonsko pod drvo P(v) od cvora v je na prvom nivou/dubini drveta, glavno drvo se sastoji od tacaka smjestenih u liscu pod drveta ugnjezdenog u v. Za svaki cvor v mi pravimo povezanu strukturu Tassoc(V); drugi nivo drveta Tassoc(V) je (d-1) dimezionalao drvo opsega za tacke u P(v), ogranicena je na svoje poslednje (d-1) kordinate. Ovo (d-1) dimezionalno drvo opsega se pravi rekurzivno na isti nacina; to je balasirano drvo pretrage na drugoj kordinati tacaka u kome svaki cvor pokazuje na (d-2) dimezionalno drvo opsega sa tackama u njegovom pod drvetu, ograniceno je na zadnje (d-2) kordinate. Rekurzija staaje kada smo lijevo sa tackama koje ogranicavaju

poslednje kordinate; one su smjestene u 1-dimaezionalno drvo pretrage balasirano binarno drvo pretrage. Algoritam upita je takodje veoma slican kao u dvodimezionalnom slucaju. Mi koristimo prvi nivo/dubina dtrveta da lociramo O(log n) cvorove, ciji kanoski podskupovi zajedno sadrzi sve tacke cije su prve kordinate u pravilnom dometu. Ti kanonski pod skupovi se i dalje ispituju izvodeci niz upita na odgovarajuci drugi nivo strukture. Na svakom drugom nivou strukture mi obiljzavamo O(log n) kanoski podskup. To znaci da ima O(log(na)2 n) kanoskih podskupova u ukupnom drugom nivou strukture. Zajedno sadrze sve tacke cije prve i druge kordinate leze u odgovarajucem opsegu. Treci nivo strukture smjesta kanoske podskpove onda ispitujemo domet za trecu kordinatu i tako dalje dok nedostignemo jednodimezionalnih drveta. U tim drvima nacemo tacke cije poslednje kordinate leze na ispravnom opsegu i saopstavamo ih. Ovakoam pristup vodi do sledeceg zakljucka. Teorema 5.9 Neka P bude skup od n tacaka u d-dimezionalnm prostoru gdje d>=2. Drvo opsega za P koristi

prostora i koji se moze napraviti za

vremena.

Kada izvjestiomo o tackama koje leze u pravougaoniku osega upita u prestavlja broj saopstenih tacaka.

gdje k

Dokaz. Neka Td (n) oznacavaju vreme izgradnje za drvo opsega na skupu od n tacaka d-dimezionalnog prostora. Povodom teoreme 5.8 mi znamo ta T2(n)=O(n log n). Izgradnja d-dimezionalnog drveta opsega se sastoji od objekata balanisranog binarnog drveta pretrage koji uzima vreme O(n log n ) i pravi povezanu strukturu.Na cvorovima na bilo kojoj dubini prvog nivo drveta svaka tacka je smjestena na tacno jednu povezanu strukturu. Vreme koje zahtjeva izgradnju svih povezanih struktura na nekoj dubini je vreme koje je potrebno za izgradnju povezane strukture korjena. Ovo sledi

zato sto poslednje vreme izgradnje je linearno. Dakle ukupno vreme izgradnje zadovoljava

Odkada T2(n)=O(n log n) ovo ponavljanje resava do

.Granica od koliceine prostora

Sledi u istom slucaju. Neka Qd(n) oznacava vreme potroseno u ispitivanju d-dimezionalnog drveta opsega sa n tacaka , ne racunajuci vreme za izvjetaje tacaka. Ispitujuci d-dimezionalno drvo opsega podrazumjeva trazenje u prvom nivou drveta koje uzima O(log n) vremena i ispitujuci logaritamski broj (d-1) dimezionalnog drveta opsega. Otuda,

gdje Q2(n)= O(log(na)2 n). Ovo ponavljanje se lako resava Qd=O(log(na)d n). Ali i dalje imamo da dodamo vreme potrebno za saopstavanje tacaka cija je granica O(k). Kao i u 2-dimezionalnom slucaju vreme upita moze biti poboljsan logaritmaskim faktorima. Vidjeti sekciju 5.6

5.5 Opsti skupovi tacaka


Do sada se nametala restrikcija sa samo dve tacke imaju jednake x ili y kordinate sto je nerealisticno. Na srecu ovo se lako ispravlja. Kriticno zapazanje koje nismo nikad pretpostavili da kordinate imaju realne vrednosti.Sve sto nam je potrebno jeste da dodju sa sa potpuno uredjenog univerzima tako da mozemo porediti bilo koje dve kordinate. Mi mozemo iskoristiti trik sa sledecim opisom. Zamjenimo kordinate realnih brojeva sa elementima takozvanim kompozitni-broj prostora. Elementi ovog prostora su parovi realnih. Kopozitni broj od dva realna a i b se oznacava (a|b). Definisacemo ukupan poredak kopozitnih-brojeva prostora koristeci leksograficki poredak. Tako da za dva kompozitna broja (a|b) i (a'|b') imamo:

Sada pretpostavimo da je dat skup P od n tacaka u ravni. Tacke su razlicita, ali mnoge tacke imaju iste x ili y kordinate. Zamjenimo tacku P:=(px|py) za novu tacku

koji ima kopozitni broj kao kortinantne vrednosti. Ovim nacinom mi dobijamo novi skup od n tacaka. Prva kordniata od bilo koje dve tacke u kordinatu. je razlicita; Isto vazi i za drugu

Koristeci kako je gore definisano mozemo konstruisati kd-drvo i dvodimezionalni opseg drveta za Pretpostavimo da sada zelimo izvjestaj tacaka u P koje leze u opsegu R:=[x:x']x[y:y']. U tom cilju mi moramo imati trvo upita koje smo konstrusali za To znaci da moramo trasformisati upitni opseg na novi kompozitni prostor. Novi trasformisani opseg

je definisan na sledeci nacin.

Lema 5.10 Neka p bude tackaa i R pravaougaoni opseg. Tada je

Dokaz. Neka R:=[x:x'] x [y:y'] i neka p :=(px, py) . Po defniciji p lezi u R akko x<= p x <=x' i y<= py <=y' To je lako vidjeti da utice akko uz uslov da akko lezi u

Pristup kompozitnih brojeva takodje mozemo koristiti u visoko dimezionalnim pretreagama.

5.6

Fractional Cascading

U sekciji 5.3 opisali smo opisali smo strukturu podataka da pravougani opseg upita u ravni, drvo opsega cije je vreme upita (ovdje je n ukupan proj tacaka smjestenih u

strukturu podataka i k je proj prijavljenih tacaka. U ovoj sekciji opisacemo tehniku zvanu fractional cascading, da bi smanjili upitno vreme na O(log n +k). Podsetimo se ukratko kako drvo opsega radi. Drvo opsega za skup P tacaka u ravni je struktura podataka u dva nivoa. Glavno drvo je binarno drvo pretrage na x kordinati tacaka. Svaki cvor v u glavnom drvetu ima poveznu strukturu Tassoc(v) koje je bnarno drvo na y kordinati tacaka u P(v) kanoskog pod drveta od v. Upit sa pravougaonim opsegom [x:x'] x [y:y'] se vrsi na sledeci nacin. Prvo skupljamo O(log n) cvorova u glavnom drvetu koje je devinisano kao kanoska pod drveta koja zajedno sadrze tacke sa x kordinatama u opsegu [x:x']. Druga povezana struktura su ispitani cvorovi sa opsegom [y:y'] Ispitane povezane sturkture Tassoc(v) su jednodimaezionalni upiti opsega tako da uzimaju O(log n +kv) vremena gdje je kv broj prijavljenih tacaka. Otuda je ukupno vreme

Ako izvodimo pretrage u povezanim strukturama u O(1+kv) vremenu, onda bi ukupno upitno vreme trebalo da smanjimo na O(log n +k). Ali koako da to uradimo? Generalno nije moguce dati odgovor u jednodimezionalnom upitnom opsegu u O(a+k) vremena, gdje je k broj odgovora. Ono sto nas spasava je da moramo uraditi puno jednodimezionalnih pretraga sa istim opsegom , onda mozemo iskoristiti rezultat jedne pretrage da ubrzamo ostale pretrage. Prvo cemo ilustrovati ideju o fractional cascading sa jednostavnim primjerom. Neka S1 i S2 budu dva skupa objekata gdje svaki objekat ima kljuc koji je realan broj. Ti skupovi su smjesteni u sortiranom poretku u listi A1 i A2. Pretpostavimo da nama treba izvjestaj o svim objektima u S 1 i S2 ciji kljucevi leze u upitnom intervalu [y:y']. Mozemo uraditi na sledeci nacin. Binarno pretrazimo sa y A1 da nadjemo najmanji kljuc bude veci ili jednak y. Odatle mi prolazimo listu desno isvjestavjauci objekte koje smo prosli dok ne naidjemo na kljuc koji je veci od y'. Ojekti is S2 mogu se sapstiti na slican nacin. Ako je ukupan broj saopstenih objekata k upitno vreme ce biti O(k) plus vreme sa dva binarana pretrazivanja jedan za A1 drugi za A2. Takodje ako su kljucevi objekata u S2 podskup kljuceva objekata u S1 onda mozemo izbjeci drugo binarno pretrazivanje. Dodamo pokazivace sa ulaza A1 na ulaz A2 ; ako u A1[i] smejsten objekat sa kljucem yi onda smjestamo pokazivac na ulaz u A2 sa najmanjim lkjucem koji je veci ili jednak od yi. Ako nema takvog kljuca onda pokazivac od A1[i] je nula. Slika 5.7 ilustruje ovaj opis. Kako mozemo da uskoristimo ovu strukturu da izvjetavamo objekte u S1 i S2 ciji kljucevi u upitnom intervalu [y:y']? Izvjestavanje objekata u S1 se i dalje radi kao prije: binarna pretraga sa y u A1 , polaz kraoz A1 udesno dok se ne naidje na najveci kljuc od y'.Za izvjestaj tacaka iz S2 procedura je sledeca. Neka pretraga za y u A1 zavrsava u A[i]. Otuda kljuc od A[i] je najmanji u S1 koji je veci ili jednak od y.

Slika 5.7

Od kljuceva iz S2 formira se podskup kljuceva iz S1 :to znaci da pokazivaci od A[i] mora pokazati na najmanji kljuc iz S2, veci ili jednak od y. Otuda sledi pokazivac odakle se krece prolaz u desno kroz A1 .

Na ovaj nacin binarna pretragaa u A2 se izbjegava, i izvjestaji objekata iz S2 uzimaju samo O(1 + k) vremena, gdje je k broj izvjestaja. Slika 5.7 pokazije jedan primjer upita.Vrsimo upit sa opsegom [20:65]. Prvo koristimo binarnu pretragu u A1 da nadjemo 23, najmanji broj veci ili jednak od 20. Odatle se krecemo desno dok ne naidjemo na veci kljuc od 65. Objekte koje smo prosli imamo imamo njihove kljuceve u opsegu tako da ih reportiramo. Onda pratimo pokazivac 23 u A2. Dolazimo do kljuca 30 koje je najmanji u A2 a veci ili jednak od 20. Odatle mi takodje idemo desno dok nedosegnemo kljuc veci od 65 i izvjestimo objekatw iz S 2 ciji su kljucevi u opsegu. Sada se vratimo u na drvo opsega. Sada da se vratimo na drvo opsega. Kljucno posmatranje ovdje je da kanonski podslupovi P(lc(v)) i P(rc(v)) su oba podskupa od P(v). Ishod koji mozemo da koristimo je ista ideja kako da ubrzamo vreme predtrage. Detalji su malo vise komplikovani, zato sto sada imamo dva podskupa od P(v). Neka T bude drvo opsega skupa P od n tacaka u ravni. Svako kanonski pod skup P(v) je smjesten u povezanu strukturu. Ali umjesto da korisitmo binarnu pretragu drveta kao povezanu strukturu kao u sekciji 5.3, mi sada smjestamo u listu A(v). Lista je sortirana na y kordinati tacaka. Pored toga svaki ulaz u listu A(v) sadrzi dva pokazivaca. Pokazivac na A(lc(v)) i pokazivac na A(rc(v)). Pretpostavimo da u A(v)[i] smjestena tacka p. Mi smjestimo pokazivac od A(v)[i] na ulaz od A(lc(v)) tako da y kordinata od tacke p' koja je smjestena tu da je najmanja a ujedno veca ili jednaka p y. Kao sto je zabiljezeno iznad , P(lc(v)) je podskup od P(v). Dakle ako je p ima najmanju y kordinatu vecu ili jednaku od neke vrednosti y od mnoguh tacaka u P(v) onda p' ima najmanju y kordinatu vecu ili jednaku od y od bilo kojih tacaka u P(lc(v)). Pkazivac na A(rc(v)) je definisan in slican nacin. Ukazuje na ulaz tako da y kordinata od tacke smjestene tu je najmanja a ujedno vece ili jednaka od Py. Ova modifikiovana verzija drveta opsega se zove slojevito drvo opsega. Slike 5.8 i 5.9 pokazuju primjere.

Slika 5.8 Sada da vidimo kako da odgovorimo na upit sa opsegom [x:x']x[y:y'] u sllojevitom drvetu osega. Kako smo prije pretrazivali sa x i x' u glavnom drvetu T da odredimo O(log n) cvorova cije kanoski podskupovi zajedno sadrze tacke sa x kordinatama u opsegu [x:x'] Ti cvorovi se nalaze na sledeci nacin. Neka Vsplit bude cvor gdje se razdvaja putanja pretrage na dva djela. Cvorovi koje trazimo su oni ispod Vsplit , to je desno djete od cvora na putu pretrage do x gdje put ide lijevo, ili lijevo djete od cvora na putu pretrage do x' gdje put ide desno. Na Vsplit mi nalazimo ulaz u A(Vsplit) cija y kordinata najmanja a ujedno veca ili jednaka y. Ovo se moze zavrsiti u O(log n) vremena binarnim pretrazivanjem. Dok mi trazimo dalje sa x i x' u glavnom drvetu, mi se idemo do prolaza u povezanu listu cija je y kordinata je najmanja a ujedno veca ili jednaka y. To se moze odrzavati u konstantnom vremenu preteci pokazivace smjestene u kuste. Sada neka v bude jedan od O(log n) izabanih cvorova. Moramo izvjestiti tacke smjestene u A(v) cije y kordinate u opsegu [y:y']. Za ovo dovoljno je da nadjemo tacku sa najmanjom y kordinatom vece ili jednako od y, odatle mi pozemo proci korz listu izvjestavajuci tacke dokle god je y kordinata manja ili jednaka y'. Ova tacka se moze naci u konstantnom vremenu zato parent(v) je na putu pretrage i zadrzavamo tacke sa najmanjom y kordinatom vecom ili jednakom sa y u listi na putu pretrage. Dakle mi mozemo izvjestiti tacke od A(v) cija je y kodinata u opsegu [y:y'] u O(1+k v) vremena je broj kv izvjestaja tacaka na cvor v. Sada ukupno upitno vreme postaje O(log n +k). Fractional cascading takodje dokazuje da upitno vreme od visedimeznzionalnih opsega trveta je logaritamski faktor.

Teorema 5.11 Neka P bude skup od n tacaka u d-dimezionalnom prostoru, d>=2. Slojevito drvo opsega za P koristi prostor i moze se konstruisati u vremenu. Sa ovim

drvetom opsegami mozemo izvjestiti tackeu P koje leze na prvougaonom upitnom opsegu u

vremena gdje je k broj izvijstaja tacaka.

Slika 5.9

Vous aimerez peut-être aussi