Chen algoritmusa

Chen algoritmusa egy síkon egy véges ponthalmaz konvex héjának megszerkesztésére szolgáló algoritmus. Ez két lassabb algoritmus kombinációja ( Graham-szkennelés és Jarvis-csomagolás ). A Graham-szkennelés hátránya, hogy minden pontot poláris szög szerint kell rendezni, ami meglehetősen időigényes . A Jarvis burkoláshoz a domború hajótest minden egyes pontján át kell ismételni az összes pontot , ami a legrosszabb esetben megteszi . Timothy M. Chan nevéhez fűződik .

Az algoritmus leírása

Chen algoritmusának az az ötlete, hogy kezdetben az összes pontot darabcsoportokra osztja . Ennek megfelelően a csoportok száma egyenlő . Mindegyik csoporthoz egy domború hajótestet készítünk Graham keresésével , vagyis minden csoportnál időbe telik .

Ezután a bal alsó ponttól kiindulva egy közös Jarvis konvex hajótestet készítünk a kapott hajótestekhez. Ebben az esetben a konvex hajótest következő megfelelő pontja mögött van , mivel ahhoz, hogy a -gonban a figyelembe vett ponthoz képest maximális érintővel rendelkező pontot találjunk , elegendő költeni (a -gon pontjai polárszög szerint rendezve a Graham-szkennelő algoritmus végrehajtása során). Ennek eredményeként időbe telik , amíg megkerüli .

Vagyis Chan algoritmusa működik -re , és ha megkapod , akkor -ra .

Hajótest (P, m) 1) vegye . A kardinalitás diszjunktív részhalmazaira legfeljebb ; 2) i = 1-től r-ig tegye : (a) számítsuk ki a Graham konvex burkot ( ), tároljuk a csúcsokat egy polárisan rendezett tömbben; 3) vegye a bal szélső és legalacsonyabb pontot innen ; 4) k = 1 - m esetén tegye (a) ha i = 1 - r , keresse meg és jegyezze meg a pontot a maximális szöggel ; (b) vegyünk egy pontot a maximális szöggel ; c) ha visszaküldi ; 5) térjen vissza kicsiben, próbálja újra;

A pontok számának megválasztása m

Nyilvánvaló, hogy a Jarvis-bejárás, és így az egész algoritmus csak akkor fog helyesen működni, ha , de honnan tudod előre, hogy hány pont lesz a konvex hajótestben? Az algoritmust többször le kell futtatni, kiválasztva , és ha , akkor az algoritmus hibát ad vissza. Ha a kijelölést bináris kereséssel hajtja végre a -n , akkor az időhöz fog jutni, ami elég hosszú.

A folyamat felgyorsítható, ha kis értékkel kezdjük, majd jelentősen növeljük, amíg be nem jön . Például vegyük . Ebben az esetben az -i iteráció . A keresési folyamat akkor ér véget, amikor , azaz (  a bináris logaritmus).

A végén .

ChanHull (P) t = 1-től n-ig tegye: a) venni ; (b) L = hajótest (P, m); (c) ha L != " kicsi, próbáld újra" adja vissza L-t;

Irodalom