A pergunta pode ser lida de várias maneiras. Interpreto que isso significa que você tem um grande número de pontos e pretende sondá-los repetidamente com pontos arbitrários, dados como pares de coordenadas, e deseja obter os n pontos mais próximos da sonda, com n fixado previamente. (Em princípio, se n variar, você poderá configurar uma estrutura de dados para todos os n possíveis e selecioná-la no tempo O (1) com cada análise: isso pode levar um tempo de configuração muito longo e exigir muita RAM, mas nós são instruídos a ignorar essas preocupações.)
Crie o diagrama Voronoi de ordem n de todos os pontos. Isso divide o plano em regiões conectadas, cada uma com os mesmos n vizinhos. Isso reduz a situação ao problema do ponto no polígono, que tem muitas soluções eficientes.
Usando uma estrutura de dados vetoriais para o diagrama de Voronoi, as pesquisas point-in-polygon levarão tempo O (log (n)). Para fins práticos, você pode fazer esse O (1) com um coeficiente implícito extremamente pequeno, simplesmente criando uma versão rasterizada do diagrama. Os valores das células na varredura são: (i) um ponteiro para uma lista dos n pontos mais próximos ou (ii) uma indicação de que essa célula se estende por duas ou mais regiões no diagrama. O teste para um ponto arbitrário em (x, y) se torna:
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 obter o desempenho O (1), a malha rasterizada deve ser suficientemente fina para que relativamente poucos pontos de sonda caiam nas células que atravessam várias regiões de Voronoi. Isso sempre pode ser realizado, com uma despesa potencialmente grande em armazenamento para as grades.