问题:
我们给出了一组n个任务,每个任务都有一个整数开始时间和 时间结束。并行运行的最大任务量是多少? 任何给定的时间?
算法应该在 O(n log n)时间内运行。
这是一项学校作业,所以我不需要直接回答,但只要它们是Java或Scala(任务应该用scala编写),任何代码片段都是受欢迎的。
一些提示说我应该利用优先级队列。我阅读了文档,但我不确定如何使用它们,因此欢迎任何代码片段。
输入数据可以是Array[Pair[Int,Int]] = Array((1000,2000),(1500,2200))
等等。
我真的很难设置优先级队列的排序,所以如果没有别的,我希望有人可以帮助我。
PS: 应该使用PriorityQueue()(ord)初始化优先级队列。
编辑:我想出了使用优先级队列的解决方案,但感谢您的所有答案。你们帮我弄清楚了逻辑!
答案 0 :(得分:2)
不使用优先级队列解决问题。
考虑以下任务数组:
[(1,2), (1,5), (2,4), ....] // (a,b) : (start_time, end_time)
第1步:构建一个同时考虑start_time
和end_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_now
和max_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>
我希望它有所帮助。