【问题标题】:Big O notation for nested loops and Dijkstra algorithm嵌套循环和 Dijkstra 算法的大 O 表示法
【发布时间】: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


【解决方案1】:

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

您尝试为图中的每一对节点计算 Dijkstra。所以你在图中有 V(V-1)/2 对(V 是顶点数)。

然后,V(V-1)(即 O(V^2) 次你计算 Dijkstra,它的复杂度为 O(V + ElogV)(我不知道你从哪里得到你的 O(VlogV + E ) 来自,但它可能是不正确的)

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

【讨论】:

  • 我现在有了更好的解释。基本上问题是我有两个 for 循环,我知道复杂度为 O(n^2),但在最后一个循环中,有一个正在运行的 Dijkstra 算法,其复杂度为 O(V log V + E)。现在我想知道我应该如何计算/乘以它们以获得运行算法的总数。
  • 你的 n 和 V 有什么不同?
  • 不是,你是对的,我只是为了区分循环和 Dijkstra,我可以有那个表示。但你是对的。
猜你喜欢
  • 2022-07-18
  • 1970-01-01
  • 2016-03-29
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多