You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带依赖的并行进程调度最短时间算法设计(线性时间)

基于DAG拓扑排序计算进程并行最短完成时间

这个问题的核心逻辑很直接:因为机器无限,只要前置进程全部完成,所有待执行的进程都能并行启动,所以整个流程的最短完成时间等于DAG中最长路径的长度(每个进程耗时1秒,路径长度即节点数)。下面是具体的算法思路和实现步骤:

算法核心逻辑

我们需要计算每个进程的最早完成时间,这个时间由它所有前置进程的最早完成时间的最大值加1(自身耗时1秒)决定。最终所有进程的最早完成时间的最大值,就是总最短完成时间。

具体步骤(结合拓扑排序)

  1. 初始化数据结构

    • 构建邻接表:记录每个进程的所有后继进程(即依赖当前进程的进程)。
    • 统计每个进程的入度(即它有多少个前置依赖进程)。
    • 创建数组earliest_time,存储每个进程的最早完成时间,初始值设为0。
  2. 处理无依赖进程

    • 找到所有入度为0的进程(无前置依赖),将它们的earliest_time设为1(可立即启动,耗时1秒完成),并把这些进程加入拓扑排序的队列。
  3. 拓扑排序遍历更新

    • 从队列中取出一个进程u:
      • 遍历u的所有后继进程v:
        • 计算v的候选完成时间:earliest_time[u] + 1(v需等u完成后启动,再加自身1秒耗时)。
        • 如果这个候选时间比v当前的earliest_time大,就更新v的earliest_time为该候选值(v必须等所有前置进程完成,所以取所有前置完成时间的最大值)。
        • 将v的入度减1,当v的入度变为0时,说明所有前置已处理完毕,把v加入队列。
  4. 计算最终结果

    • 遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:12:02