Graph 为什么DAG的拓扑排序的时间复杂度为O(V+;E),而不仅仅是O(V)?

Graph 为什么DAG的拓扑排序的时间复杂度为O(V+;E),而不仅仅是O(V)?,graph,Graph,此问题的DFS解决方案具有O(V+E)时间复杂性。但为什么不仅仅是O(V)?是的,我们访问每一个顶点和每一条边,但每一条边只会指向另一个顶点,这不是额外的步骤。例如,如果我们有两个顶点,它们之间有一条边,那么我们访问两个顶点,周期。我们不访问3个对象(2个顶点+边)。举一个DAG的例子,其中“V+E”比“V”带来更多的访问 为了加强我的论点,二叉树上DFS的时间复杂度为O(N),其中N是节点数。没有人说它是O(N+E)。考虑一个有V个顶点的有向图,分成两组大小为V/2的图,从组1中的每个顶点到组

此问题的DFS解决方案具有O(V+E)时间复杂性。但为什么不仅仅是O(V)?是的,我们访问每一个顶点和每一条边,但每一条边只会指向另一个顶点,这不是额外的步骤。例如,如果我们有两个顶点,它们之间有一条边,那么我们访问两个顶点,周期。我们不访问3个对象(2个顶点+边)。举一个DAG的例子,其中“V+E”比“V”带来更多的访问


为了加强我的论点,二叉树上DFS的时间复杂度为O(N),其中N是节点数。没有人说它是O(N+E)。

考虑一个有V个顶点的有向图,分成两组大小为V/2的图,从组1中的每个顶点到组2中的每个顶点都有一条边。然后是V2/4边,您需要检查所有这些边。

这是一个很好的示例。这让我确信,时间复杂性是O(V+E)。空间复杂性呢?公平地说,堆栈帧是O(图中任何给定路径的最大边数),堆空间是O(E)@USER 1008636,我认为,假设你在C、C++或其他使用运行时栈的语言中编写,并且通过递归实现算法,那么你的假设(o在图中的任意给定路径中的最大数量)对于堆栈空间和O(E)堆空间来说是正确的。在我看来,(1)这个问题更严格的时间复杂度是O(num_disconnected_顶点+E),其中一个disconnected vertice是一个没有边连接到任何其他vertice的vertice,(2)尽管O(V+E)是一个上界(不那么紧),但是,在图问题中,它总是被用来代替更为复杂的问题。是吗?@AlanEvangelista:这实际上并不是一个更严格的界限;断开连接的顶点数≤ v≤ num_disconnected_顶点+2E,因此O(num_disconnected_顶点+E)=O(V+E)-这两个边界完全相等,并且两者都不比另一个紧。(顺便说一下,我们说的是顶点,而不是单个顶点的顶点。)@ruakh我不理解你的推理。如果x和y是算法的两个上界,那么x