C++ 优先队列

标签 c++ priority-queue

我正在寻找如何在 O(n) 时间内构建一个堆,我发现它使用 Heapify。但我想知道 STL priority_queue 是否也这样做?所以我的问题是:

STL中的priority_queue使用了哪种构建堆的方法? 是使用可以在 O(n) 中将整个数组转换为堆的 heapify 还是在 O(n log n) 时间中使用一个一个地插入堆中的元素?

我猜这是第二种方法,因为我们在使用 STL priority_queue 时手动一个一个地插入元素。我说得对吗?

最佳答案

std::make_heap(...) ,它一次接受整个 N 范围来构建堆。

正如标准中所述,它具有 O(N) 复杂性。例如,您可以看到 CLang 如何实现 std::make_heap,source is here .

稍后你可以使用std::push_heapstd::pop_heap用于在 O(log N) 时间内按需添加和取出 1 个元素。

也为 suggested @Jarod42 你可以只使用 std::priority_queue ,因为它的构造函数之一接受具有 N 个元素的范围(迭代器),所以该构造函数也具有 O(N) 的复杂性。

关于C++ 优先队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66780137/

相关文章:

c++ - 不完整类型 boost function_traits 的无效使用

c++ - 在 C++ 中对 int 使用按位与

c++ - 从 STL 优先级队列创建最小堆

python - 如何反转Python中PriorityQueue的顺序?

c++ - 来自 C++ 中不同基类的模糊函数

C++11:atomic<T>::store 和 atomic_store<T> 之间有什么区别

c++ - 使用条件变量进行双向通信时出现死锁

java - Java 8 中的 PriorityBlockingQueue 流乱序

java - 给定数百万个数字流,如何近似第 90 个百分位数

java - 如何为 Dijkstra 算法实现 PriorityQueue?