Я сомневаюсь, что распределенная реализация поможет.
В основе проблемы лежит процесс обхода графа, в котором вы идентифицируете каждого из соседей по 2 скачкам. Для этого каждому экземпляру в распределенной версии алгоритма требуется копия графа:
В случае niave каждому экземпляру необходим весь график. Вероятно, вы обнаружите, что время, затрачиваемое на распространение графа между экземплярами, превышает любое ускорение чисто параллельной фазы.
Альтернативой является разбиение графа и отправка каждому экземпляру части графа. Но затем вы представили проблему, заключающуюся в том, что экземпляр должен общаться с другим экземпляром, чтобы узнать об узлах графа, которые не находятся в его части графа, и это, вероятно, сведет на нет параллелизм.
(Как правило, распределенные решения работают лучше всего, если вам не нужно перемещать большое количество данных между экземплярами, и если вычисления могут в основном выполняться экземплярами без общения с другими. Затраты на связь и синхронизация между экземплярами имеет тенденцию убивать параллелизм.)
Нет. Если вы хотите распараллелить это, лучше всего использовать многопоточность в одной JVM. Чтобы получить максимальную производительность для данной реализации алгоритма, установите количество потоков равным количеству доступных процессоров. Создание большего количества потоков сделает вещи хуже, а не лучше. (И не возитесь с расписанием потоков ... это не поможет.)
Сказав это, я подозреваю, что настоящая причина медленных вычислений заключается в деталях алгоритма и в том, как вы реализовали структуры данных.
Не существует волшебной «техники программирования», которая может сделать медленный алгоритм быстрым ... без его изменения.
(Один из подходов, который работает, - это профилировать ваш код, определить места, в которых тратится большая часть времени, и ... после глубоких размышлений об этом ... переработать структуры кода / данных, чтобы улучшить его. Но есть здесь нет никакой магии. Просто тяжелая работа и размышления.)