Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用强连通组件进行拓扑排序以查找圈(有向图)_Algorithm_Topological Sort_Connected Components - Fatal编程技术网

Algorithm 使用强连通组件进行拓扑排序以查找圈(有向图)

Algorithm 使用强连通组件进行拓扑排序以查找圈(有向图),algorithm,topological-sort,connected-components,Algorithm,Topological Sort,Connected Components,据我所知,如果对强连接组件有现成的高效黑盒方法,进行拓扑排序的一种方法是: (假设-无自循环) 运行强连接组件 如果有一个或多个大小大于1的组件,则此图具有循环 否则(图中只有1个大小的组件)是DAG,恭喜 如果是DAG运行拓扑排序,其他人会抱怨你做不到 不管效率如何,上述方法是否是进行拓扑排序的“技术正确”方法 我只是想确定我对事情的理解是正确的 是的,这在技术上是正确的,因为当所有强分量的大小都为1时,没有自循环的有向图是非循环的(即拓扑可排序的)。不过,最常见的拓扑排序将循环检测作为一个简

据我所知,如果对强连接组件有现成的高效黑盒方法,进行拓扑排序的一种方法是:

(假设-无自循环)

  • 运行强连接组件
  • 如果有一个或多个大小大于1的组件,则此图具有循环
  • 否则(图中只有1个大小的组件)是DAG,恭喜
  • 如果是DAG运行拓扑排序,其他人会抱怨你做不到 不管效率如何,上述方法是否是进行拓扑排序的“技术正确”方法


    我只是想确定我对事情的理解是正确的

    是的,这在技术上是正确的,因为当所有强分量的大小都为1时,没有自循环的有向图是非循环的(即拓扑可排序的)。不过,最常见的拓扑排序将循环检测作为一个简单的副产品。

    扩展上面的答案:是的,上面介绍的算法是正确的,将生成您想要的答案。拓扑排序仅适用于DAG(有向无环图)。SCC是一组顶点,其中每个顶点都可以到达其他每个顶点,本质上是循环的。因此,DAG应具有尺寸为1的SCC组件的V#

    但是,由于SCC算法通常使用运行时间为O(V+E)的DFS实现,因此算法中存在大量冗余,这可能会接近O(V^2),具体取决于数据的存储方式和图形的密度。生成所有SCC并查看所有顶点以检查它们是否存在于SCC大小>1的情况下会生成O(2V+E),这实际上仍然只是O(V+E),但最终需要为SCC额外存储Θ(V)


    此外,拓扑排序还利用DFS,DFS可以检测循环,从而可以发出拓扑排序是否可行的信号。这也在O(V+E)中运行。因此,您可以简单地运行拓扑排序,而不必使用SCC算法。虽然算法的整体大O与拓扑排序的运行时间相同,但不需要运行SCC,因为它不会给您提供任何额外的有用信息。

    太好了,谢谢!是否有一本参考书/网页上有这些命题的“备忘单”?(例如,“没有自循环的有向图是非循环的,如果所有强组件的大小都为1”),我的意思是,所有算法书籍/资源都会教你算法,但让你自己思考它们之间的所有关系。有这样的吗?谢谢again@EranMedan可能不会,因为它们太多了。这一个特别有一个只有几行的证明:如果有一个循环,它至少有两个顶点(没有自循环),它们彼此有路径,因此属于同一个强分量,其大小至少为2;如果有一个大小至少为2的强分量,那么就有一个循环,由从一个顶点到另一个顶点的路径连接而成。