Chenin algoritmi

Chenin algoritmi on algoritmi tason äärellisen pistejoukon kuperan rungon rakentamiseen. Se on kahden hitaamman algoritmin yhdistelmä ( Graham-skannaus ja Jarvis-kääre ). Graham-skannauksen haittana on tarve lajitella kaikki pisteet napakulman mukaan, mikä on melko aikaa vievää . Jarvis-käärintä vaatii iteroinnin kaikissa kuperan rungon pisteissä , mikä pahimmassa tapauksessa kestää . Nimetty Timothy M. Chanin mukaan .

Algoritmin kuvaus

Chenin algoritmin ideana on aluksi jakaa kaikki pisteet kappaleryhmiin kussakin. Vastaavasti ryhmien lukumäärä on yhtä suuri kuin . Jokaiselle ryhmälle muodostetaan kupera runko skannaamalla Graham for , eli se vie aikaa kaikilta ryhmiltä .

Sitten alhaisimmasta vasemmasta pisteestä alkaen muodostetaan yhteinen Jarvis-kupera runko tuloksena oleville rungoille. Tässä tapauksessa seuraava kuperalle rungolle sopiva piste on takana , koska pisteen löytämiseksi, jolla on maksimitangentti suhteessa tarkasteltavaan -gonin pisteeseen, riittää kuluttaminen ( -gon pisteet olivat lajiteltu napakulman mukaan Graham-skannausalgoritmin suorittamisen aikana). Tämän seurauksena kiertäminen vie aikaa .

Eli Chanin algoritmi toimii , ja jos saat , niin .

runko (P, m) 1) ota . Jaa kardinalisuuden disjunktiivisiin osajoukkoon enintään ; 2) jos i = 1 - r tee : (a) laske Grahamin konveksi runko ( ), tallenna pisteet polaarisesti lajiteltuun taulukkoon; 3) ottaa vasen ja alin piste kohteesta ; 4) k = 1 - m tee (a) i = 1 - r etsi ja muista piste maksimikulmalla ;(b ) ottaa pisteeksi suurimmalla kulmalla ; c) jos palautus ; 5) palauta pieni, yritä uudelleen;

Pisteiden määrän valinta m

On selvää, että Jarvis-läpikulku ja siten koko algoritmi toimii oikein vain jos , mutta mistä tiedät etukäteen kuinka monta pistettä kuperassa rungossa on? Algoritmi on suoritettava useita kertoja valitsemalla ja jos , niin algoritmi palauttaa virheen. Jos teet valinnan binäärihaulla , niin päädyt ajan kanssa , joka on melko pitkä.

Prosessia voidaan nopeuttaa aloittamalla pienestä arvosta ja lisäämällä sitä sitten merkittävästi, kunnes se toimii . Ota esimerkiksi . Tässä tapauksessa -i-iteraatio kestää . Hakuprosessi päättyy, kun , eli (  on binäärilogaritmi).

Lopulta .

ChanHull (P) , kun t = 1 - n, tee: a) ottaa ; (b) L = runko (P, m); (c) jos L != " pieni, yritä uudelleen" palauttaa L;

Kirjallisuus