В O (N) это кажется легким.
Дайте каждой теме несколько «очков». Пусть p_i
точек, выделенных для потока T_i
. Для каждой задачи выберите поток с наибольшим значением p_i
и вычтите стоимость задачи из p_i
. Затем вам просто нужно отслеживать потоки, упорядоченные по счету, что тривиально за O (N) время и может быть легко выполнено за O (log N) с сбалансированным деревом.
Для непрерывной работы не существует минимума в p_i
. Если вы хотите избежать того, чтобы баллы не доходили до -inf, просто регулярно добавляйте произвольную сумму P
ко всем баллам (одинаковую сумму для всех баллов).
Редактировать: Я неправильно указал N. Выше, N - количество потоков, вопреки заданному вопросу. Если N = количество задач и T = количество потоков, это приводит к стоимости O (N * log T). Если T «маленький», это близко к O (N).
Редактировать 2: Если все задачи известны заранее, а также количество потоков, то я думаю, что вычисление оптимального планирования сродни проблеме ранца , и это является, в общем, NP-полным (так что вы получите где-нибудь экспоненты). Простой анализ, основанный на затратах, который я как-то описал выше, даст вам относительно хорошее приближение, если все отдельные задачи имеют небольшую стоимость по отношению к общей стоимости, которая будет выделена для каждого потока.