并行运行的最大任务量?

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_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的信息)

希望对你有所帮助。

【讨论】:

如果您确保所有E 标签同时在所有S 标签之前,那么这是一个很好的方法。所以最好用结构或类似方式对一个数组进行排序。 对于任何任务,E >= S。所以我们可以通过任何方式识别它们 我的意思是在某个时间点t,有些任务以t 结束,有些任务从t 开始。你不想把它们都数一遍。 哦,是的,很好。我认为可以处理。 感谢您的全面回答。我在我的解决方案中使用了优先级队列,现在可以使用,但你的回答帮助我理解了逻辑! :)

以上是关于并行运行的最大任务量?的主要内容,如果未能解决你的问题,请参考以下文章

python 多进程,多线程,协程

第一章 基于任务的程序设计

python 之进程

主任务并行运行,子任务依次运行。

FunDA(15)- 示范:任务并行运算 - user task parallel execution

Flink并行度设置导致的负载倾斜 Key Groups 不均衡 计算最大并行度