我正在构建一个基于依赖的调度程序,其中我的任务/节点形成一个有向无环图。我有以下约束,我正在尝试决定最合适的算法:
关于拓扑排序,反复提到两种算法;深度优先搜索和卡恩算法。
我还有一个关于词汇的问题。给定依赖性,例如:
c->b
b->a
e->d
这被认为是单个有向无环图,2个非循环图(因为e和d不依赖于其他任务)或具有子非循环图的非循环图吗?
答案 0 :(得分:1)
我认为你误解了这些算法。
深度优先搜索: 因此深度优先搜索算法(我在维基百科上查找它。它实际上称为算法。我宁愿称之为策略)是一种遍历图形的算法。所以要访问所有节点。 它不会返回图表的拓扑顺序!!
Kahn的算法:另一方面,Kahn的算法是针对您的问题的正确算法。如果有的话,它将返回topoligical订单。该算法的渐近运行时间为O(m + n),其中m是边的数量,n是图中顶点的数量。我不认为你会找到一个更好的算法来解决这个问题。
词汇:在您的示例中,您有一个DAG(有向无环图)和两个弱连接组件。
修改强> 在您提到基于深度优先搜索的算法之后: 对于渐近运行时间,使用哪种算法无关紧要。两者都在O(m + n)。关于存储,它实际上也无关紧要。