嵌套循环的大O表示法和Dijkstra算法

时间:2020-08-13 12:06:49

标签: time-complexity big-o complexity-theory

我有以下代码:

for each nodeG in Graph
   for each nodeS in subset
       path(nodeG, nodeS) // using dijkstra that in the best has O(V lg V + E);
   end
end

每次执行主循环时,都会从队列中提取一个顶点。假设图中有V个顶点,则队列可能包含O(V)个顶点。假设优先队列的堆实现,每个弹出操作将花费O(lg V)时间。因此,执行主循环本身所需的总时间为O(V lg V)。另外,我们必须考虑花费在函数扩展上的时间,这会将函数handle_edge应用于每个输出边缘。由于expand每个顶点仅被调用一次,handle_edge每个边缘仅被调用一次。它可能调用push(v'),但是在整个执行过程中最多可以有V个这样的调用,因此该案例分支的总成本最多为O(V lg V)。但是,另一种情况下的分支可能被称为O(E)次,并且每次执行递增堆优先级都需要O(lg V)时间。因此,总运行时间为O(V lg V + E lg V),这是O(E lg V),因为假设连接图,则V为O(E)。

(还有另一个更复杂的优先级队列实现方式,称为Fibonacci堆,该实现在O(1)时间内实现crease_priority,因此Dijkstra算法的渐近复杂度变为O(V lg V + E);但是,常数因子较大使斐波那契堆对于大多数用途不切实际。)

所以基本上现在对于每个两个,我们都有O(n ^ 2)。但是路径实际上是Dijkstra算法,其中大哦是O(V lg V + E)。如何将其乘以总的大哦?

1 个答案:

答案 0 :(得分:0)

我理解您这样的问题(如果我错了,请纠正我):

您尝试为图中的每对节点计算Dijkstra。因此图中有V(V-1)/ 2对(V是顶点数)。

然后,V(V-1)(即您计算Dijkstra的O(V ^ 2)倍,复杂度为O(V + ElogV)(我不知道您从何处获得O(VlogV + E ),但可能不正确)

总体来说,复杂度为O(V ^ 2logV + EV ^ 2)

相关问题