我正在寻找一个执行 Heapify 的函数,但似乎没有直接来自 C++ STL 的高效函数。
CLRS教材中定义的heapify函数会取入一个元素位置i,假设i的左右子树都是堆,并使以i为根的树成为堆,复杂度为log(n)。
给定 [first, last) 中的堆,我想删除第一个元素,用另一个元素替换它,并维护堆属性。为此,我们只需要调用一次heapify(first),向下遍历一次堆,复杂度为log(n)。
STL有pop_heap和push_heap函数,首先调用pop_heap和push_heap就可以达到目的,但是pop_heap维护了heap属性,push_heap也维护了heap属性,这就推断在堆中进行了两次遍历。尽管整体复杂度仍然是log(n),但效率并不高。删除第一个元素后,我们不需要维护堆属性。
除了编写自己的 heapify 函数之外,还有什么好主意吗?