如何解决嵌套循环的大O表示法和Dijkstra算法
我有以下代码:
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)。如何将其乘以总的大哦?
解决方法
我理解您这样的问题(如果我错了,请纠正我):
您尝试为图中的每对节点计算Dijkstra。因此图中有V(V-1)/ 2对(V是顶点数)。
然后,V(V-1)(即您计算Dijkstra的O(V ^ 2)倍,复杂度为O(V + ElogV)(我不知道您从何处获得O(VlogV + E ),但可能不正确)
总体来说,复杂度为O(V ^ 2logV + EV ^ 2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。