stringtranslate.com

Algoritmo de Chan

Una demostración en 2D del algoritmo de Chan. Sin embargo, tenga en cuenta que el algoritmo divide los puntos de manera arbitraria, no por la coordenada x.

En geometría computacional , el algoritmo de Chan , [1] llamado así por Timothy M. Chan , es un algoritmo óptimo sensible a la salida para calcular la envoltura convexa de un conjunto de puntos, en un espacio bidimensional o tridimensional. El algoritmo lleva tiempo, donde es el número de vértices de la salida (la envoltura convexa). En el caso planar, el algoritmo combina un algoritmo ( Graham scan , por ejemplo) con Jarvis march ( ), para obtener un tiempo óptimo. El algoritmo de Chan es notable porque es mucho más simple que el algoritmo de Kirkpatrick-Seidel , y se extiende naturalmente al espacio tridimensional. Este paradigma [2] ha sido desarrollado independientemente por Frank Nielsen en su tesis doctoral. [3]

Algoritmo

Descripción general

Una sola pasada del algoritmo requiere un parámetro que esté entre 0 y (número de puntos de nuestro conjunto ). Lo ideal sería que , pero , el número de vértices en la envoltura convexa de salida, no se conozca al principio. Se realizan varias pasadas con valores crecientes de que luego finalizan cuando (ver más abajo sobre la elección del parámetro ).

El algoritmo comienza dividiendo arbitrariamente el conjunto de puntos en subconjuntos con como máximo puntos cada uno; observe que .

Para cada subconjunto , calcula la envoltura convexa, , utilizando un algoritmo (por ejemplo, el escaneo de Graham ), donde es el número de puntos en el subconjunto. Como hay subconjuntos de puntos cada uno, esta fase lleva tiempo.

Durante la segunda fase, se ejecuta la marcha de Jarvis , haciendo uso de las (mini) envolturas convexas precalculadas, . En cada paso de este algoritmo de la marcha de Jarvis, tenemos un punto en la envoltura convexa (al principio, puede ser el punto en con la coordenada y más baja, que se garantiza que está en la envoltura convexa de ), y necesitamos encontrar un punto tal que todos los demás puntos de estén a la derecha de la línea [ aclaración necesaria ] , donde la notación simplemente significa que el siguiente punto, es decir , se determina como una función de y . La envoltura convexa del conjunto , , es conocida y contiene como máximo puntos (enumerados en sentido horario o antihorario), lo que permite calcular en el tiempo mediante búsqueda binaria [ ¿ cómo? ] . Por lo tanto, el cálculo de para todos los subconjuntos se puede hacer en el tiempo. Entonces, podemos determinar usando la misma técnica que normalmente se usa en la marcha de Jarvis, pero solo considerando los puntos (es decir, los puntos en las mini envolturas convexas) en lugar de todo el conjunto . Para esos puntos, una iteración de la marcha de Jarvis es que es despreciable en comparación con el cálculo para todos los subconjuntos. La marcha de Jarvis se completa cuando el proceso se ha repetido veces (porque, en la forma en que funciona la marcha de Jarvis, después de como máximo iteraciones de su bucle más externo, donde es el número de puntos en la envoltura convexa de , debemos haber encontrado la envoltura convexa), por lo tanto, la segunda fase toma tiempo, equivalente al tiempo si es cercano a (ver más abajo la descripción de una estrategia a elegir de manera que este sea el caso).

Ejecutando las dos fases descritas anteriormente, se calcula la envoltura convexa de puntos en el tiempo.

Elección del parámetrometro

Si se elige un valor arbitrario para , puede ocurrir que . En ese caso, después de los pasos de la segunda fase, interrumpimos la marcha de Jarvis porque llevarla hasta el final llevaría demasiado tiempo. En ese momento, se habrá gastado un tiempo y no se habrá calculado la envoltura convexa.

La idea es realizar múltiples pasadas del algoritmo con valores crecientes de ; cada pasada termina (con éxito o sin éxito) en el tiempo. Si aumenta demasiado lentamente entre pasadas, el número de iteraciones puede ser grande; por otro lado, si aumenta demasiado rápido, la primera para la que el algoritmo termina con éxito puede ser mucho mayor que , y producir una complejidad .

Estrategia de cuadratura

Una posible estrategia es elevar al cuadrado el valor de en cada iteración, hasta un valor máximo de (que corresponde a una partición en conjuntos singleton). [4] Partiendo de un valor de 2, en la iteración se elige . En ese caso, se realizan iteraciones, dado que el algoritmo termina una vez que tenemos

con el logaritmo tomado en base , y el tiempo total de ejecución del algoritmo es

En tres dimensiones

Para generalizar esta construcción para el caso tridimensional, se debe utilizar un algoritmo para calcular la envoltura convexa tridimensional de Preparata y Hong en lugar del escaneo de Graham, y se debe utilizar una versión tridimensional de la marcha de Jarvis. La complejidad temporal sigue siendo . [1]

Pseudocódigo

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 ya esté familiarizado con los algoritmos de Graham Scan y Jarvis March para calcular la envoltura convexa, , de un conjunto de puntos, .

Entrada: Conjunto con puntos.
Salida: Conjunto con puntos, la envoltura convexa de .
(Elija un punto que esté garantizado que esté en : por ejemplo, el punto con la coordenada y más baja).
(Esta operación lleva tiempo: por ejemplo, podemos simplemente iterar a través de ).
( se utiliza en la parte de la marcha de Jarvis de este algoritmo de Chan,
de modo que para calcular el segundo punto, , en la envoltura convexa de .)
(Nota: no es un punto de .)
(Para más información, consulte los comentarios cerca de la parte correspondiente del algoritmo de Chan).
(Nota: , no se conoce el número de puntos en la envoltura convexa final de .)
(Estas son las iteraciones necesarias para descubrir el valor de , que es una estimación de ).
( es necesario para que este algoritmo de Chan encuentre la envoltura convexa de .)
(Más específicamente, queremos , para no realizar demasiadas iteraciones innecesarias
y entonces la complejidad temporal de este algoritmo de Chan es .)
(Como se explicó anteriormente en este artículo, se utiliza una estrategia en la que se requieren como máximo iteraciones para encontrar ).
(Nota: el final puede no ser igual a , pero nunca es menor que ni mayor que .)
(Sin embargo, este algoritmo de Chan se detiene una vez que se realizan las iteraciones del bucle más externo,
es decir, incluso si , no realiza iteraciones del bucle más externo).
(Para obtener más información, consulte la parte de la marcha de Jarvis de este algoritmo a continuación, donde se devuelve si ).
para hacer
(Establecer parámetro para la iteración actual. Se utiliza un "esquema de cuadratura" como se describe anteriormente en este artículo.
Existen otros esquemas: por ejemplo, el "esquema de duplicación", donde , para .
Sin embargo, si se utiliza el "esquema de duplicación", la complejidad temporal resultante de este algoritmo de Chan es .)
(Inicialice una lista (o matriz) vacía para almacenar los puntos de la envoltura convexa de , a medida que se encuentran).
(Dividir arbitrariamente el conjunto de puntos en subconjuntos de aproximadamente elementos cada uno).
(Calcular la envoltura convexa de todos los subconjuntos de puntos, .)
(Toma tiempo.)
Si , entonces la complejidad temporal es .)
para hacer
(Calcule la envoltura convexa del subconjunto , , utilizando el escaneo de Graham, lo que lleva tiempo).
( es la envoltura convexa del subconjunto de puntos .)
(En este punto, se han calculado las envolturas convexas de los respectivos subconjuntos de puntos ).
(Ahora, utilice una versión modificada del algoritmo de marcha de Jarvis para calcular la envoltura convexa de ).
(La marcha de Jarvis se realiza a tiempo, donde es el número de puntos de entrada y es el número de puntos en la envoltura convexa).
(Dado que Jarvis march es un algoritmo sensible a la salida , su tiempo de ejecución depende del tamaño de la envoltura convexa ).
(En la práctica, significa que Jarvis march realiza iteraciones de su bucle más externo.
En cada una de estas iteraciones, realiza como máximo iteraciones de su bucle más interno).
(Queremos , por lo que no queremos realizar más de iteraciones en el siguiente bucle externo).
(Si la corriente es menor que , es decir , no se puede encontrar la envoltura convexa de ).
(En esta versión modificada de la marcha de Jarvis, realizamos una operación dentro del bucle más interno que lleva tiempo.
Por lo tanto, la complejidad temporal total de esta versión modificada es
Si , entonces la complejidad temporal es .)
para hacer
(Nota: aquí ya se conoce un punto en la envoltura convexa de , es decir .)
(En este bucle for interno, se calculan los posibles próximos puntos que estarán en la envoltura convexa de , , ).
(Cada uno de estos posibles puntos siguientes proviene de un origen diferente :
es decir, es un posible siguiente punto en la envoltura convexa de la cual es parte de la envoltura convexa de .)
(Nota: depende de : es decir, para cada iteración , hay posibles próximos puntos que pueden estar en la envoltura convexa de .)
(Nota: en cada iteración , solo uno de los puntos entre se agrega a la envoltura convexa de ).
para hacer
( encuentra el punto tal que el ángulo se maximiza [ ¿por qué? ] ,
donde es el ángulo entre los vectores y . Tal se almacena en .)
(No es necesario calcular los ángulos directamente: se puede utilizar la prueba de orientación [ ¿cómo? ] .)
( se puede realizar a tiempo [ ¿cómo? ] )
(Nota: en la iteración , se conoce y es un punto en la envoltura convexa de :
En este caso, es el punto con la coordenada y más baja).
(Elija el punto que maximiza el ángulo [ ¿por qué? ] para que sea el siguiente punto en la envoltura convexa de .)
(La marcha de Jarvis termina cuando el siguiente punto seleccionado en la envoltura convexa, , es el punto inicial, .)
si
(Devuelve la envoltura convexa que contiene puntos.)
(Nota: por supuesto, no es necesario devolver que es igual a ).
devolver
demás
(Si después de iteraciones no se ha encontrado un punto tal que , entonces .)
(Necesitamos empezar de nuevo con un valor más alto para .)

Implementación

El artículo de Chan contiene varias sugerencias que pueden mejorar el rendimiento práctico del algoritmo, por ejemplo:

Extensiones

El artículo de Chan contiene algunos otros problemas cuyos algoritmos conocidos pueden lograrse con una salida óptima utilizando su técnica, por ejemplo:

Véase también

Referencias

  1. ^ ab Chan, Timothy M. (1996). "Algoritmos de envoltura convexa sensibles a la salida óptima en dos y tres dimensiones". Geometría discreta y computacional . 16 (4): 361–368. doi : 10.1007/BF02712873 .
  2. ^ Nielsen, Frank (2000). "Agrupamiento y consulta: un paradigma para obtener algoritmos sensibles a la salida". Geometría discreta y computacional . Apuntes de clase en informática. Vol. 1763. págs. 250–257. doi : 10.1007/978-3-540-46515-7_21 . ISBN . 978-3-540-67181-7.
  3. ^ Frank Nielsen. "Geometría computacional adaptativa". Tesis doctoral, INRIA , 1996.
  4. ^ Chazelle, Bernard ; Matoušek, Jiří (1995). "Desaleatorización de un algoritmo de envoltura convexa sensible a la salida en tres dimensiones". Geometría computacional . 5 : 27–32. doi : 10.1016/0925-7721(94)00018-Q .
  5. ^ Hershberger, John (1989). "Encontrar la envolvente superior de n segmentos de línea en tiempo O(n log n)". Information Processing Letters . 33 (4): 169–174. doi :10.1016/0020-0190(89)90136-1.