如何处理C++中的堆
How to handle heaps in C++
我知道这可能是"你只需要尝试一下"类型的问题之一,但由于我还没有可用的实际测试数据,我想在我仍在设计代码时获得一些关于您的经验的意见。
我有一个数据结构,它实现了带有一些附加功能的优先级队列。我通常需要做的是一次向这个堆添加一堆对象。我正在使用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) 时。您可以在批量插入之前计算此值,然后决定哪种方法会更快。
请注意,此值只是一个粗略的估计值,因为函数的实际实现可能不会花费这些时间来执行操作。但它应该作为经验法则有用,并获得相当好的结果。
make_heap
运行时比较不超过 3N(其中 N 是堆的大小),而 push_heap
只占用日志 N。 但是,您必须将每个元素分别推送到堆中,这意味着它需要 N push_heap
秒,因此该方法受 N log N 比较的限制。
因此,make_heap
渐近优于 N push_heap
s。 如果堆足够大,初始化首先很重要,那么它会更好。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 在多个核心中处理一个HTTP请求