Я пишу программу для моделирования гравитационной системы из n тел, точность которой произвольно хороша, в зависимости от того, насколько малым шагом «времени» я занимаюсь между каждым шагом.Прямо сейчас он работает очень быстро до 500 тел, но после этого он становится очень медленным, поскольку ему приходится проходить через алгоритм, определяющий силу, приложенную между каждой парой тел для каждой итерации.Это имеет сложность n (n + 1) / 2 = O (n ^ 2), поэтому неудивительно, что очень быстро очень плохо.Я предполагаю, что наиболее дорогостоящей операцией является определение расстояния между каждой парой путем взятия квадратного корня.Итак, в псевдокоде мой алгоритм в настоящее время работает так:
for (i = 1 to number of bodies - 1) {
for (j = i to number of bodies) {
(determining the force between the two objects i and j,
whose most costly operation is a square root)
}
}
Итак, есть ли способ оптимизировать это?Какие-нибудь модные алгоритмы для повторного использования расстояний, использованных в прошлых итерациях, с быстрой модификацией?Есть ли способы с потерями, чтобы уменьшить эту проблему?Возможно, игнорируя отношения между объектами, чьи координаты x или y (в двух измерениях) превышают определенную величину, определяемую произведением их масс?Извините, если это звучит так, как будто я болтаю, но могу ли я что-нибудь сделать, чтобы сделать это быстрее?Я бы предпочел, чтобы это было сколь угодно точным, но если есть решения, которые могут снизить сложность этой проблемы за счет некоторой точности, мне было бы интересно услышать ее.*