Algoritmus Chans - Chans algorithm - Wikipedia
v výpočetní geometrie, Chanův algoritmus,[1] pojmenoval podle Timothy M. Chan, je optimální algoritmus citlivý na výstup vypočítat konvexní obal sady z body, ve 2- nebo 3-dimenzionálním prostoru. Algoritmus trvá čas, kde je počet vrcholů výstupu (konvexní trup). V rovinném případě algoritmus kombinuje algoritmus (Grahamovo skenování například) pomocí Jarvis pochod (), abychom získali optimální čas. Chanův algoritmus je pozoruhodný, protože je mnohem jednodušší než Algoritmus Kirkpatrick – Seidel, a přirozeně se rozšiřuje do trojrozměrného prostoru. Toto paradigma[2] byl nezávisle vyvinut Frank Nielsen v jeho Ph.D. teze.[3]
Algoritmus
Přehled
Jeden průchod algoritmu vyžaduje parametr což je mezi 0 a (počet bodů naší sady ). Ideálně, ale , počet vrcholů ve výstupním konvexním trupu, není na začátku znám. Několik průchodů s rostoucími hodnotami jsou hotové, které pak končí, když (viz níže o výběru parametru ).
Algoritmus začíná libovolným rozdělením množiny bodů do podmnožiny maximálně každý bod; všimněte si toho .
Pro každou podmnožinu , počítá konvexní trup, pomocí algoritmus (například Grahamovo skenování ), kde je počet bodů v podmnožině. Jak jsou podmnožiny každý bod, tato fáze trvá čas.
Během druhé fáze Jarvisův pochod je proveden s využitím předpočítaných (mini) konvexních trupů, . V každém kroku tohoto Jarvisova pochodového algoritmu máme bod v konvexním trupu (na začátku, může být bod v s nejnižší souřadnicí y, která je zaručeně v konvexním trupu ) a potřebujete najít bod tak, že všechny ostatní body jsou napravo od čáry [je zapotřebí objasnění ], kde notace jednoduše znamená, že další bod, to je , je určena jako funkce a . Konvexní trup soupravy , , je známo a obsahuje maximálně body (uvedené ve směru hodinových ručiček nebo proti směru hodinových ručiček), což umožňuje výpočet v čas do binární vyhledávání[jak? ]. Proto je výpočet pro všechny podmnožiny lze provádět v čas. Poté můžeme určit pomocí stejné techniky, jaká se běžně používá při Jarvisově pochodu, ale pouze s ohledem na body (tj. body v mini konvexních trupech) namísto celé sady . Pro tyto body je jedna iterace Jarvisova pochodu což je zanedbatelné ve srovnání s výpočtem pro všechny podmnožiny. Jarvisův pochod je dokončen, když se proces opakuje krát (protože, způsobem, jakým Jarvis pochod funguje, po nanejvýš iterace jeho nejvzdálenější smyčky, kde je počet bodů v konvexním trupu , museli jsme najít konvexní trup), proto trvá druhá fáze čas, ekvivalent k čas, pokud je blízko (viz níže popis zvolené strategie tak, že tomu tak je).
Spuštěním dvou výše popsaných fází, konvexní trup body jsou počítány v čas.
Volba parametru
Pokud je zvolena libovolná hodnota pro , může se stát, že . V takovém případě po kroky ve druhé fázi přerušíme Jarvisův pochod protože jeho spuštění do konce by trvalo příliš dlouho. V tu chvíli, a čas bude stráven a konvexní trup nebude vypočítán.
Cílem je provést několik průchodů algoritmu se zvyšujícími se hodnotami ; každý průchod končí (úspěšně nebo neúspěšně) v čas. Li mezi průchody se zvyšuje příliš pomalu, počet iterací může být velký; na druhou stranu, pokud stoupá příliš rychle, první pro které je algoritmus úspěšně ukončen, může být mnohem větší než a vytvářejí složitost .
Srovnávací strategie
Jednou z možných strategií je náměstí hodnota při každé iteraci až do maximální hodnoty (odpovídá oddílu v sadách singletonů).[4] Počínaje hodnotou 2 při iteraci , je vybrán. V tom případě, iterace jsou prováděny, vzhledem k tomu, že algoritmus končí, jakmile máme
s logaritmem přijatým v základně a celková doba chodu algoritmu je
Ve třech rozměrech
Zobecnit tuto konstrukci pro trojrozměrný případ, an Místo Grahamova skenování by měl být použit algoritmus pro výpočet trojrozměrného konvexního trupu Preparaty a Honga a je třeba použít trojrozměrnou verzi pochodu Jarvise. Časová složitost zůstává .[1]
Pseudo kód
V následujícím pseudokódu je text mezi závorkami a kurzívou komentáře. K úplnému pochopení následujícího pseudokódu se doporučuje, aby čtenář již byl obeznámen Grahamovo skenování a Jarvis pochod algoritmy pro výpočet konvexního trupu, , ze sady bodů,.
- Vstup: Soubor s bodů.
- Výstup: Soubor s body, konvexní trup .
- (Vyberte bod který je zaručen v : například bod s nejnižší souřadnicí y.)
- (Tato operace trvá čas: například můžeme jednoduše iterovat .)
- ( se používá v Jarvisově pochodové části tohoto Chanova algoritmu,
- abychom vypočítali druhý bod, , v konvexním trupu .)
- (Poznámka: je ne bod .)
- (Další informace najdete v komentářích poblíž odpovídající části Chanova algoritmu.)
- (Poznámka: , počet bodů v konečném konvexním trupu , je ne známý.)
- (Toto jsou iterace potřebné k objevení hodnoty , což je odhad .)
- ( je vyžadováno, aby tento Chanův algoritmus našel konvexní trup .)
- (Přesněji řečeno, chceme , aby se neprovádělo příliš mnoho zbytečných iterací
- a tak je časová složitost tohoto Chanova algoritmu .)
- (Jak je vysvětleno výše v tomto článku, používáme strategii, kde nanejvýš iterace jsou nutné najít .)
- (Poznámka: finále nemusí být rovno , ale nikdy není menší než a větší než .)
- (Algoritmus tohoto Chan se nicméně jednou zastaví iterace nejvzdálenější smyčky jsou prováděny,
- to je, i když , nefunguje iterace nejvzdálenější smyčky.)
- (Další informace najdete v části tohoto algoritmu, která se týká pochodu Jarvis, níže.) se vrátí, pokud .)
- pro dělat
- (Nastavit parametr pro aktuální iteraci. Používáme „schéma kvadratury“, jak je popsáno výše v tomto článku.
- Existují i jiná schémata: například „schéma zdvojnásobení“, kde , pro .
- Použijeme-li však „zdvojnásobovací schéma“, výsledná časová složitost tohoto Chanova algoritmu je .)
- (Inicializujte prázdný seznam (nebo pole) pro uložení bodů konvexního trupu , jak se nacházejí.)
- (Libovolně rozdělená sada bodů do podmnožiny zhruba každý prvek.)
- (Vypočítejte konvexní trup všech podmnožiny bodů, .)
- (Trvá to čas.)
- Li , pak je časová složitost .)
- pro dělat
- (Vypočítejte konvexní trup podmnožiny , pomocí Grahamova skenování, které trvá čas.)
- ( je konvexní trup podmnožiny bodů .)
- (V tomto okamžiku jsou konvexní trupy podmnožin bodů byly vypočítány.)
- (Nyní použijte a upravená verze z Jarvis pochod algoritmus pro výpočet konvexního trupu .)
- (Jarvis pochod vystupuje v čas, kde je počet vstupních bodů a je počet bodů v konvexním trupu.)
- (Vzhledem k tomu, že Jarvisův pochod je algoritmus citlivý na výstup, jeho doba provozu závisí na velikosti konvexního trupu, .)
- (V praxi to znamená, že Jarvis pochod vystupuje iterace jeho nejvzdálenější smyčky.
- Při každé z těchto iterací se provádí maximálně iterace jeho nejvnitřnější smyčky.)
- (Chceme , takže nechceme hrát více než iterace v následující vnější smyčce.)
- (Pokud je naše aktuální je menší než , tj. , konvexní trup nemůže být nalezeno.)
- (V této upravené verzi Jarvisova pochodu provádíme operaci uvnitř nejvnitřnější smyčky, která trvá čas.
- Proto je celková časová složitost této upravené verze
- Li , pak je časová složitost .)
- pro dělat
- (Poznámka: zde je bod v konvexním trupu je již známo, to je .)
- (V tomto vnitřním pro smyčka, možné další body na konvexním trupu , , jsou počítány.)
- (Každý z těchto možné další body jsou z jiného :
- to je je možný další bod na konvexním trupu který je součástí konvexního trupu .)
- (Poznámka: záleží na : to znamená pro každou iteraci , my máme možné další body na konvexním trupu .)
- (Poznámka: při každé iteraci , pouze jeden z bodů mezi je přidán do konvexního trupu .)
- pro dělat
- ( najde bod takový, že úhel je maximalizován[proč? ],
- kde je úhel mezi vektory a . Takový je uložen v .)
- (Úhly není nutné počítat přímo: orientační test může být použito[jak? ].)
- ( lze provést v čas[jak? ].)
- (Poznámka: při iteraci , a je znám a je bodem v konvexním trupu :
- v tomto případě jde o s nejnižší souřadnicí y.)
- (Vyberte bod což maximalizuje úhel [proč? ] být dalším bodem na konvexním trupu .)
- (Jarvisův pochod končí, když je další vybraný bod na konvexním trupu, , je počáteční bod, .)
- -li
- (Vraťte konvexní trup který obsahuje bodů.)
- (Poznámka: samozřejmě není třeba se vracet což se rovná .)
- vrátit se
- jiný
- (Pokud po iterace bod nebyl nalezen, takže , pak .)
- (Musíme začít znovu s vyšší hodnotou pro .)
Implementace
Chanův dokument obsahuje několik návrhů, které mohou zlepšit praktickou výkonnost algoritmu, například:
- Při výpočtu konvexních trupů podmnožin vylučujte body, které nejsou v konvexním trupu, z úvah v následujících popravách.
- Konvexní trupy větších bodových sad lze získat sloučením dříve vypočtených konvexních trupů namísto přepočítávání od nuly.
- S výše uvedenou myšlenkou spočívá dominantní cena algoritmu v předběžném zpracování, tj. Ve výpočtu konvexních trupů skupin. Abychom tuto cenu snížili, můžeme zvážit opětovné použití trupů vypočítaných z předchozí iterace a jejich sloučení, jak se zvětší velikost skupiny.
Rozšíření
Chanův článek obsahuje některé další problémy, jejichž známé algoritmy lze pomocí jeho techniky nastavit na optimální výstup citlivý, například:
- Výpočet spodní obálky sady z úsečky, která je definována jako spodní hranice neomezeného lichoběžník tvořené křižovatkami.
- Hershberger[5] dal algoritmus, který lze zrychlit , kde h je počet hran v obálce
- Konstrukce algoritmů citlivých na výstup pro konvexní trupy s vyšší dimenzí. S využitím seskupovacích bodů a pomocí efektivních datových struktur složitosti lze dosáhnout za předpokladu, že h je polynomiálního řádu v .
Viz také
Reference
- ^ A b Timothy M. Chan. "Optimální algoritmy konvexního trupu citlivé na výstup ve dvou a třech rozměrech ". Diskrétní a výpočetní geometrie, Sv. 16, str. 361–368. 1996.
- ^ Frank Nielsen. "Seskupování a dotazování: Paradigma k získání výstupních citlivých algoritmů ".Diskrétní a výpočetní geometrie, LNCS 1763, s. 250–257, 2000.
- ^ Frank Nielsen. "Adaptivní výpočetní geometrie ".Ph.D. Práce, INRIA, 1996.
- ^ B. Chazelle Jiří Matoušek. "Derandomizace konvexního algoritmu trupu citlivého na výstup ve třech dimenzích ". Výpočetní geometrie, Sv. 5, s. 27–32. 1995.
- ^ J. Hershberger. "Nalezení horní obálky n úseček v čase O (n log n) ". Dopisy o zpracování informací , Sv. 33, s. 169–174. 1989.