并行运行的最大任务量?
Posted
技术标签:
【中文标题】并行运行的最大任务量?【英文标题】:Maximum amount of tasks running in parallel? 【发布时间】:2016-10-09 14:31:00 【问题描述】:问题:
给定一组 n 个任务,每个任务都有一个整数开始时间和 时间结束。并行运行的最大任务量是多少 任何给定的时间?
算法应该在 O(n log n) 时间内运行。
这是一个学校作业,所以我不需要直接回答,但是任何代码 sn-ps 都是受欢迎的,只要它们是在 Java 或 Scala 中的(作业应该用 scala 编写。)
一些提示说我应该利用优先队列。我阅读了文档,但不确定如何使用它们,因此欢迎使用任何代码 sn-ps。
输入数据可以是Array[Pair[Int,Int]] = Array((1000,2000),(1500,2200))
等。
我真的很难设置优先级队列的排序,所以如果没有别的我希望有人可以帮助我。
PS: 优先级队列应该用 PriorityQueue()(ord) 初始化。
编辑:我想出了使用优先队列的解决方案,但感谢您提供所有答案。你们帮我弄清楚了逻辑!
【问题讨论】:
假设您有两个列表中的任务(一个按开始时间排序,另一个按结束时间排序),并且您在每个列表中维护“当前”任务的索引。然后你知道下一次开始和下一次结束发生的时间。所以你只需要同时遍历数组并记住最大值。你可以用两个优先级队列做类似的事情,但这可能比排序数组慢(这只是一个猜测,你需要测量才能确定)。 @NicoSchertler 如果我同时通过排序数组,算法不会在线性时间内运行吗? 是的,但您必须先排序。因此,n log n。 @NicoSchertler 好的,谢谢!你知道 scala 中的 count 方法吗(我想它在 java 中是一样的)?它是快/慢吗? :) 我猜,它对你帮助不大。不知道它是如何实现的,但它的性能可能与简单的 for 循环相似。 【参考方案1】:Soln 不使用优先队列。
考虑如下的任务数组:
[(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
的信息)
希望对你有所帮助。
【讨论】:
如果您确保所有E
标签同时在所有S
标签之前,那么这是一个很好的方法。所以最好用结构或类似方式对一个数组进行排序。
对于任何任务,E
>= S
。所以我们可以通过任何方式识别它们
我的意思是在某个时间点t
,有些任务以t
结束,有些任务从t
开始。你不想把它们都数一遍。
哦,是的,很好。我认为可以处理。
感谢您的全面回答。我在我的解决方案中使用了优先级队列,现在可以使用,但你的回答帮助我理解了逻辑! :)以上是关于并行运行的最大任务量?的主要内容,如果未能解决你的问题,请参考以下文章