Chenův algoritmus

Chenův algoritmus je algoritmus pro konstrukci konvexního trupu z konečné množiny bodů v rovině. Jedná se o kombinaci dvou pomalejších algoritmů ( Grahamovo skenování a Jarvisovo zalamování ). Nevýhodou Grahamova skenování je nutnost seřadit všechny body podle polárního úhlu, což je poměrně časově náročné . Jarvisův obal vyžaduje iteraci přes všechny body pro každý z bodů konvexního trupu , což v nejhorším případě trvá . Pojmenováno po Timothy M. Chan .

Popis algoritmu

Myšlenkou Chenova algoritmu je zpočátku rozdělit všechny body do skupin kusů v každém z nich. V souladu s tím je počet skupin roven . Pro každou ze skupin je konvexní trup zkonstruován skenováním Grahama pro , to znamená, že to bude nějakou dobu trvat pro všechny skupiny .

Poté, počínaje od nejnižšího levého bodu, se pro výsledné trupy zkonstruuje běžný Jarvisův konvexní trup. V tomto případě je další vhodný bod pro konvexní trup za , protože k nalezení bodu s maximální tečnou vzhledem k uvažovanému bodu v -gonu stačí utratit (body v -gonu byly seřazené podle polárního úhlu během provádění Grahamova skenovacího algoritmu). V důsledku toho trvá nějaký čas , než se dostanete kolem .

To znamená, že Chanův algoritmus funguje pro , a pokud získáte , pak pro .

Trup (P, m) 1) vzít . Rozdělte na disjunktivní podmnožiny mohutnosti ne více než ; 2) pro i = 1 až r proveďte : (a) vypočítejte Grahamův konvexní obal ( ), uložte vrcholy do polárního pole; 3) vezměte krajní levý a nejnižší bod z ; 4) pro k = 1 až m udělejte (a) pro i = 1 až r najděte a zapamatujte si bod s maximálním úhlem ; (b) vzít jako bod od s maximálním úhlem ; c) v případě vrácení ; 5) vraťte se malý, zkuste to znovu;

Volba počtu bodů m

Je jasné, že Jarvisův traversal a tím i celý algoritmus bude správně fungovat pouze tehdy , když , ale jak dopředu víte, kolik bodů bude v konvexním trupu? Algoritmus je nutné několikrát spustit, vybrat a pokud , pak algoritmus vrátí chybu. Pokud provedete výběr binárním vyhledáváním na , skončíte s časem , který je poměrně dlouhý.

Proces lze urychlit tak, že začnete s malou hodnotou a poté ji výrazně zvýšíte, dokud to nevyjde . Například vezměte . V tomto případě bude iterace -i trvat . Proces hledání skončí, když , tj. (  je binární logaritmus).

Nakonec .

ChanHull (P) pro t = 1 až n: a) vzít ; (b) L = obal (P, m); (c) jestliže L != " malé, zkuste to znovu" return L;

Literatura