Sig*_*erm 11 c++ algorithm queue priority-queue
这不是作业.
我正在使用一个小的"优先级队列"(目前实现为数组)来存储具有最小值的最后N个项目.这有点慢 - O(N)项目插入时间.当前实现跟踪数组中的最大项并丢弃任何不适合数组的项,但我仍希望进一步减少操作数.
寻找符合以下要求的优先级队列算法:
我最初考虑使用二进制堆(它们可以通过数组轻松实现),但显然当数组不能再增长时它们表现不佳.链接列表和数组将需要额外的时间来移动东西.stl优先级队列增长并使用动态分配(尽管我可能错了).
那么,还有其他想法吗?
--EDIT--
我对STL实现不感兴趣.由于大量的函数调用,STL实现(由少数人建议)比当前使用的线性阵列慢一点.
我对优先级队列算法感兴趣,而不是实现.
小智 14
基于数组的堆似乎非常适合您的目的.我不确定你为什么拒绝他们.
您使用最大堆.
假设您有一个N元素堆(实现为数组),其中包含到目前为止看到的N个最小元素.
当一个元素进入时,检查max(O(1)时间),如果它更大则拒绝.
如果进入的值较低,则将root修改为新值并对此更改值进行筛选 - 最坏情况为O(log N)时间.
筛选过程很简单:从root开始,在每个步骤中将此值与其较大的子项交换,直到恢复max-heap属性.
因此, 如果使用std :: priority_queue,则不必执行任何可能需要删除的操作.根据std :: priority_queue的实现,这可能导致内存分配/释放.
所以你可以得到如下代码:
但是,平均而言,您可能不必一直向下筛选新值,并且可能比O(logn)平均插入时间更好(尽管我还没有尝试过证明它).
您只需分配大小为N的数组一次,并且通过交换数组的元素完成任何插入,因此之后没有动态内存分配.
查看具有heapify和sift-down伪代码的wiki页面:http://en.wikipedia.org/wiki/Heapsort
使用std::priority_queue与最大的头项目.对于每个新项目,如果它是>=头项目则丢弃它,否则弹出头项目并插入新项目.
旁注:标准容器只有在你成长的情况下才会增长.只要在插入新项目之前删除一个项目(当然,在它达到最大大小之后),就不会发生这种情况.
| 归档时间: |
|
| 查看次数: |
6571 次 |
| 最近记录: |