У нас есть список x, y пар. Каждая пара представляет собой точку на двумерном пространстве. Я хочу найти ближайшую точку из этого списка, до определенной точки xq, yq. Каков наилучший критический для производительности алгоритм для этой проблемы? Лисп точек не изменится; что означает, что мне не нужно выполнять вставку и удаление. Я хочу просто найти ближайшего соседа целевой точки xq, yq в этом наборе.Лучший критически важный алгоритм для решения ближайшего соседства
Редактировать 1: Спасибо всем! Поскольку Stephan202 правильно догадался, я хочу сделать это неоднократно; как функция. Список не обязательно сортируется (на самом деле я не понимаю, как его можно отсортировать? Как таблица с первичным ключом из двух столбцов a и y? Если это поможет, я ее сортирую).
Я буду строить структуру данных на основе списка один раз, а затем я буду использовать эту созданную структуру данных в функции (если этот процесс сам по себе является релевантным).
Спасибо Яков; Кажется, что структура данных KD-Tree является хорошим кандидатом для ответа (и я чувствую, что это так. Я обновлю, когда получу некоторые релевантные результаты).
Редактировать 2: Я обнаружил, что эта проблема называется «ближайший сосед»!
Редактировать 3: Первый заголовок был «В поисках алгоритма (для пространственного запроса и пространственного индексирования) (ближайший сосед)»; Я выбрал новое название: «Лучший критически важный алгоритм для решения ближайшего соседства». Поскольку я не хочу выполнять операцию вставки и удаления по моим исходным данным, и я хочу, чтобы только ближайший из них к новой точке (которая не будет вставлена), я решил (в настоящее время) работать над KD-Trees. Спасибо всем!
Есть ли какая-либо структура в списке (например, отсортирована)? Вы хотите повторить эту операцию, или она будет выполнена один раз? Это релевантная информация, которую люди должны будут ответить на ваш вопрос. – Stephan202
У вас есть доступ к пространственной базе данных? –
Если список не сортирован и операция будет выполняться только один раз, вам придется выполнять линейный поиск по списку и, следовательно, не может быть лучше, чем O (n). Если вы собираетесь повторить операцию, вам нужно будет создать подходящее (дерево) представление списка на основе значений элемента x и y. – Stephan202