El algoritmo de Chen es un algoritmo para construir el casco convexo de un conjunto finito de puntos en un plano. Es una combinación de dos algoritmos más lentos ( escaneo de Graham y envoltura de Jarvis ). La desventaja del escaneo de Graham es la necesidad de clasificar todos los puntos por ángulo polar , lo que lleva bastante tiempo . La envoltura de Jarvis requiere iterar sobre todos los puntos para cada uno de los puntos del casco convexo , que en el peor de los casos toma . Nombrado por Timothy M. Chan .
La idea del algoritmo de Chen es dividir inicialmente todos los puntos en grupos de piezas en cada uno. En consecuencia, el número de grupos es igual a . Para cada uno de los grupos, se construye un casco convexo escaneando Graham para , es decir, tomará tiempo para todos los grupos .
Luego, comenzando desde el punto inferior izquierdo, se construye un casco convexo Jarvis común para los cascos resultantes. En este caso, el siguiente punto adecuado para el casco convexo está detrás , ya que para encontrar un punto con una tangente máxima con respecto al punto considerado en el -gon, basta gastar (los puntos en el -gon fueron ordenados por ángulo polar durante la ejecución del algoritmo de escaneo de Graham). Como resultado, se necesita tiempo para moverse .
Es decir, el algoritmo de Chan funciona para , y si obtiene , entonces para .
Casco (P, m) 1) tomar . Divida en subconjuntos disyuntivos de cardinalidad no más de ; 2) para i = 1 a r hacer : (a) calcule el casco convexo de Graham ( ), almacene los vértices en una matriz ordenada polar; 3) tomar el punto más a la izquierda y más bajo de ; 4) para k = 1 a m hacer (a) para i = 1 a r hacer encontrar y recordar el punto con el ángulo máximo ; (b) tomar como punto desde con el ángulo máximo ; (c) si regresa ; 5) devuelve pequeño, inténtalo de nuevo;Está claro que el recorrido de Jarvis, y por lo tanto todo el algoritmo, funcionará correctamente solo si , pero ¿cómo saber de antemano cuántos puntos habrá en el casco convexo? Es necesario ejecutar el algoritmo varias veces, eligiendo y, si , el algoritmo devolverá un error. Si realiza la selección mediante búsqueda binaria en , terminará con el tiempo , que es bastante largo.
El proceso se puede acelerar comenzando con un valor pequeño y luego aumentándolo significativamente hasta que funcione . Por ejemplo, tome . En este caso , la iteración -i tomará . El proceso de búsqueda terminará cuando , es decir, ( es el logaritmo binario).
Al final
ChanHull (P) para t = 1 an hacer: (a) tomar ; (b) L = Casco (P, m); (c) si L != " pequeño, inténtalo de nuevo" devuelve L;