Chan-algoritmus

Innen: testwiki
A lap korábbi változatát látod, amilyen imported>Balint36 2018. november 20., 12:58-kor történt szerkesztése után volt. (Forrás hiányzik)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

Sablon:Nincs forrás

A Chan-algoritmus 2-dimenziós esetben. Itt a pontokat x-koordináta alapján osztottuk szét, míg az igazi algoritmus tetszőleges szétosztásra is működik.

A Timothy M. Chanról elnevezett Chan-algoritmus optimális kimenetérzékeny algoritmus, amellyel egy n pontot tartalmazó P halmaz konvex burkát lehet kiszámítani 2- és 3-dimenziós térben. A kiszámításhoz O(nlogh) idő szükséges, ahol h a konvex burok csúcsainak száma. A kétdimenziós esetben egy O(nlogn) algoritmust (például a Graham-féle pásztázást) és a Jarvis-féle menetelést (O(nh)) kombinálja az optimális O(nlogh) futásidő eléréséhez. A Chan-algoritmus arról nevezetes, hogy sokkal egyszerűbb, mint a Kirkpatrick–Seidel-algoritmus, és egyszerűen kiterjeszthető a háromdimenziós térbe is. Ezt a modellt Chantól függetlenül Frank Nielsen is kifejlesztette a Ph.D. disszertációjában.

Algoritmus

Áttekintés

Az algoritmus sikeres lefutásához egyetlen mh paraméterre van szükség. Tegyük fel, hogy ez egy fix érték (a valóságban h-t nem ismerjük előre, ezért több, egyre növekvő értékű m paramétert használunk, lásd később).

Az algoritmus első lépése a P halmaz tetszőleges szétosztása K1+n/m darab részhalmazra (Qk)k=1,2,...K, mindben legfeljebb m ponttal. Ekkor K=O(n/m).

Ezután az első fázisban egy O(plogp) algoritmus segítségével (például Graham-féle pásztázás) minden Qk-ra kiszámítja a részhalmaz konvex burkát, Ck-t, ahol p a részhalmaz pontjainak száma. Mivel K részhalmaz van és mindegyikben O(m) pont, ez a fázis KO(mlogm)=O(nlogm) időt vesz igénybe.

A második fázisban az algoritmus a Jarvis-féle menetelést hajtja végre, a már kiszámított kis konvex burkok (Ck)k=1,2,...K felhasználásával. Ennek során minden lépésben veszünk egy pi pontot, amely a konvex burok része (először pi lehet a P halmaz legalacsonyabb y koordinátájú pontja, amelyről biztosan tudjuk, hogy része lesz P konvex burkának), és keresünk hozzá egy olyan pi+1=f(pi,P) pontot, hogy a P halmaz összes többi pontja a pipi+1 egyenestől jobbra legyen. Itt a pi+1=f(pi,P) jelölés azt jelenti, hogy a következő pontot (pi+1-et) pi és P függvényében határozzuk meg. A Qk részhalmaz Ck konvex burka ismert, és maximum m pontot tartalmaz (az óramutató járásával megegyező, vagy ellentétes irányban felsorolva), így f(pi,Qk) bináris kereséssel kiszámítható O(logm) idő alatt. Tehát O(Klogm) idő alatt a K darab részhalmaz mindegyikére kiszámítható az f(pi,Qk). Ezek után f(pi,P) is meghatározható a szimpla Jarvis-féle meneteléssel, viszont elég csak az (f(pi,Qk))1kK pontokat, vagyis a kis konvex burkok pontjait figyelembe venni a teljes P halmaz pontjai helyett. Azon pontok felhasználásával pedig egy újabb pont megtalálásához a Jarvis-féle menetelés futási ideje O(K), ami elhanyagolható az f(pi,Qk)-k kiszámításához képest. A Jarvis-féle menetelés akkor fejeződik be, ha O(h) alkalommal megismétlődött (mivel a lényege, hogy maximum h ismétlés után mindenképp megtaláljuk a P halmaz konvex burkát, ahol h a konvex burok pontjainak száma), tehát a második fázis O(Khlogm) időt fog igénybe venni, ami egyenlő O(nlogh)-val, ha m egy h-hoz közeli érték (lásd lejjebb m megválasztásának stratégiáját).

A két fázis összesen O(nlogh) idő alatt számítja ki az n pont konvex burkát.

Az m paraméter megválasztása

Ha m szabadon választható paraméter, akkor előfordulhat, hogy m<h. Ebben az esetben a második fázisban m lépés után leállítjuk a Jarvis-féle mentelést, hogy ne legyen túl nagy a futásidő, és O(nlogm) idő elteltével a konvex burok még nem lesz kiszámítva.

Ezért azt az ötletet alkalmazzuk, hogy többször is lefuttatjuk az algoritmust egyre nagyobb m értékkel. A futás minden m-re O(nlogm) idő alatt befejeződik (eredményesen vagy eredménytelenül). Ha m túl lassan növekszik, akkor nagy lehet a szükséges iterációk száma, ellenben ha túl gyorsan, akkor az első m, amire sikeresen lefut, sokkal nagyobb lehet, mint h, így lassabbá válhat a futásidő: O(nlogm)>O(nlogh).

Négyzetre emelős stratégia

Egy lehetséges stratégia, hogy minden iterációnál négyzetre emeljük m értékét, maximum n-ig. m=2-vel kezdve, a t. iterációnál m=min(n,22t) legyen. Ebben az esetben O(loglogh) iteráció lesz, mivel az algoritmus befejeződik, amint

m=22thlog(22t)logh2tloghlog2tlogloghtloglogh,

ahol 2-es alapú logaritmust veszünk, és az algoritmus teljes futásideje

t=1logloghO(nlog(22t))=O(n)t=1logloghO(2t)=O(n21+loglogh)=O(nlogh).

Háromdimenziós térben

Ha háromdimenziós esetre akarjuk általánosítani, akkor a Graham-féle pásztázás helyett egy O(nlogn) algoritmust kell használnunk a háromdimenziós konvex burok kiszámítására, illetve a Jarvis-féle menetelés háromdimenziós változatát. A futásidő marad O(nlogh).

Fordítás

Sablon:Fordítás