【发布时间】:2020-08-13 12:06:49
【问题描述】:
我有以下代码:
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)。此外,我们必须考虑函数expand所花费的时间,它将函数handle_edge应用于每个传出边。因为每个顶点只调用一次expand,所以每个边只调用一次handle_edge。它可能会调用 push(v'),但在整个执行过程中最多可以有 V 个这样的调用,因此该 case arm 的总成本最多为 O(V lg V)。然而,另一种情况 arm 可能被调用 O(E) 次,并且每次调用 increase_priority 都需要 O(lg V) 时间来实现堆。因此总运行时间为 O(V lg V + E lg V),即 O(E lg V),因为 V 是 O(E),假设一个连通图。
(还有另一种更复杂的优先级队列实现,称为斐波那契堆,它在 O(1) 时间内实现了 increase_priority,因此 Dijkstra 算法的渐近复杂度变为 O(V lg V + E);然而,较大的常数因子使斐波那契堆在大多数情况下不切实际。)
所以基本上现在对于每个人来说,我们有 O(n^2)。但路径实际上是 Dijkstra 算法,其中 Big Oh 为 O(V lg V + E)。我怎样才能将这个乘以 Big Oh 的总数?
【问题讨论】:
-
什么是 V、n 和 E?
标签: time-complexity big-o complexity-theory