GeenВидимо, я несколько сумбурно излагал свои мысли, сейчас попробую обрисовать свою цель в целом.
У меня есть некоторое число
(оно определяется размерами и параметром пористости системы; в перспективе
может быть сильно большим, поэтому хотелось бы быть поэкономнее с памятью) случайным образом разбросанных сфер разного радиуса. Все эти сферы у меня пронумерованы, и я хочу найти кластеры этих сфер (сферы принадлежат одному кластеру, если они пересекаются). Для этого есть несколько алгоритмов, каждый из которых, разумеется, предполагает обход по всем сферам и знание, кто является соседями данной сферы. Ну, для облегчения задачи я изначально разбиваю всю свою систему на ячейки со стороной
и смотрю, сферы с какими номерами там сидят. А потому для проверки соседей у каждой сферы нужно будет смотреть только ближайшее окружение, что быстрее.
Вот, в общем, с операцией разделения системы на ячейки у меня сейчас и проблемы. То есть через массив ячеек я сделал, но мне в рамках поиска кластеров нужно будет на каждой итерации обращаться к данным из этого массива, что замедляет работу вроде как. Кроме того, по ряду причин мне нужно будет проводить операцию поиска кластеров в течение всей работы не один раз, а столько раз, сколько время позволит. Поэтому я хочу сделать операцию поиска кластеров как можно быстрее. Для этого есть ещё мысль всё это дело распараллелить весь процесс поиска кластеров. Для этого опять же помогут ячейки: просто разобью всю систему на несколько подсистем, проведу всю эту операцию для каждой из подсистем в отдельности, а потом пройдусь по граничным ячейкам, "сшивая" решение.
Вообще, есть ещё два варианта:
1. Не делать никаких ячеек вообще. Просто на каждой итерации для поиска соседей составлять матрицу расстояний для данной сферы и плясать, исходя из этого. Я раньше так и делал, по сути, но это, во-первых, несколько дольше, а во-вторых, на корню убивает идею с параллельными вычислениями.
2. Опять же не делать никаких ячеек. Выделить ещё одно поле в структуре (сферы у меня описываются массивом структур) под вектор номеров соседей. Изначально пройтись по всем сферам и определить их соседей, а уже потом запускать поиск кластеров. Это было бы вообще супер, но это несколько ресурсоёмко (но это ладно) и, что важнее, я не очень понимаю, как в таком случае разделить области для параллельного вычисления.
Надеюсь, в этот раз я смог яснее обрисовать суть задачи.
Цитата:
Вообще-то, это не выглядит слишком объёмным (по памяти).
В теории хорошо было бы иметь
точек. А тут уже пора задумываться о памяти.
Цитата:
А сколько ещё информации хранится под номером точки? Может накладными расходами на ячейки можно пренебречь??
Не совсем понял вопрос, если честно. Под номером точки скрывается 7-8 полей структуры (координаты, радиус и ещё ряд специфических).
Цитата:
Честно говоря, не понял.
Предположим, мы описываем ячейки, на которые разбиваем всю систему, обычным массивом. Соответственно массив должен быть четырёхмерным - 3 из размерности пространства, 4 под номера точек, которые в ячейке находятся. Нужно, значит, задать этот массив. Пусть мы сделали оценку сверху и думаем, что больше 10 точек в одну ячейку не упадёт, и пусть длина ячейки составляет
длины системы. Тогда нужно будет объявить массив:
grid = zeros(50,50,50,10);
Теперь мы, например, узнали, что в ячейку (11,21,7) нужно добавить точку (сферу) с номером 26034. Как это сделать без того, чтобы каждый раз проверять, где там следующий нуль, или без какого-нибудь дополнительного массива счётчиков, я себе плохо представляю.