OK. Я получаю это сейчас. У вас есть огромное количество дискретных частиц для работы. С акцентом на большой номер.
Ну, а почему ты не сказал?
Вы не можете сделать это точно (т.е. без аппроксимации) быстрее, чем итерация по всем пунктам. По крайней мере, без предоставления более актуальной информации.
Предложение Адама о выборке - хороший способ получить приближение, если у вас есть произвольный доступ к данным.
Альтернатива, которая не будет быстрее для одной операции, но может оказаться полезной, если вам придется часто пересчитывать, - это уменьшить рабочий набор до меньшей группы более тяжелых точек. Примерно так:
- Разделите пространство на сетку из
N_x * N_y * N_z
ячеек размеров (l_x,l_y,L_z)
.
- Вычислить общую массу и местоположение центра масс для всех точек в каждой ячейке.
- Откажитесь от любых ячеек, в которых нет точек, и используйте результаты в качестве нового рабочего набора.
Чтобы это было улучшением, вам нужно иметь в среднем 10 или более исходных точек на ячейку, но не так много, чтобы введенная гранулярность размыла искомый сигнал.
Как лучше всего выполнить шаг 2, зависит от того, как организованы исходные данные и сколько места у вас в памяти для хранения промежуточных результатов. С большим количеством доступной памяти:
- Подготовить и инициализировать до нуля четыре (N_x, N_y, N_z) массива, называемые
M
, Rx
, Ry
и Rz
(или один скалярный массив M
и один векторный массив R
, это зависит от вашего языка реализации)
- Пройдите по основному списку вовремя, увеличивая значения в соответствующей ячейке для каждой массы
- Пройдите промежуточные массивы, чтобы вычислить собранные массы и места.
С относительно небольшим объемом памяти, но большим количеством времени, доступным для предварительного расчета, вы обходите основной список один раз для каждой ячейки (но если у вас есть такое время, вы, вероятно, можете просто сделать это прямо).