1

Предположим, что облако точек имеет 50 000 точек в пространстве x-y-z 3D. Для каждой точки этого облака, какие алгоритмы или строгие данные должны быть реализованы, чтобы найти k соседей данной точки, которые находятся на расстоянии [R, r]? Наивный способ состоит в том, чтобы пройти каждый из 49 999 пунктов для каждой из 50 000 точек и выполнить метрическое тестирование. Но этот подход займет много времени. Точно так же, как есть kd tree, чтобы найти ближайшего соседа за небольшую паузу, так есть ли реализация DS/algo в реальном времени там, чтобы предварительно обработать облака точек, чтобы достичь цели в кратчайшие сроки?Алгоритм поиска k соседей в определенном диапазоне?

+0

предварительный процесс? Просто просмотрите его один раз и сохраните список индексов для каждой близкой точки. O (n^2), но если вы делаете это только один раз, 50 тысяч очков - это не огромная сумма. – twentylemon

+0

@twentylemon Я искал свою проблему. Обратитесь к редактированию и предположим, что n = 200 000. – userzizzy

ответ

1

Ваша проблема связана с темой Nearest Neighbor Search, или, точнее, k-Nearest Neighbor Search. Ответ на ваш вопрос зависит от структуры данных, которую вы используете для хранения баллов. Если вы используете R-trees или такие варианты, как R*-trees, и вы выполняете несколько поисков в своей базе данных, вы, вероятно, найдете значительное улучшение производительности в двух или трехмерном пространстве по сравнению с наивным линейным поиском. В более высоких измерениях схемы разбиения пространства имеют тенденцию к ухудшению линейного поиска.

0

Если вы используете обычную евклидову метрику, вы можете пройти через список три раза и извлечь те точки, которые внутри R в каждом измерении, по существу извлекая охватывающий куб. Поиск в результирующем списке все равно будет O (n^2), но на гораздо меньшем n.

+0

Извлечение 2R куба O (n^2). – stefan

0

Существуют эффективные алгоритмы (в среднем, для случайных данных), см. Nearest neighbor search.

Ваш подход не эффективен, но прост.

Прочтите, проверьте требования и вернитесь, чтобы мы могли помочь.

+0

Спасибо за ссылку. Меня интересует: фиксированный радиус рядом соседей. Однако, если фиксированный радиус может быть переменным радиусом, ii будет работать лучше. – userzizzy

+0

Вы хотите использовать переменный радиус для каждой точки? – Elyasin

+0

Да, я бы хотел использовать переменный радиус. – userzizzy

1

Как уже упоминалось, для поиска NN вы можете использовать какой-либо древовидный алгоритм, например k-d-tree. Существуют версии, доступные для всех языков программирования.

Если ваше описание [R,r] предлагает полый шар, вы должны сравнить одноразовое тестирование (в пределах интервала) по сравнению с двумя этапами (тест-для-внешний и удаление образцов, которые проходят тест-для-внутреннего).

Вы также не указали требования к производительности (время или частоту кадров?) И ваше предполагаемое приложение (допустимый подход?).

+0

Мое предназначение - найти все возможные контактные точки в определенном облаке точек с помощью параллельного захвата захвата с двумя пальцами. O (n^2) кажется слишком большим. Могу ли я получить эффективность типа O (n logn)? – userzizzy

+0

деревья должны иметь O (n log n). взгляните на [облачную облачную библиотеку] (http://pointclouds.org/). для 3-х измерений октет может соответствовать. – stefan