Частая задача при параллельном распараллеливании N
неприемлемо параллельных рабочих блоков между K
работниками состоит в использовании следующего алгоритма для разделения в псевдокоде:
acc = 0
for _ in range(K):
end = acc + ceil(N/K)
emit acc:end
acc = end
Это создаст K
смежных раздела, как правило, размером N/K
и отлично работает для больших N
. Однако, если K
приблизительно равно N
, это может привести к дисбалансу, потому что последний работник получит очень мало предметов. Если мы определим дисбаланс как максимальную абсолютную разницу между размерами разделов, то оптимальным будет итеративный алгоритм, который начинается с любого случайного раздела и уменьшает потенциал до тех пор, пока максимальная разница не станет равной 1 (или 0, если K
делит N
).
Мне кажется, что следующее может быть более эффективным способом получить тот же ответ, выполнив «перепланирование» онлайн. Есть ли у этого алгоритма имя и доказательство оптимальности?
acc = 0
workers = K
while workers > 0:
rem = N - acc
end = acc + ceil(rem/workers)
emit acc:end
acc = end
workers -= 1
Изменить. Учитывая, что мы можем определить описанный выше цикл рекурсивно, я вижу, что индуктивное доказательство оптимальности может сработать. В любом случае, название и подтверждение его оптимальности будут оценены :)