Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting - Fatal编程技术网

Algorithm 线性时间的拓扑排序?

Algorithm 线性时间的拓扑排序?,algorithm,sorting,Algorithm,Sorting,我读了一些地方,它们声称可以在线性时间内进行拓扑排序。 这里有一个这样的说法——他们说-O(V+E) 但他们的算法是:在while循环中,每个算法都有一个for。我想这就是O(n^2) 然后我找到了这个解决方案——在幻灯片19中——很明显,他们正在寻找一种更快的方法——但在步骤3的第二步中,他们正在寻找所有相邻的节点(在while循环中),因此也就是O(n^2) 那么,这是一个什么样的情况呢 我错过了什么 在while循环中每个都有一个for。我想这就是O(n^2) 如果使用图的邻接列表表示,

我读了一些地方,它们声称可以在线性时间内进行拓扑排序。 这里有一个这样的说法——他们说-O(V+E)


但他们的算法是:在while循环中,每个算法都有一个for。我想这就是O(n^2)

然后我找到了这个解决方案——在幻灯片19中——很明显,他们正在寻找一种更快的方法——但在步骤3的第二步中,他们正在寻找所有相邻的节点(在while循环中),因此也就是O(n^2)

那么,这是一个什么样的情况呢

我错过了什么


在while循环中每个都有一个for。我想这就是O(n^2)

如果使用图的邻接列表表示,则在内部循环中只查看每条边一次,因此它是O(max{n,m})=O(n+m)

当然它也是O(n^2),但这不是一个严格的上界

他们正在寻找所有相邻的节点(在while循环中),因此它也是O(n^2)


同样,如果您使用邻接列表来表示图形,它也是O(n+m)。

“while循环中的每一个都有一个for。我认为这使它成为O(n^2)”-这并不意味着它是O(n^2)。你不能只看程序的控制流结构来确定它的运行时间,不管你认为构建得多么糟糕的大O问题集。边数(E)是O(V^2),所以O(V+E)等于O(V^2)。O(V+E)和O(V^2)是如何相同的?@aromero这是两个不同的复杂度等级,尽管其中一个包含另一个(即使使用邻接列表),但对于每m个节点,可以查看n条边(即使只查看一次)。所以它是O(mn)而不是O(m+n)。这不对吗?@ND27你好像把这里的东西搞糊涂了。m是边数,而不是节点数。对于每个节点x,您将看到outdegree(x)边。所有outdegrees的总和为m,这是总运行时间(除非有节点而不是边)。尝试计算每行代码的执行频率。然后把这些加起来。结果是算法的运行时复杂度,然后可以将其标准化为一个大O边界