并行运行的最大任务量是多少?

时间:2016-10-09 14:31:00

标签: java algorithm scala priority-queue

问题:

  

我们给出了一组n个任务,每个任务都有一个整数开始时间和   时间结束。并行运行的最大任务量是多少?   任何给定的时间?

     

算法应该在 O(n log n)时间内运行。

这是一项学校作业,所以我不需要直接回答,但只要它们是Java或Scala(任务应该用scala编写),任何代码片段都是受欢迎的。

一些提示说我应该利用优先级队列。我阅读了文档,但我不确定如何使用它们,因此欢迎任何代码片段。

输入数据可以是Array[Pair[Int,Int]] = Array((1000,2000),(1500,2200))等等。

我真的很难设置优先级队列的排序,所以如果没有别的,我希望有人可以帮助我。

PS: 应该使用PriorityQueue()(ord)初始化优先级队列。

编辑:我想出了使用优先级队列的解决方案,但感谢您的所有答案。你们帮我弄清楚了逻辑!

1 个答案:

答案 0 :(得分:2)

不使用优先级队列解决问题。

考虑以下任务数组:

[(1,2), (1,5), (2,4), ....]   // (a,b) : (start_time, end_time)

第1步:构建一个同时考虑start_timeend_time的数组。

[1,2,1,5,2,4....]

第2步:维护另一个数组以了解索引i的时间是start_time还是end_time

 [S,E,S,E,S,E...] // S:Start_Time, E:End_Time

第3步:对第一个数组进行排序。并确保相应地更改另一个数组中的索引。

第4步:维护两个变量parallel_ryt_nowmax_parallel_till_now。并按如下方式遍历第二个数组:

for i in 1:len(second_array):
   if(second_array[i] == "S"):
        parallel_ryt_now ++
   else
        parallel_ryt_now -- 
   if parallel_ryt_now > max_parallel_till_now:
          max_parallel_till_now = parallel_ryt_now

逻辑:

在遍历已排序的数组时,当遇到start_time时,表示任务已启动。因此增加parallel_ryt_now,当遇到end_time时,表示任务已完成,从而减少parallel_ryt_now

这样,parallel_ryt_now var每时每刻都会存储并行运行的任务。

时间复杂度 =排序+遍历= O(nlogn) + O(n) = O(nlogn)

空间复杂度 = O(n)(存储额外数组,以获取有关索引i的时间是start_time还是end_time)的信息< / p>

我希望它有所帮助。