Учитывая массив длины N и предоставленные M доступных узлов, разделите массив на куски размера N / M. Каждый узел вычисляет сумму своего чанка и отчитывается. Общая сумма рассчитывается путем сложения частичных сумм. Затем общая и частичная суммы распределяются по каждому из узлов. Каждый узел определяет лучшую точку разделения в пределах своего фрагмента (локальный минимум) и отчитывается. Глобальный минимум вычисляется из локальных минимумов.
Например, если в массиве 10 миллионов записей и доступно 200 узлов, размер чанка равен 50000. Таким образом, каждый узел получает 50000 чисел и сообщает сумму. Общая сумма массива вычисляется путем сложения 200 частичных сумм. Затем каждому узлу присваивается сумма вместе с 200 частичными суммами. Информация на каждом узле теперь состоит из
- номер чанка
- 50000 записей массива для этого чанка
- массив всего
- 200 частичных сумм
Из этой информации каждый узел может вычислить свой локальный минимум. Глобальный минимум вычисляется из 200 локальных минимумов.
В идеальном случае, когда пропускная способность сети бесконечна, задержка сети равна нулю и может использоваться любое количество узлов, размер порции должен составлять sqrt(N)
. Таким образом, каждый узел получает sqrt(N)
элементов массива, а затем получает sqrt(N)
частичных сумм. В этих идеальных условиях время работы составляет O(sqrt(N))
вместо O(N)
.
Конечно, в реальном мире нет смысла пытаться распространять подобные проблемы. Количество времени (на элемент массива) для отправки элементов массива по сети является значительным. Гораздо больше, чем количество времени (на элемент массива), необходимое для решения проблемы на одном компьютере.