Pređi na sadržaj

Fortunov algoritam

S Vikipedije, slobodne enciklopedije
Fortune's algorithm animation

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]

Pseudokod opis algoritma.[4]

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]

  1. ^ 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.
  2. ^ Austin, David, Voronoi Diagrams and a Day at the Beach, Feature Column, American Mathematical Society 
  3. ^ 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]
  4. ^ Wong, Kenny; Hausi A. Müller, An Efficient Implementation of Fortune's Plane-Sweep Algorithm for Voronoi Diagrams, CiteSeerX 10.1.1.83.5571Slobodan pristup 

Spoljašnje veze[uredi | uredi izvor]