如何处理C++中的堆

How to handle heaps in C++

本文关键字:C++ 处理 何处理      更新时间:2023-10-16

我知道这可能是"你只需要尝试一下"类型的问题之一,但由于我还没有可用的实际测试数据,我想在我仍在设计代码时获得一些关于您的经验的意见。

我有一个数据结构,它实现了带有一些附加功能的优先级队列。我通常需要做的是一次向这个堆添加一堆对象。我正在使用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() 大约会从 klog2(n)> 3⋅n 的位置开始更快。这意味着当 k> 3⋅n/log2(n) 时。您可以在批量插入之前计算此值,然后决定哪种方法会更快。

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

make_heap运行时比较不超过 3N(其中 N 是堆的大小),而 push_heap 只占用日志 N。 但是,您必须将每个元素分别推送到堆中,这意味着它需要 N push_heap 秒,因此该方法受 N log N 比较的限制。

因此,make_heap渐近优于 N push_heap s。 如果堆足够大,初始化首先很重要,那么它会更好。