Fortunov algoritam
![]() | Ovaj članak je započet ili proširen kroz projekat seminarskih radova. Potrebno je proveriti prevod, pravopis i viki-sintaksu. Kada završite sa proverom, dopišete da nakon |provereno=. |
![](http://upload.wikimedia.org/wikipedia/commons/0/0c/Fortunes-algorithm-slowed.gif)
Fortunov algoritam je algoritam pokretne linije ѕa generisanje Voronojevih dijagrama iz skupa tačaka u ravni čija je vremenska složenost O(n log n) i prostorna O(n).[1][2] Objavio ga je Stiven Fortun 1986. u svom radu "Algoritam pokretne linije za Voronojeve dijagrame."[3]
Opis algoritma
[uredi | uredi izvor]Algoritam održava pokretnu liniju i obalsku liniju, koje se obe kreću kroz ravan kako algoritam napreduje. Pokretna linija je prava linija, i možemo po dogovoru pretpostaviti da je vertikalna i da se kreće sleva nadesno. U bilo kom trenutku tokom trajanja algoritma tačke levo od pokretne linije će biti ugrađene u Voronojev dijagram, dok tačke desno od pokretne linije nisu još uvek razmatrane. Obalska linija nije linija, već kompleksna kriva sa leve strane pokretne koja se sastoji od delova parabola; ona razdvaja deo ravni u kojem Voronojev dijagram može biti poznat, bez obzira na tačke desno od pokretne linije, od ostatka ravni. Za svaku tačku levo od pokretne linije, može se definisati parabola tačaka koje su na podjednakom rastojanju od te tačke i od pokretne linije; obalska linija je granica unije ovih parabola. Dok pokretna linija napreduje, temena obalske linije, u kojoj se dve parabole seku, prati ivice Voronojevog dijagrama. Obalska linija napreduje čuvajući svaku parabolu tačno na pola puta između tačaka preko kojih se prethodno prešlo pokretnom linijom i novog položaja pokretne linije.
Algoritam održava kao strukturu podataka binarno stablo pretrage koje opisuje strukturu obalske linije i prioritetni red koji sadrži potencijalne buduće događaje koji mogu da promene strukturu obalske linije. Ovi događaji uključuju dodavanje nove parabole u obalsku liniju (kada pokretna linija naiđe na novu ulaznu tačku) i uklanjanje krive iz obalske linije (kada pokretna linija postane tangenta na krugu kroz neke tri ulazne tačke čije parabole formiraju uzastopne segmente obalske linije). Prioritet svakog takvog događaja se može odrediti na osnovu x-koordinate pokretne linije u tački u kojoj se događaj desio. Sam algoritam se onda sastoji od uklanjanja sledećeg događaja iz prioritetnog reda, pronalaženja promena koje događaj prouzrokuje u obalskoj liniji i ažuriranja struktura podataka.
Pošto ima O(n) događaja koje treba obraditi (svaki je povezan sa nekom karakteristikom Voronojevog dijagrama) i O(log n) vremena za obradu događaja (svaki se sastoji od konstantnog broja operacija na binarnom stablu pretrage i prioritetnom redu) ukupno vreme je O(n log n).
Pseudokod
[uredi | uredi izvor]let be the transformation , where is the Euclidean distance between and the nearest site let be the "beach line" let be the region covered by site . let be the boundary ray between sites and . let be the sites with minimal -coordinate, ordered by -coordinate create initial vertical boundary rays while not IsEmpty() do ← DeleteMin() case of is a site in : find the occurrence of a region in containing , bracketed by on the left and on the right create new boundary rays and with bases replace with in delete from any intersection between and insert into any intersection between and insert into any intersection between and is a Voronoi vertex in : let be the intersection of on the left and on the right let be the left neighbor of and let be the right neighbor of in create a new boundary ray if , or create if is right of the higher of and , otherwise create replace with newly created in delete from any intersection between and delete from any intersection between and insert into any intersection between and insert into any intersection between and record as the summit of and and the base of output the boundary segments and endcase endwhile output the remaining boundary rays in
Težinske lokacije i diskovi
[uredi | uredi izvor]Kao što Fortun opisuje u[1] modifikovana verzija algoritma pokretne linije može biti iskorišćena za konstrukciju aditivnog težinskog Voronojevog dijagrama, u kome udaljenost do svake lokacije (generatora) je pomerena za težinu lokacije; ovo može biti ekvivalentno posmatrano kao Voronojev dijagram skupa diskova čiji je centar u lokacijama sa radijusom jednakim težini lokacije.
Reference
[uredi | uredi izvor]- ^ a b Mark de Berg; Marc van Kreveld, Mark Overmars, and Otfried Schwarzkopf (2000), Computational Geometry (2nd revised izd.), Springer-Verlag, ISBN 978-3-540-65620-3 Section 7.2: Computing the Voronoi Diagram: pp. 151—160.
- ^ Austin, David, Voronoi Diagrams and a Day at the Beach, Feature Column, American Mathematical Society
- ^ Steven Fortune. A sweepline algorithm for Voronoi diagrams. Proceedings of the second annual symposium on Computational geometry. Yorktown Heights, New York, United States. . 1986. str. 313—322. ISBN 978-0-89791-194-8. Nedostaje ili je prazan parametar
|title=
(pomoć) ACM Digital LibrarySpringerLink[mrtva veza] - ^ Wong, Kenny; Hausi A. Müller, An Efficient Implementation of Fortune's Plane-Sweep Algorithm for Voronoi Diagrams, CiteSeerX 10.1.1.83.5571