Algoritmul lui Chen este un algoritm pentru construirea carcasei convexe a unui set finit de puncte pe un plan. Este o combinație de doi algoritmi mai lenți ( scanarea Graham și împachetarea Jarvis ). Dezavantajul scanării Graham este necesitatea de a sorta toate punctele după unghiul polar , ceea ce necesită destul de mult timp . Înfășurarea Jarvis necesită repetarea tuturor punctelor pentru fiecare dintre punctele carcasei convexe , ceea ce în cel mai rău caz necesită . Numit după Timothy M. Chan .
Ideea algoritmului lui Chen este de a împărți inițial toate punctele în grupuri de bucăți din fiecare. În consecință, numărul de grupuri este egal cu . Pentru fiecare dintre grupuri, o carcasă convexă este construită prin scanarea Graham pentru , adică va dura timp pentru toate grupurile .
Apoi, pornind din punctul din stânga jos, se construiește o carcasă convexă Jarvis comună pentru corpurile rezultate. În acest caz, următorul punct potrivit pentru învelișul convex este în spatele lui , deoarece pentru a găsi un punct cu tangentă maximă față de punctul considerat din -gon, este suficient să cheltuiți (punctele din -gon au fost sortate după unghi polar în timpul execuției algoritmului de scanare Graham). Drept urmare, este nevoie de timp pentru a vă deplasa .
Adică, algoritmul lui Chan funcționează pentru , iar dacă obțineți , atunci pentru .
Cocă (P, m) 1) ia . Împărțiți în submulțimi disjunctive de cardinalitate nu mai mult de ; 2) pentru i = 1 la r face : (a) calculați corpul convex Graham ( ), stocați vârfurile într-o matrice sortată polar; 3) luați punctul cel mai din stânga și cel mai jos din ; 4) pentru k = 1 la m faceți (a) pentru i = 1 la r găsiți și amintiți - vă punctul din unghiul maxim ; (b) luați ca punct din unghiul maxim ; (c) dacă se întoarce ; 5) reveniți mic, încercați din nou;Este clar că traversarea Jarvis și, prin urmare, întregul algoritm, va funcționa corect numai dacă , dar de unde știi dinainte câte puncte vor fi în carcasa convexă? Este necesar să rulați algoritmul de mai multe ori, alegând și, dacă , atunci algoritmul va returna o eroare. Dacă faceți selecția prin căutare binară pe , atunci veți ajunge cu timpul , care este destul de lung.
Procesul poate fi accelerat pornind cu o valoare mică și apoi crescând-o semnificativ până când funcționează . De exemplu, luați . În acest caz, iterația -i va dura . Procesul de căutare se va încheia când , adică ( este logaritmul binar).
In sfarsit .
ChanHull (P) pentru t = 1 la n face: (a) ia ; (b) L = Cocă (P, m); (c) dacă L != „ mic, încearcă din nou” returnează L;