La question peut être lue de plusieurs manières. Je l'interprète comme signifiant que vous avez un grand nombre de points et que vous avez l'intention de les sonder à plusieurs reprises avec des points arbitraires, donnés sous forme de paires de coordonnées, et que vous souhaitez obtenir les n points les plus proches de la sonde, avec n fixé au préalable. (En principe, si n varie, vous pouvez configurer une structure de données pour chaque n possible et la sélectionner en temps O (1) avec chaque sonde: cela pourrait prendre un temps de configuration très long et nécessiter beaucoup de RAM, mais nous sont invités à ignorer ces préoccupations.)
Construisez le diagramme Voronoi order-n de tous les points. Cela divise l'avion en régions connectées, chacune ayant les mêmes n voisins. Cela réduit la situation au problème du point dans le polygone, qui a de nombreuses solutions efficaces.
En utilisant une structure de données vectorielles pour le diagramme de Voronoi, les recherches ponctuelles dans un polygone prendront O (log (n)). Pour des raisons pratiques, vous pouvez créer cet O (1) avec un coefficient implicite extrêmement faible simplement en créant une version raster du diagramme. Les valeurs des cellules du raster sont soit (i) un pointeur vers une liste des n points les plus proches, soit (ii) une indication que cette cellule chevauche deux régions ou plus dans le diagramme. Le test d'un point arbitraire en (x, y) devient:
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).
Pour obtenir des performances O (1), le maillage raster doit être suffisamment fin pour que relativement peu de points de sonde tombent dans des cellules qui chevauchent plusieurs régions de Voronoi. Cela peut toujours être accompli, avec des dépenses potentiellement importantes en stockage pour les grilles.