La pregunta podría leerse de varias maneras. Interpreto que significa que tiene una gran cantidad de puntos y que tiene la intención de sondearlos repetidamente con puntos arbitrarios, dados como pares de coordenadas, y desea obtener los n puntos más cercanos a la sonda, con n fijado de antemano. (En principio, si n variará, podría configurar una estructura de datos para cada n posible y seleccionarla en tiempo O (1) con cada sonda: esto podría llevar un tiempo de configuración muy largo y requerir una gran cantidad de RAM, pero se les dice que ignoren tales preocupaciones).
Construye el diagrama order-n Voronoi de todos los puntos. Esto divide el plano en regiones conectadas, cada una de las cuales tiene los mismos n vecinos. Esto reduce la situación al problema de punto en el polígono, que tiene muchas soluciones eficientes.
Usando una estructura de datos vectoriales para el diagrama de Voronoi, las búsquedas de punto en el polígono tomarán tiempo O (log (n)). Para fines prácticos, puede hacer este O (1) con un coeficiente implícito extremadamente pequeño simplemente creando una versión ráster del diagrama. Los valores de las celdas en el ráster son (i) un puntero a una lista de los n puntos más cercanos o (ii) una indicación de que esta celda se extiende entre dos o más regiones en el diagrama. La prueba para un punto arbitrario en (x, y) se convierte en:
Fetch the cell value for (x,y).
If the value is a list of points, return it.
Else apply a vector point-in-polygon algorithm to (x,y).
Para lograr el rendimiento de O (1), la malla de trama tiene que ser lo suficientemente fina como para que relativamente pocos puntos de sonda caigan en celdas que se extienden a horcajadas sobre múltiples regiones de Voronoi. Esto siempre se puede lograr, con un gasto potencialmente grande en almacenamiento para las redes.