当使用Dijkstra的算法来解决单源最短路径问题时,常见的解决方案是使用二进制minheap进行更新操作。时间复杂度的共识是O((E + V)log(V)),因为由于更新的可用性,堆大小被限制为V,并且存在具有复杂度logV的E update和V extractMin操作。
但是,也有一些解决方案可以将新的优先级/距离节点简单地添加到优先级队列中,因为在许多语言(例如c ++和python)中都没有更新优先级队列。在这种情况下,堆大小不是恒定为V。那么时间复杂度是多少?我的猜测是O(E log E),因为每个节点都插入了优先级队列E次,并且在添加操作中,队列中已经有多达E条记录,因此添加操作本身就是logE,与E循环,总体复杂度为O(ElogE)。
我对这个想法是正确的吗?
答案 0 :(得分:1)
是正确的。我找到了一个很好的分析方法here(通过C ++代码阅读,这里的讨论从“注意,可以使用C ++内置堆...”开始)。
值得注意的是,O(log E )= O(log V )是因为 E < V 2 ,因此记录 E <2 log V 。因此,渐近时间复杂度不变。话虽如此,根据我的经验,由于堆更大,代码的运行速度往往会更慢。从正面来看,代码更短,更清晰,因为您不再需要运行decrease_key()
的能力,因此不再需要指向堆的指针来快速查找节点。