Chens algoritm är en algoritm för att konstruera det konvexa skrovet av en ändlig uppsättning punkter på ett plan. Det är en kombination av två långsammare algoritmer ( Graham-skanning och Jarvis-inpackning ). Nackdelen med Graham-skanning är behovet av att sortera alla punkter efter polär vinkel, vilket är ganska tidskrävande . Jarvis-inpackning kräver iteration över alla punkter för var och en av punkterna på det konvexa skrovet , vilket i värsta fall tar . Uppkallad efter Timothy M. Chan .
Tanken med Chens algoritm är att initialt dela upp alla punkter i grupper av bitar i varje. Följaktligen är antalet grupper lika med . För var och en av grupperna konstrueras ett konvext skrov genom att skanna Graham efter , det vill säga att det tar tid för alla grupper .
Sedan, med början från den nedre vänstra punkten, konstrueras ett gemensamt Jarvis konvext skrov för de resulterande skroven. I det här fallet är nästa lämpliga punkt för det konvexa skrovet bakom , eftersom för att hitta en punkt med en maximal tangent med avseende på den betraktade punkten i -gon, räcker det att spendera (punkterna i -gon var sorterade efter polär vinkel under exekveringen av Graham-skanningsalgoritmen). Som ett resultat tar det tid att ta sig runt .
Det vill säga, Chans algoritm fungerar för , och om du får , då för .
Skrov (P, m) 1) ta . Dela upp i disjunktiva delmängder av kardinalitet högst ; 2) för i = 1 till r gör : (a) beräkna Grahams konvexa skrov ( ), lagra topparna i en polärt sorterad array; 3) ta den vänstra och lägsta punkten från ; 4) för k = 1 till m gör (a) för i = 1 till r hitta och kom ihåg punkten från med den maximala vinkeln ; (b) ta som en punkt från med den maximala vinkeln ; (c) om retur ; 5) returnera liten, försök igen;Det är klart att Jarvis-traversalen, och därmed hela algoritmen, bara kommer att fungera korrekt om , men hur vet man i förväg hur många punkter det kommer att finnas i det konvexa skrovet? Det är nödvändigt att köra algoritmen flera gånger, välja och, om , kommer algoritmen att returnera ett fel. Om du gör urvalet genom binär sökning på , kommer du att sluta med tiden , som är ganska lång.
Processen kan påskyndas genom att börja med ett litet värde och sedan öka det avsevärt tills det fungerar . Ta till exempel . I det här fallet tar -i iterationen . Sökprocessen avslutas när , dvs ( är den binära logaritmen).
Till slut .
ChanHull (P) för t = 1 till n gör: (a) ta ; (b) L = Hull (P, m); (c) om L != " liten, försök igen" returnera L;