
En geometría computacional, el algoritmo de Chan, que recibe su nombre de Timothy M. Chan, es un algoritmo sensible a la salida óptimo para calcular la envolvente convexa de un conjunto de puntos, en un espacio bidimensional o tridimensional. El algoritmo requiere un tiempo , donde es el número de vértices de la salida (la envolvente convexa). En el caso plano, el algoritmo combina un algoritmo (el método de Graham, por ejemplo) con la marcha de Jarvis () para obtener un tiempo óptimo. El algoritmo de Chan destaca por ser mucho más sencillo que el Algoritmo de Kirkpatrick-Seidel y por extenderse naturalmente al espacio tridimensional. Este paradigma fue desarrollado independientemente por Frank Nielsen en su tesis doctoral.
Una sola pasada del algoritmo requiere un parámetro que se encuentra entre 0 y (número de puntos del conjunto ). Idealmente, , pero , el número de vértices en la envolvente convexa de salida, se desconoce al inicio. Se realizan múltiples pasadas con valores crecientes de , que finalizan cuando alcanza un valor determinado. Véase más abajo la elección del parámetro .
El algoritmo comienza dividiendo arbitrariamente el conjunto de puntos en subconjuntos con un máximo de puntos cada uno; nótese que .
Para cada subconjunto , calcula la envolvente convexa, , utilizando un algoritmo (por ejemplo, el método de Graham), donde es el número de puntos en el subconjunto. Dado que hay subconjuntos de puntos cada uno, esta fase requiere un tiempo .
Durante la segunda fase, se ejecuta la marcha de Jarvis, utilizando las (mini) envolventes convexas precalculadas, . En cada paso de este algoritmo de marcha de Jarvis, se tiene un punto en la envolvente convexa (al principio, puede ser el punto en con la coordenada y más baja, que está garantizado que está en la envolvente convexa de ), y se necesita encontrar un punto tal que todos los demás puntos de estén a la derecha de la línea , donde la notación simplemente significa que el siguiente punto, es decir, , se determina como una función de y . Se conoce la envolvente convexa del conjunto , , y contiene como máximo puntos (ordenados en sentido horario o antihorario), lo que permite calcular en tiempo mediante búsqueda binaria. Por lo tanto, el cálculo de para todos los subconjuntos se puede realizar en tiempo . Luego, se puede determinar utilizando la misma técnica que se usa normalmente en la marcha de Jarvis, pero considerando solo los puntos (es decir, los puntos en las mini envolventes convexas) en lugar de todo el conjunto . Para esos puntos, una iteración de la marcha de Jarvis es , lo cual es insignificante comparado con el cálculo para todos los subconjuntos. La marcha de Jarvis finaliza cuando el proceso se ha repetido veces (porque, según su funcionamiento, tras como máximo iteraciones de su bucle más externo, donde es el número de puntos en la envolvente convexa de , se debe haber encontrado dicha envolvente). Por lo tanto, la segunda fase requiere un tiempo de , equivalente a un tiempo de si está cerca de (véase más abajo la descripción de una estrategia para elegir de forma que esto ocurra).
Al ejecutar las dos fases descritas anteriormente, la envolvente convexa de puntos se calcula en tiempo .
Si se elige un valor arbitrario para , puede ocurrir que . En ese caso, después de pasos en la segunda fase, se interrumpe la marcha de Jarvis, ya que ejecutarla hasta el final llevaría demasiado tiempo.
En ese momento, se habrá consumido un tiempo y la envolvente convexa no se habrá calculado.
La idea es realizar múltiples pasadas del algoritmo con valores crecientes de ; cada pasada finaliza (con éxito o sin éxito) en tiempo . Si aumenta demasiado lentamente entre pasadas, el número de iteraciones puede ser grande. Por otro lado, si aumenta demasiado rápido, el primer para el cual el algoritmo finaliza con éxito puede ser mucho mayor que , y producir una complejidad .
Una estrategia posible consiste en elevar al cuadrado el valor de en cada iteración, hasta un valor máximo de (que corresponde a una partición en conjuntos unitarios). Partiendo de un valor de 2, en la iteración se elige . En ese caso, se realizan iteraciones, dado que el algoritmo finaliza una vez que se alcanza:
con logaritmo tomado en base , y el tiempo total de ejecución del algoritmo es:
Para generalizar esta construcción al caso tridimensional, se debe utilizar el algoritmo de Preparata y Hong para calcular la envolvente convexa tridimensional en lugar del método de Graham, y una versión tridimensional de la marcha de Jarvis. La complejidad temporal permanece como .
En el siguiente pseudocódigo, el texto entre paréntesis y en cursiva son comentarios. Para comprender completamente el siguiente pseudocódigo, se recomienda que el lector esté familiarizado con los algoritmos del método de Graham y de la marcha de Jarvis para calcular la envolvente convexa, , de un conjunto de puntos .
El artículo de Chan contiene varias sugerencias que pueden mejorar el rendimiento práctico del algoritmo, por ejemplo:
El artículo de Chan contiene otros problemas cuyos algoritmos conocidos pueden optimizarse para ser sensibles a la salida utilizando su técnica, por ejemplo: