c++ - 如何在 C++ 中处理堆

标签 c++ stl heap

我知道这可能是“你只需要尝试一下”这类问题之一,但由于我还没有实际的测试数据,我想在我还在的时候就你的经验征求一些意见设计代码。

我有一个数据结构,它实现了一个带有一些附加功能的优先级队列。我通常需要做的是一次向这个堆中添加一堆对象。我正在使用 std::make_heap()std::push_heap()std::pop_heap() 算法来维护堆不变量。

现在,每当我执行插入操作时,我都会使用 std::push_heap() 添加单个元素。现在我正在考虑使用 std::vector::push_back() 方法一次添加所有元素,然后重新组织堆。此时一个简单的 push_heap() 可能不起作用,所以我将不得不使用一个新的 make_heap()。但是 make_heap() 运行在 (3*(last-first))push_heap() 只需要 log(last-first )

在这种情况下,是否有一种简单的方法可以确定哪个实际上更快,还是我必须等到测试数据可用?

最佳答案

如果您将 k 个元素插入到一个大小为 n 的堆中,make_heap() 将大致从 的点开始更快k⋅log2(n) > 3⋅n。这意味着当 k > 3⋅n/log2(n) 时。您可以在大量插入之前计算该值,然后决定哪种方法会更快。

请注意,此值只是粗略估计,因为函数的实际实现可能不会正好这些时间来执行操作。但作为经验法则,它应该是有用的,并且会获得相当好的结果。

关于c++ - 如何在 C++ 中处理堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5937723/

相关文章:

c++ - 防止输入小于 0 的字母或数字

c++ - vector 和原始 C 风格数组之间的性能比较

C++如何将 map 迭代器仅公开给 map 的值

c++ - 什么是 __SGI_STL_PORT?

c# - 计算堆排序对数组进行排序所需的步骤数

c++ - cin.tellg 在从管道接收输入时返回 -1

c++ - 是否可以在 constexpr 中使用 std::string ?

c++ - STL容器的只读操作

java - 从堆支持的最小优先级队列获取最大值的时间复杂度

.net - 什么是堆中的类型对象