我有一个 DIRECTED ACYCLIC GRAPH ,其中每个节点代表一个任务,每个有向边A -> B
表示task A
应该之前 { {1}}开始
一个简单的例子可能是这样的:
所以这实际上是一个工作流程。在此图中,边task B
被认为是冗余的,因为任务B需要先完成任务C,任务C需要先完成任务A. (更不用说使A -> B
不必要的其他路径A -> D -> E -> B
问题是:我想识别(例如,只输出)图上的所有冗余依赖(边)。我的朋友和我有这样的想法:遍历图表上的所有边缘,并为每个边缘说A -> B
,删除它并检查从X -> Y
到X
的连接(对于例如,运行DFS / BFS),如果仍然存在路径(除了已删除的路径),则边Y
是冗余的,可以物理删除,否则只需将其放回原处。在这种情况下,最差条件下的复杂度可能是X -> Y
(DFS / BFS每次都会通过大约所有边),其中n代表图上边的数量。
我想知道这是否有任何优化?
答案 0 :(得分:1)
你听说过Transitive reduction
吗?来自Wikipedia
有向图的传递简化是具有尽可能少的边的图,其具有与给定图相同的可达性关系。等价地,给定图形及其传递减少应该具有相同的传递闭包,并且其传递减少应该在具有该属性的所有图形中具有尽可能少的边缘。 Aho,Garey& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp Ullman(1972),他提出了构造它们的计算复杂性的严格限制。
您可以从Transitive Reduction获取详细信息。如果有向非循环图中的顶点数n和边数m,则可以在时间O(nm)
中找到传递减少。
答案 1 :(得分:0)
使用带有堆栈的DFS进行拓扑排序可以产生线性时间的结果,可以通过从顶点开始,标记它被访问,然后递归地对其所有未访问的相邻边缘进行拓扑排序来完成,一旦所有这些都被探索将顶点推到堆栈。
然后只需从堆栈打印,它将生成线性时间的结果,您可以参考以下链接中解释的算法。