代码之家  ›  专栏  ›  技术社区  ›  Lay González

如果底层数据结构是一个列表,heapq的push操作怎么可能是O(logn)时间?

  •  0
  • Lay González  · 技术社区  · 4 年前

    列表不需要O(n)时间来增加它的大小吗?那么,怎么可能呢堆.堆是O(logn)?

    1 回复  |  直到 4 年前
        1
  •  2
  •   ShadowRanger    4 年前

    A list 摊销 O(1) 每隔很长一段时间,它都需要扩展底层容量,但通常 append 只需要声明已经分配的容量。

    heapq.heappush 将招致 O(n) 努力重新分配底层 列表 的存储,但绝大多数时间,添加额外的项目(通过 内部)是 ,后面跟着一个 O(log n) sift down操作将其移动到堆中的正确位置(重新建立堆不变量);sift down操作是通过元素交换实现的,这些都是 ,而不是插入和删除 每个)