Вопрос может быть прочитан несколькими способами. Я понимаю, что это означает, что у вас есть большое количество точек, и вы намереваетесь проверять их многократно с произвольными точками, заданными в виде координатных пар, и хотите получить n ближайших к зонду точек с заранее установленным n. (В принципе, если n будет меняться, вы можете настроить структуру данных для каждого возможного n и выбрать ее за O (1) раз для каждого зонда: это может занять очень длительное время установки и потребовать много оперативной памяти, но мы сказано игнорировать такие проблемы.)
Построить диаграмму порядка-Вороного всех точек. Это делит плоскость на связанные области, каждая из которых имеет одинаковые n соседей. Это сводит ситуацию к задаче точка-многоугольник, которая имеет много эффективных решений.
Используя векторную структуру данных для диаграммы Вороного, поиск точки в многоугольнике займет время O (log (n)). Для практических целей вы можете сделать это O (1) с чрезвычайно малым неявным коэффициентом, просто создав растровую версию диаграммы. Значения ячеек в растре являются либо (i) указателем на список из n ближайших точек, либо (ii) указанием на то, что эта ячейка расположена между двумя или более областями на диаграмме. Тест для произвольной точки в точке (x, y) становится:
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).
Чтобы достичь производительности O (1), растровая сетка должна быть достаточно тонкой, чтобы относительно небольшое количество зондов попадало в ячейки, которые охватывают несколько областей Вороного. Это всегда может быть достигнуто с потенциально большими затратами на хранение для сетей.