Поиск ближайших соседей с периодическими граничными условиями

В кубическом ящике у меня большие точки сбора в R ^ 3. Я бы хотел найти k ближайших соседей для каждой точки. Обычно я думаю использовать что-то вроде дерева k-d, но в этом случае у меня есть периодические граничные условия. Насколько я понимаю, дерево k-d работает, разбивая пространство, перебирая его на гипер плоскости одной меньшей размерности, т.е. В 3D мы разделили бы пространство, вычерчивая 2D-плоскости. Для любой данной точки она находится либо на плоскости, над ней, либо ниже нее. Однако, когда вы разделяете пространство с периодическими граничными условиями, можно считать точку с любой стороны!

Какой наиболее эффективный метод нахождения и сохранения списка ближайших соседей с периодическими граничными условиями в R ^ 3?

Аппроксимаций недостаточно, и точки будут перемещаться только по одному (подумайте, что Монте-Карло не моделирует N-тело).

Ответ 1

Даже в евклидовом случае точка и ее ближайший сосед могут находиться на противоположных сторонах гиперплоскости. Ядром поиска ближайшего соседа в дереве k-d является примитив, который определяет расстояние между точкой и полем; единственная модификация, необходимая для вашего случая, - это учитывать возможность обхода.

В качестве альтернативы вы можете реализовать деревья обложек, которые работают с любой метрикой.

Ответ 2

(Я отправляю этот ответ, хотя я не совсем уверен, что он работает. Интуитивно это кажется правильным, но может быть крайний случай, который я не рассматривал)

Если вы работаете с периодическими граничными условиями, вы можете думать о пространстве как обрезке в ряд блоков определенного фиксированного размера, которые затем накладываются друг на друга. Предположим, что мы находимся в R 2. Тогда одним из вариантов было бы повторить этот блок девять раз и организовать их в сетку 3x3 дубликатов блока. Учитывая это, если мы найдем ближайшего соседа любого единственного node в центральном квадрате, то либо

  • Ближайший сосед находится внутри центрального квадрата, и в этом случае сосед является ближайшим соседом или
  • Ближайший сосед находится в квадрате, отличном от центральной площади. В этом случае, если мы найдем точку на центральном квадрате, которой соответствует соседний, эта точка должна быть ближайшим соседом исходной контрольной точки при периодическом граничном условии.

Другими словами, мы просто повторяем элементы достаточно времени, чтобы евклидово расстояние между точками позволило найти соответствующее расстояние в модульном пространстве.

В n измерениях вам нужно будет сделать 3 n копии всех точек, что звучит как много, но для R 3 только увеличение на 27 раз выше исходный размер данных. Это, безусловно, огромный рост, но если он находится в допустимых пределах, вы сможете использовать этот трюк для использования стандартного kd-дерева (или другого пространственного дерева).

Надеюсь, это поможет! (И надеюсь, что это правильно!)