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

时间:2016-09-17 19:26:20

标签: stl heap priority-queue asymptotic-complexity

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

1 个答案:

答案 0 :(得分:5)

  

为什么根据标准pop_heap可能会使用2logN比较,而push_heap只能使用logN

首先,请记住堆具有二叉树的结构,这意味着每个节点最多只有两个子节点(显然最多一个父节点)。< / p>

pop_heap如何运作:

  • 采取顶级元素。 (O(1))
  • 取最后一个元素并将其放在顶部。 (O(1))
  • 使用 top - &gt;更新堆底部逻辑。您从顶部元素开始,并将其与两个孩子进行比较。切换当前元素与其中一个子元素并继续到下一级别,或者当当前元素已经在正确的位置时停止(堆的条件保持不变)

push_heap如何运作:

  • 将元素放置为最后一个元素(树的叶子)。 (O(1))
  • 使用底部更新堆 - &gt;顶部逻辑。您从刚刚添加的元素开始,并将其与父级进行比较。如果需要,切换当前元素及其父元素并继续,或者如果堆的条件已经存在则停止。

因此,上述两个操作之间的主要区别在于堆更新(reconstruct)的逻辑。 pop_heap使用自上而下逻辑,push_heap使用自下而上逻辑。它们都具有O(logN)复杂度,因为整个结构是二叉树。但pop_heap需要进行更多比较,因为每次我们需要将当前元素与 2个孩子进行比较。同时,在push_heap期间,我们需要仅将当前元素与其 1(且仅限)父级进行比较。