Necesito resolver el problema del algoritmo de casco convexo dinámico, es decir, mantener el casco convexo de los puntos 2D, donde puedo agregar y eliminar puntos.¿Algoritmo de casco convexo dinámico sublineal pero simple?
El enfoque ingenuo es claramente O(N)
; cada vez que se agrega/elimina uno de los puntos N
, recalculamos el casco convexo desde cero. Sin embargo, no puedo permitirme el tiempo lineal, entonces estoy buscando un algoritmo sublineal. Hasta ahora, he encontrado un montón de papel que describen un algoritmo sofisticado con límites de tiempo locos que tardarían siglos en implementarse. Incluso el algoritmo eficiente más antiguo, debido a Overmars y Leeuween, que es O(log^2 N)
parece demasiado complicado. (Como es habitual, la mayor parte de los algoritmos descritos en esos documentos tienen toneladas de dependencias en términos de estructuras/algoritmos de otros documentos, referenciados)
Estoy buscando algo más simple, no necesariamente novela, que lleva a cabo mejor que lineal en el el peor caso (por ejemplo, O(sqrt N)
). Finalmente, no me importa si el tiempo se amortiza. ¿Algunas ideas?
(Por simple, me refiero sobre todo algo que no requiere más que unos pocos cientos de líneas de código.)
No diría que la solución de complejidad lineal es ingenua, ya que encontrar el casco convexo de N puntos en tiempo lineal es ingenuo. De hecho, no conozco ese algoritmo que pueda resolver el problema incluso para un solo conjunto en tiempo lineal. –
izo es correcto: hay un límite inferior de Omega (n log n) (en el modelo computacional más común). –
Por 'O (N)', quiero decir el costo por operación. El enfoque ingenuo consiste en mantener los puntos ordenados y realizar el escaneo de Graham en 'O (N)' en cada paso (después de cada extracción/inserción). – eold