线性时间的拓扑排序?

ND2*_*D27 4 sorting algorithm

我读了一些声称可以在线性时间内进行拓扑排序的地方.这里提出了一个这样的主张 - 他们说 - O(V + E) http://en.wikipedia.org/wiki/Topological_sorting

但他们拥有的算法:对于每个内部循环都有一个.我认为这使它成为O(n ^ 2).

然后我在幻灯片19上找到了这个解决方案 - https://courses.cs.washington.edu/courses/cse326/03wi/lectures/RaoLect20.pdf - 显然他们正在寻找更快的方法 - 但是在第3步的第二步,他们正在寻找所有相邻节点(在while循环内),因此也使它成为O(n ^ 2).

这种情况也是如此 - http://www.geeksforgeeks.org/topological-sorting/

我在这里错过了什么?

Nik*_* B. 7

每个内部都有一个while循环.我认为这使它成为O(n ^ 2).

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

当然它也是O(n ^ 2),但这不是一个紧张的上限.

他们正在寻找所有相邻节点(在while循环内),因此也使它成为O(n ^ 2).

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

  • @ ND27你似乎在这里混淆了一些东西.m是边数,而不是节点数.对于每个节点x,您可以查看outdegree(x)边缘.所有outdegrees的总和是m,这是总运行时间(除非有节点而不是边缘).尝试计算evey代码行的执行频率.然后添加所有这些.结果是算法的运行时复杂性,然后您可以将其标准化为大O边界 (2认同)