c++ - 在最小堆中找到最小元素的时间复杂度是多少?

标签 c++ heap min-heap

我正在阅读 this document 中提到的问题 1(B 部分) :

Finding the minimum element of a binary min heap takes logarithmic time: T/F?

这应该是真的,因为当我们构造一个最大堆时,时间复杂度是O(logn)如前所述here .

同样,如果我构造一个最小堆,它应该是O(logn)。最小堆类似于最大堆,只是在 C++ 中,默认构造最大堆,我们必须为最小堆编写自定义比较器。那么,有什么区别呢?

最佳答案

在最小堆中找到最小元素的时间复杂度为 O(1),这是此类容器的主要目的。从字面上看,它是为了在恒定时间内找到最小(或最大)的元素。 O(logn) 的操作是插入。正如其他人提到的,pop 也是 O(logn) 因为它将删除最小(或最大)的元素,然后强制重新排序以确保新的最小(或最大)元素现在位于堆的顶部。

来自 cppreference

A priority queue is a container adaptor that provides constant time lookup of the largest (by default) element, at the expense of logarithmic insertion and extraction.

对于所有意图和目的,除了比较器之外,最小堆和最大堆是完全相同的东西。事实上,在实践中,最小堆通常是 std::priority_queue。 ,如果你想要一个最大堆,你使用 std::less,如果你想要一个最小堆,你使用 std::greater 作为 Compare模板参数

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

关于c++ - 在最小堆中找到最小元素的时间复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31268290/

相关文章:

heap - 迪杰斯特拉算法。最小堆作为最小优先级队列

c - 提取最小元素后的最小堆问题

c++ - OpenGL 中的第三个三角形顶点在窗口中渲染时显示为 0.0

c++ - 从由相同代码创建的二进制文件读取时出现段错误

C:堆排序算法,删除&插入

optimization - 具有查找功能的优先队列 - 最快的实现

C:尝试实现 minHeapSort 然后打印它 - 无法使 for 条件正常工作

c++ - 错误 : ‘int’ is not a class, 结构或 union 类型`

使用推导的 C++ 可变参数扩展

java - 堆算法。非常基本,关于数组位置 0 和 1。