我在几个地方看到,在priority_queue中,pop_heap的复杂性是O(2 * log(N)),是真的吗?如果是,那2来自哪里?删除第一个元素后,只需要重建堆,这将需要O(log(N))。
答案 0 :(得分:5)
为什么根据标准pop_heap可能会使用2logN比较,而push_heap只能使用logN
首先,请记住堆具有二叉树的结构,这意味着每个节点最多只有两个子节点(显然最多一个父节点)。< / p>
pop_heap
如何运作:
push_heap
如何运作:
因此,上述两个操作之间的主要区别在于堆更新(reconstruct)的逻辑。 pop_heap
使用自上而下逻辑,push_heap
使用自下而上逻辑。它们都具有O(logN)复杂度,因为整个结构是二叉树。但pop_heap
需要进行更多比较,因为每次我们需要将当前元素与 2个孩子进行比较。同时,在push_heap
期间,我们需要仅将当前元素与其 1(且仅限)父级进行比较。