Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Пространственный запрос k-го ближайшего соседа точки

Автор вопроса: ameya.dubeyОтветов: 1

Я работаю над алгоритмом, которому постоянно требуется (евклидово) расстояние до k-й ближайшей точки из некоторой заданной точки запроса, взятой из вектора точек. Кроме того, мне постоянно нужно найти все точки в пределах заданного радиуса точки.

Я думаю об использовании деревьев k-d из библиотеки nanoflann. Однако функция knnSearch() возвращает все k ближайших соседей, что мне не нужно. (Хотя функция radiusSearch() меня вполне устраивает).

Есть ли более эффективный способ получить то, что мне нужно, кроме как каждый раз перебирать все k ближайших соседей? Лучшая структура данных или лучшая реализация? (Я использую С++.)

c++data-structuresknnspatialnearest-neighbor

Ответы

Ответ 1 · рейтинг 1 · gsamaras

Я думаю об использовании k-d деревьев

Отличный выбор для 2D или 3D.

kd-деревья - хороший выбор для низкоразмерных данных (которые, я полагаю, у вас есть, поскольку nanoflann "в основном оптимизирован для 2D или 3D-облаков точек").

Есть ли более эффективный способ получить то, что мне нужно, кроме как каждый раз перебирать все k ближайших соседей?

Вам нужен k-й ближайший сосед (NN), но при поиске дерева kd для k NN дорогостоящей операцией (с точки зрения времени) является поиск первого NN (что требует от вас спуска вниз по дереву, начиная с самого начала). корень к листу).

Поиск 2-го, 3-го или другого индексированного NN является относительно дешевым, и я очень сомневаюсь, что это повредит производительности (т.е. что получение k-го NN из k NN, возвращаемых деревом, будет узким местом).

Итак, я настоятельно рекомендую вам не беспокоиться об этом шаге.

Лучшая структура данных или лучшая реализация?

Я так не думаю. Я не использовал nanoflann, но использовал CGAL для такого рода запросов, и стоит попробовать (однако CGAL требует установки (не проще простого), а nanoflann - это просто заголовок).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы