Dijkstra算法时间复杂度为O(VlogV+ElogV)还是用logE作上界更合理?
Dijkstra算法时间复杂度合理性探讨
目前通行的表述中,Dijkstra算法的时间复杂度为O(VlogV + ElogV),其中V是图的顶点数量,E是图的边数量,式中的logV来源于向堆中插入元素或从堆中弹出元素的耗时。
但这个推导其实存在可商榷的空间:该复杂度成立的前提是堆中不会存在重复顶点,但在算法的常规实现中,很容易出现顶点重复入堆的情况。举个简单的例子:如果要从顶点a前往顶点b,两者之间存在5条权重分别为5、4、3、2、1的路径,那么顶点b会被5次放入堆队列中。即使通过预处理重复边可以避免这种特定场景的重复入堆,还有其他场景依然会导致同样的问题。
综合来看,用logE替代logV作为堆操作的时间复杂度上界会更加合理。
内容的提问来源于stack exchange,提问作者penny
相关产品推荐
相关产品推荐

