相对于使用堆,使用带有 insert() 的向量作为优先级队列的开销是多少? (c++)
Posted
技术标签:
【中文标题】相对于使用堆,使用带有 insert() 的向量作为优先级队列的开销是多少? (c++)【英文标题】:Is the overhead for utilizing a vector with insert() as a priority queue relative to utilizing a heap? (c++) 【发布时间】:2020-03-04 19:50:09 【问题描述】:我目前正在从事一个项目,在该项目中我实现了一个结构指针向量以用作优先级队列。我使用 for 循环来确定向量中的位置(如果不小于后面),然后使用 insert()
将结构指针放置在队列中的位置。我使用back()
作为队列的前面,这样我就可以维护向量的弹出功能。
我只是想确定使用堆库是否会增加速度,因为这个项目取决于时间。如果您愿意,可以提供代码,堆/向量的大小可能会大大增加,因为这是 hanoi A* 搜索算法的塔。
我想如果有人知道的话,我也会询问未来的知识,以便为我节省一些调试断点洗牌。
【问题讨论】:
为什么不直接使用std::priority_queue
?您的需求的哪些部分导致您自己实现它?
很难确定。 vector
的连续数据使得插入操作速度惊人。
std:priority_queue<T, std::vector<T>>
也是如此
【参考方案1】:
我做了一个简单的基准测试,首先将N
random int
s 插入优先级队列,然后弹出N
顶部元素。
预计,当队列大小较小时,使用线性搜索排序的std::vector
会胜出,而std::priority_queue
(实现为具有O(log N)
最坏情况插入时间的最大堆)会在队列大小很大时胜出.
可以在here找到基准代码。
【讨论】:
以上是关于相对于使用堆,使用带有 insert() 的向量作为优先级队列的开销是多少? (c++)的主要内容,如果未能解决你的问题,请参考以下文章
带有临时表的 RODBC::sqlQuery 提供空字符向量,尽管查询在 SSMS 中工作,较小的查询在相同的连接下工作