【发布时间】:2020-09-12 09:59:45
【问题描述】:
我刚刚阅读了维基百科中关于 Dijkstras 算法的文章,它说时间复杂度是 O(V^2)。
我的问题是我无法向自己解释。
谁能给我解释一下?
【问题讨论】:
标签: algorithm time-complexity runtime shortest-path dijkstra
我刚刚阅读了维基百科中关于 Dijkstras 算法的文章,它说时间复杂度是 O(V^2)。
我的问题是我无法向自己解释。
谁能给我解释一下?
【问题讨论】:
标签: algorithm time-complexity runtime shortest-path dijkstra
使用数组的O(V^2) 解决方案与“常规”(优先队列)解决方案相同,但使用具有开放距离的数组,并在其中进行搜索而不是进行堆查找。
open_nodes = [inf, inf, inf, ..., inf]
d = [inf, inf, inf, ..., inf]
open_nodes[source] = 0
while d[target] == inf:
v = argmin(open_nodes) // O(V)
d[v] = open_nodes[v]
for each u such that (v,u) is an edge:
if d[u] != inf:
// relaxation:
open_nodes[u] = min(open_nodes[u], d[v] + w(v,u))
// close v
open_nodes[v] = inf
|V| 次,因为您关闭了一个节点
每次迭代,永远不要重新打开它。argmin 是 O(|V|)。这基本上是在未排序的数组中找到最小值。O(|E|) 次,因为您对每个传出边最多调用一次。这给了我们O(|V|^2 + |E|)的总数,但由于|E| <= |V|^2,这只是O(|V|^2)
【讨论】: