我正在阅读this document中提到的问题1(B部分):
查找二进制最小堆的最小元素需要对数时间: 的Ť / ˚F
应该是这样,因为当我们构造一个最大堆时,时间复杂度为O(logn)
,如上所述here。
同样,如果我构造一个min-heap,它应该是O(logn)
。 min heap类似于max-heap,它只是在C ++中,默认情况下构造了一个最大堆,我们将不得不为min-heap编写一个自定义比较器。那么,差异是什么?
答案 0 :(得分:7)
在最小堆中找到最小元素的时间复杂度为O(1)
,这是此类容器的主要目的。它实际上是为了在恒定时间内找到最小(或最大)的元素。 O(logn)
的操作是插入。正如其他人所提到的,pop
也是O(logn)
因为它将删除最小(或最大)元素,然后强制重新排序以确保新的最小(或最大)元素现在处于堆顶部。
优先级队列是一个容器适配器,提供最大(默认情况下)元素的常量时间查找,代价是对数插入和提取。
对于所有意图和目的,除了比较器之外,最小堆和最大堆是完全相同的。实际上,在实践中,最小堆通常是std::priority_queue
,如果你想要最大化,你可以使用std::less
,如果你想要最小化,你可以使用std::greater
作为Compare
} template argument
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;