拓扑排序算法

时间:2017-07-18 08:50:44

标签: algorithm graph scheduling

我正在构建一个基于依赖的调度程序,其中我的任务/节点形成一个有向无环图。我有以下约束,我正在尝试决定最合适的算法:

  1. 可以随时添加新任务(有或没有依赖项)
  2. 某些任务可以并行运行
  3. 关于拓扑排序,反复提到两种算法;深度优先搜索和卡恩算法。

    • 这两种算法的专家和对手是什么?
    • 一种算法在客观上更适合我的场景吗?
    • 是否有更适合我的情景的替补?

    我还有一个关于词汇的问题。给定依赖性,例如:

    c->b
    b->a
    e->d
    

    这被认为是单个有向无环图,2个非循环图(因为e和d不依赖于其他任务)或具有子非循环图的非循环图吗?

1 个答案:

答案 0 :(得分:1)

我认为你误解了这些算法。

深度优先搜索: 因此深度优先搜索算法(我在维基百科上查找它。它实际上称为算法。我宁愿称之为策略)是一种遍历图形的算法。所以要访问所有节点。 它不会返回图表的拓扑顺序!!

Kahn的算法:另一方面,Kahn的算法是针对您的问题的正确算法。如果有的话,它将返回topoligical订单。该算法的渐近运行时间为O(m + n),其中m是边的数量,n是图中顶点的数量。我不认为你会找到一个更好的算法来解决这个问题。

词汇:在您的示例中,您有一个DAG(有向无环图)和两个弱连接组件。

  

修改   在您提到基于深度优先搜索的算法之后:   对于渐近运行时间,使用哪种算法无关紧要。两者都在O(m + n)。关于存储,它实际上也无关紧要。