You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于heapq库的Dijkstra算法时间复杂度分析咨询

Dijkstra算法(基于heapq实现)的时间复杂度分析

先明确Python的heapq库核心操作的时间复杂度:

  • heappush:将元素插入堆中,时间复杂度为O(log k),其中k是当前堆内的元素数量。
  • heappop:弹出堆顶的最小元素,时间复杂度同样为O(log k)。

接下来拆解你的代码的复杂度:

  1. 堆插入操作(heappush):
    每条边最多会触发一次heappush——当找到某个节点的更短路径时,就会把该节点的新状态推入堆。整个过程中heappush的总次数是O(E)(E为图的边数)。每次heappush的最坏时间是O(log E)(堆的大小最多会达到E级别),这部分总时间为O(E log E)。

  2. 堆弹出操作(heappop):
    外层while循环的次数等于heappop的执行次数,最坏情况下堆内的每个元素都会被弹出,也就是**O(E)**次。每次heappop的时间是O(log E),这部分总时间同样为O(E log E)。

  3. 其他辅助操作:
    哈希表cost_visited和visited的查找、赋值都是平均O(1)的时间,总操作次数为O(V + E)(V为图的节点数)。这部分时间和O(E log E)相比可以忽略不计。

所以整体的时间复杂度是O(E log E)。你之前推测的O(V + E log E)其实也正确,因为V的量级远小于E log E,通常会简化写成O(E log E)。

补充说明:如果用斐波那契堆实现优先队列,Dijkstra算法的复杂度可以降到O(E + V log V),但Python标准库的heapq是二叉堆,无法达到这个最优复杂度。

内容的提问来源于stack exchange,提问作者Jhonnathan Ocampo Diaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:05:51