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

如何计算含heapq.heappop的Python while循环时间复杂度?

最小堆循环的时间复杂度分析

循环次数的边界情况

  • 最好情况:堆顶元素直接大于k,循环仅执行1次就终止。
  • 最坏情况:堆中所有元素的累加和≤k,此时循环会执行m次(m为堆的初始元素个数),直到堆被完全弹空。
  • 一般情况:循环次数取决于堆中最小的若干元素累加和首次超过k的数量,这个值介于1到m之间。

时间复杂度计算

每次heapq.heappop(heap)操作的时间复杂度是O(log s),其中s是当前堆的元素个数(堆结构调整的时间与二叉树高度成正比,即对数级)。

最坏情况下,循环执行m次,每次对应的堆大小从m递减到1,总时间开销为:

log m + log(m-1) + ... + log 1

根据对数运算性质,这个求和式等价于log(m!)(m的阶乘的对数)。通过斯特林公式近似可知log(m!) ≈ m log m,因此总时间复杂度为O(m log m)。

即使堆中元素累加和提前超过k(循环次数少于m),总时间复杂度仍不会超过O(m log m)——因为每次pop操作的最大开销是O(log m),最多执行m次。

补充说明

你提供的两段代码逻辑本质一致:都是从最小堆中依次弹出最小元素累加,直到和超过k。最小堆的特性保证了每次弹出的是当前剩余元素中的最小值,这只会影响循环次数的实际值,但不会改变最坏时间复杂度的结论。

内容的提问来源于stack exchange,提问作者dSisk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:01:35