Питання можна було прочитати декількома способами. Я інтерпретую це так, що у вас є велика кількість точок, і ви маєте намір досліджувати їх неодноразово з довільними точками, заданими у вигляді пар координат, і хочете отримати 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) растрова сітка повинна бути достатньо тонкою, щоб порівняно мало точок зонду потрапляло в осередки, що обробляють кілька областей Вороного. Це завжди можна досягти, маючи великі витрати на зберігання сіток.