带依赖的并行进程调度最短时间算法设计(线性时间)
基于DAG拓扑排序计算进程并行最短完成时间
这个问题的核心逻辑很直接:因为机器无限,只要前置进程全部完成,所有待执行的进程都能并行启动,所以整个流程的最短完成时间等于DAG中最长路径的长度(每个进程耗时1秒,路径长度即节点数)。下面是具体的算法思路和实现步骤:
算法核心逻辑
我们需要计算每个进程的最早完成时间,这个时间由它所有前置进程的最早完成时间的最大值加1(自身耗时1秒)决定。最终所有进程的最早完成时间的最大值,就是总最短完成时间。
具体步骤(结合拓扑排序)
初始化数据结构
- 构建邻接表:记录每个进程的所有后继进程(即依赖当前进程的进程)。
- 统计每个进程的入度(即它有多少个前置依赖进程)。
- 创建数组
earliest_time,存储每个进程的最早完成时间,初始值设为0。
处理无依赖进程
- 找到所有入度为0的进程(无前置依赖),将它们的
earliest_time设为1(可立即启动,耗时1秒完成),并把这些进程加入拓扑排序的队列。
- 找到所有入度为0的进程(无前置依赖),将它们的
拓扑排序遍历更新
- 从队列中取出一个进程
u:- 遍历
u的所有后继进程v:- 计算
v的候选完成时间:earliest_time[u] + 1(v需等u完成后启动,再加自身1秒耗时)。 - 如果这个候选时间比
v当前的earliest_time大,就更新v的earliest_time为该候选值(v必须等所有前置进程完成,所以取所有前置完成时间的最大值)。 - 将
v的入度减1,当v的入度变为0时,说明所有前置已处理完毕,把v加入队列。
- 计算
- 遍历
- 从队列中取出一个进程
计算最终结果
- 遍历
earliest_time数组,取其中的最大值,就是完成所有进程的最短时间。
- 遍历
结合你的例子验证
你的例子进程依赖关系:
- A无依赖,B依赖A,C依赖A,D依赖C,E无依赖,F依赖B、D、E
按照步骤执行:
- 初始:
earliest_time[A] = 1,earliest_time[E] = 1,其余为0;队列放入A、E。 - 处理A:更新B的
earliest_time为2,C的earliest_time为2;B、C入度减1后变为0,加入队列。 - 处理E:更新F的
earliest_time为2;F入度从3变为2,暂不加入队列。 - 处理B:更新F的
earliest_time为3;F入度从2变为1,暂不加入队列。 - 处理C:更新D的
earliest_time为3;D入度减1后变为0,加入队列。 - 处理D:更新F的
earliest_time为4;F入度减1后变为0,加入队列。 - 最后
earliest_time数组的最大值是4,和你给出的结果一致。
实现注意点
- 确保输入的依赖关系是合法的DAG(无环),如果有环则进程无法全部完成,需要先做环检测。
- 用队列实现拓扑排序的时间复杂度是O(n + m),其中n是进程数,m是依赖关系数,效率很高。
内容的提问来源于stack exchange,提问作者asudoiha oaihd
相关产品推荐
相关产品推荐

