У меня есть набор данных, который работает с миллионами точек данных в 3D. Для вычисления, которое я делаю, мне нужно вычислить сосед (поиск диапазона) для каждой точки данных в радиусе, попытаться подогнать функцию, вычислить ошибку для подбора, повторить это для следующего пункта данных и так далее. Мой код работает правильно, но на его выполнение уходит очень много времени, около 1 секунды на точку данных! Вероятно, потому, что для каждой точки нужно искать во всем наборе данных. Есть ли способ, которым я могу сделать процесс быстро. У меня есть идея, что если я смогу каким-то образом установить отношения смежности между первыми соседями, то это может быть менее медленным. Если это помогает, я пытаюсь найти оптимальную ширину окна Parzen в 3D.
источник
Вы должны обязательно проверить KD деревья и октреи которые являются методами выбора для наборов точек (в то время как BSP предназначены для общих объектов и сетки для более или менее однородных плотностей). Они могут быть очень компактными и быстрыми, минимизируя накладные расходы как в памяти, так и в вычислениях, и просты в реализации.
Когда ваши точки более или менее равномерно распределены (даже с пустыми областями, но не должно быть никакой плотности плотности или другой высокой концентрации), проверьте сферные упаковки, если вы хотите попробовать сеточное неиерархическое подразделение пространства.
источник
Вероятно, вам стоит подумать о построении триангуляции Делоне (ну, это ее трехмерный аналог). В 2D это специальная триангуляция точек данных, которая всегда содержит ближайшего соседа. То же самое в 3D, но с тетраэдрами.
Вы можете построить триангуляцию раз и навсегда, а затем искать ближайшего соседа непосредственно в триангуляции. Я думаю, что есть несколько хороших алгоритмов для построения триангуляции: в 2D построение триангуляции находится вNжурнал( н ) и последующие поиски ближайшего соседа являются линейными по количеству точек данных.
Надеюсь, это поможет!
источник