要查找n作业中将运行第n个作业的计算机,请执行m机器作业调度

时间:2017-06-11 08:22:58

标签: c++ algorithm job-scheduling

在m台机器上安排了n个作业,每台机器对作业采用不同的时间t_i。订购机器,如果免费则优先考虑第一台机器等。

我必须在C ++中编写一个算法来有效地计算第n个作业将运行的机器。

到目前为止,我的伪代码看起来像这样:

initialise rem_time[m] to 0 // Remaining time for m machines
for each element(i) in job array
  machine(j)= find_min(rem_time[]) //Find the lowest rem_time among all machines
  append joblist[j] with element_i   
  rem_time[j] += t_j

我正在寻找其他解决方案,我可以在这里进一步优化解决方案,因为使用find_min n次,并且存储在每台机器上安排的所有作业似乎都是浪费。

谢谢!

1 个答案:

答案 0 :(得分:0)

改进算法的一种方法是使用二进制堆:https://en.wikipedia.org/wiki/Binary_heap(我建议您阅读该条目)。
如果n < m,你的直接答案显然是机器[n] 如果n> m,你为机器建立一个最小堆。堆中的每个节点都存储其当前分配的作业所花费的时间以及运行它的计算机的索引。时间量是堆的关键 它需要O(m)来创建堆。使用前m个作业初始化堆,因此您的节点将具有key = joblist [1] machine = 1 to key = joblist [m],machine = m。
现在,您为每个后续作业启动循环: 您可以使用最短的时间在堆中找到作业并将其从堆中删除(同时存储计算机的索引),这需要O(log m),然后添加一个新节点,其作业时间是下一个节点的时间您刚刚从堆中删除的作业和机器索引。这也受到O(log m)的限制 当你到达你想要的工作j时,你只需要在你将它插入堆之前获得你删除的机器的索引,这就是你的答案。 在j = n的情况下,很容易看出该过程受到O(n log m)的限制。 我将实施留给您,使用维基百科条目不应该太难。
如果您需要更多帮助,请不要犹豫。