Chans algoritm
Inom beräkningsgeometri är Chans algoritm , uppkallad efter Timothy M. Chan , en optimal utdatakänslig algoritm för att beräkna det konvexa skrovet för en uppsättning av punkter, i 2- eller 3- dimensionellt utrymme. Algoritmen tar tid, där är antalet hörn av utmatningen (det konvexa skrovet). I det plana fallet kombinerar algoritmen en algoritm ( Graham scan , till exempel) med Jarvis march ( ), för att erhålla en optimal tid. Chans algoritm är anmärkningsvärd eftersom den är mycket enklare än Kirkpatrick–Seidel-algoritmen och den sträcker sig naturligtvis till 3-dimensionell rymd. Detta paradigm har utvecklats oberoende av Frank Nielsen i sin doktorsexamen. avhandling.
Algoritm
Översikt
En enda pass av algoritmen kräver en parameter som är mellan 0 och (antal punkter i vår uppsättning ). Helst är men antalet hörn i det utgående konvexa skrovet, är inte känt i början. Flera pass med ökande värden på görs som sedan avslutas när (se nedan om val av parameter ).
Algoritmen börjar med att godtyckligt partitionera uppsättningen av punkter i delmängder med högst punkter vardera; Lägg märke till att .
För varje delmängd beräknar den det konvexa skrovet, , med hjälp av en algoritm (till exempel Graham scan ), där är antalet punkter i delmängden. Eftersom det finns delmängder av punkter vardera, tar denna fas tid.
Under den andra fasen avrättas Jarvis marsch , med användning av de förberäknade (mini) konvexa skroven, . Vid varje steg i denna Jarvis marschalgoritm har vi en punkt i det konvexa skrovet (i början kan vara punkten i med den lägsta y-koordinaten, som garanterat finns i det konvexa skrovet av ), och behöver hitta en punkt så att alla andra punkter i är till höger om linjen [ förtydligande behövs ] , där notationen betyder helt enkelt att nästa punkt , det vill säga , bestäms som en funktion av och . Det konvexa skrovet för uppsättningen , är känt och innehåller högst punkter (listade i en medurs eller moturs ordning), vilket gör det möjligt att beräkna i tid med binär sökning [ hur? ] . Därför kan beräkningen av för alla i tid. Sedan kan vi bestämma med samma teknik som normalt används i Jarvis's marsch, men bara med tanke på punkterna i de minikonvexa skroven) istället för hela uppsättningen . För dessa punkter är en iteration av Jarvis's marsch vilket är försumbart jämfört med beräkningen för alla delmängder. Jarvis marsch avslutas när processen har upprepats gånger (eftersom, på det sätt som Jarvis march fungerar, efter högst iterationer av dess yttersta slinga, där är antalet punkter i det konvexa skrovet av , vi måste ha hittat det konvexa skrovet), därför tar den andra fasen tid, motsvarande tid om är nära (se nedan beskrivning av en strategi för att välja så att detta är fallet).
Genom att köra de två faserna som beskrivs ovan, beräknas det konvexa skrovet av tid.
Att välja parametern
Om ett godtyckligt värde väljs för , kan det hända att . I så fall, efter steg i den andra fasen, avbryter vi Jarvis marsch eftersom det skulle ta för lång tid att köra den till slutet. I det ögonblicket kommer en tid att ha spenderats, och det konvexa skrovet kommer inte att ha beräknats.
Tanken är att göra flera pass av algoritmen med ökande värden på ; varje pass avslutas (framgångsrikt eller misslyckat) i tid. Om ökar för långsamt mellan omgångarna, kan antalet iterationer vara stort; å andra sidan, om den stiger för snabbt kan den första för vilken algoritmen avslutas framgångsrikt vara mycket större än , och ge en komplexitet .
Kvadreringsstrategi
En möjlig strategi är att kvadrera värdet på vid varje iteration, upp till ett maximalt värde på (motsvarande en partition i singleton-uppsättningar). Med utgångspunkt från värdet 2, vid iteration , väljs. I så fall görs
med logaritmen tagen i bas , och den totala körtiden för algoritmen är
I tre dimensioner
För att generalisera denna konstruktion för det 3-dimensionella fallet bör en algoritm för att beräkna det 3-dimensionella konvexa skrovet av Preparata och Hong användas istället för Graham-skanning , och en 3-dimensionell version av Jarviss marsch måste användas. Tidskomplexiteten förblir .
Pseudokod
I följande pseudokod är text mellan parenteser och i kursiv stil kommentarer. För att till fullo förstå följande pseudokod, rekommenderas det att läsaren redan är bekant med Graham scan och Jarvis march -algoritmer för att beräkna det konvexa skrovet, av en uppsättning punkter, .
- Inmatning: Ställ in med punkter.
- Utdata: Ställ in med -punkter, det konvexa skrovet på .
- (Välj en punkt av som garanterat är i : till exempel punkten med den lägsta y-koordinaten.)
- (Denna operation tar tid: t.ex. kan vi helt enkelt iterera genom .)
- ( används i Jarvis march-delen av denna Chans algoritm,
- så att för att beräkna den andra punkten, , i det konvexa skrovet på .)
- (Obs! är inte en punkt av .)
- (För mer information, se kommentarerna nära motsvarande del av Chans algoritm.)
- (Notera: , antalet punkter i det slutliga konvexa skrovet av , är inte känd.)
- (Detta är iterationerna som behövs för att upptäcka värdet av , vilket är en uppskattning av .)
- ( krävs för att denna Chans algoritm ska hitta det konvexa skrovet för )
- (Mer specifikt vill vi ha , för att inte utföra för många onödiga iterationer
- och så att tidskomplexiteten för denna Chans algoritm är )
- (Som förklarat ovan i den här artikeln används en strategi där som mest iterationer krävs för att hitta .)
- (Obs: den sista kanske inte är lika med , men den är aldrig mindre än och större än .)
- (Ändå stoppar denna Chans algoritm när iterationer av den yttersta slingan har utförts,
- det vill säga även om utförs inte iterationer av den yttersta slingan.)
- (För mer information, se Jarvis-marschdelen av denna algoritm nedan, där returneras om . )
-
för do
- (Ställ in parameter för den aktuella iterationen. Ett "kvadreringsschema" används enligt beskrivningen ovan i den här artikeln.
- Det finns andra scheman: till exempel "fördubblingsschemat", där , för .
- Om "dubbleringsschemat" används är den resulterande tidskomplexiteten för denna Chans algoritm . )
- (Initiera en tom lista (eller array) för att lagra punkterna för det konvexa skrovet på , eftersom de finns.)
- (Godyckligt delad uppsättning punkter till delmängder av ungefär element vardera.)
- (beräkna konvext skrov av alla delmängder av punkter, .)
- (Det tar )
- Om så är tidskomplexiteten .)
-
för do
- (beräkna det konvexa skrovet för delmängd , , med Graham-skanning, som tar tid .)
- ( är det konvexa skrovet av delmängden av punkter .)
- (Vid denna punkt, de konvexa skroven av respektive delmängder av punkterna har varit beräknad.)
- (Använd nu en modifierad version av Jarvis march -algoritmen för att beräkna det konvexa skrovet för )
- (Jarvis march uppträder i tid, där är antalet inmatningspunkter och är antalet punkter i det konvexa skrovet.)
- (Med tanke på att Jarvis march är en utdatakänslig algoritm , kör den tiden beror på storleken på det konvexa skrovet, )
- (I praktiken betyder det att Jarvis march utför iterationer av sin yttersta slinga.
- Vid var och en av dessa iterationer utför den högst iterationer av sin innersta slinga.)
- (Vi vill ha , så vi vill inte utföra fler än iterationer i följande yttre slinga.)
- (Om den aktuella är mindre än , dvs , det konvexa skrovet på kan inte hittas.)
- (I denna modifierade version av Jarvis march utför vi en operation inuti den innersta slingan som tar tid.
- Därför är den totala tidskomplexiteten för denna modifierade version
- Om , då är tidskomplexiteten )
- för do
- (Obs: här är en punkt i det konvexa skrovet av redan känd, det vill säga .)
- ( I denna inre for- loop kan möjliga nästa punkter vara på det konvexa skrovet av , beräknas.)
- (Var och en av dessa möjliga nästa punkter kommer från en annan :
- det vill säga är en möjlig nästa punkt på det konvexa skrovet av som är en del av det konvexa skrovet av .)
- (Obs: beror på : det vill säga för varje iteration , finns det möjliga nästa punkter på det konvexa skrovet av .)
- (Obs: vid varje iteration , endast en av punkterna bland läggs till det konvexa skrovet av .)
-
för do
- ( hittar punkten så att vinkeln är maximerad [ varför? ] ,
- där är vinkeln mellan vektorerna och . Sådan lagras i )
- (Vinklar behöver inte beräknas direkt: orienteringstestet kan användas [ hur? ] .)
- ( kan utföras i tid [ hur? ] .)
- (Obs: vid iterationen , och är kända och är en punkt i det konvexa skrovet av :
- i detta fall är det punkten av med den lägsta y-koordinaten.)
- punkten vinkeln varför ? ] för att vara nästa punkt på det konvexa skrovet av .)
- (Jarvis march avslutas när nästa valda punkt på det konvexa skrovet, , är startpunkten, .)
-
om
- (Återställ det konvexa skrovet på som innehåller poäng.)
- (Obs: naturligtvis behöver du inte returnera vilket är lika med .)
- return
-
annars
- (Om en punkt inte har hittats efter , sedan .)
- (Vi måste börja om med ett högre värde för .)
Genomförande
Chans papper innehåller flera förslag som kan förbättra algoritmens praktiska prestanda, till exempel:
- När du beräknar de konvexa skroven för delmängderna, eliminera de punkter som inte finns i det konvexa skrovet från beaktande vid efterföljande avrättningar.
- De konvexa skroven av större punktuppsättningar kan erhållas genom att slå samman tidigare beräknade konvexa skrov, istället för att räkna om från grunden.
- Med ovanstående idé ligger den dominerande kostnaden för algoritmen i förbearbetningen, dvs. beräkningen av gruppernas konvexa skrov. För att minska denna kostnad kan vi överväga att återanvända skrov som beräknats från föregående iteration och slå samman dem när gruppstorleken ökar.
Tillägg
Chans papper innehåller några andra problem vars kända algoritmer kan göras optimalt utdatakänsliga med hans teknik, till exempel:
- Beräknar det nedre enveloppet för en uppsättning av linjesegment, som definieras som den nedre gränsen för den ogränsade trapets som bildas av korsningar.
- Hershberger gav en algoritm som kan snabbas upp till , där h är antalet kanter i kuvertet
- Konstruera utdatakänsliga algoritmer för högre dimensionella konvexa skrov. Med användning av grupperingspunkter och effektiva datastrukturer komplexitet uppnås förutsatt att h är av polynomordning i .