为什么 pop_heap 的复杂度是 O(2 * log(N))?

Why the complexity of pop_heap is O(2 * log(N))?

我在几个地方看到 priority_queue 中 pop_heap 的复杂度是 O(2 * log(N)),是这样吗?如果是,那 2 来自哪里?删除第一个元素后,它只需要重建堆,这将花费 O(log(N)).

why according to standard pop_heap may use 2logN comparisons, whereas push_heap only logN

首先,记住堆有一个二叉树的结构,这意味着每个节点最多有 两个 children(显然最多 一个 parent).

pop_heap 的工作原理:

  • 取顶元素。 (O(1))
  • 取最后一个元素并将其放在顶部。 (O(1))
  • 使用 top -> bottom 逻辑更新堆。您从顶部元素开始,将它与它的 两个 children 进行比较。用其中一个 children 切换当前元素并继续下一级别,或者如果当前元素已经在正确的位置(堆的条件成立)则停止

push_heap 的工作原理:

  • 将元素作为最后一个元素(树叶)放置。 (O(1))
  • 使用 bottom -> top 逻辑更新堆。您从刚刚添加的元素开始,并将其与其 parent 进行比较。如有必要,切换当前元素及其 parent 并继续,或者如果堆的条件已经成立则停止。

所以,以上两个操作的主要区别在于堆更新(重构)的逻辑。 pop_heap 使用 从上到下 逻辑,push_heap 使用 从下到上 逻辑。它们都是 O(logN) 复杂度,因为整个结构是一个二叉树。但是 pop_heap 需要更多的比较,因为每次我们都需要将当前元素与 2 children 进行比较。同时,在 push_heap 期间,我们只需要将当前元素与其 1(且仅)parent 进行比较。