这不是家庭作业。
我正在使用一个小的“优先队列”(目前实现为数组)来存储具有最小值的最后 N 个项目。这有点慢 - O(N) 项插入时间。当前的实现跟踪数组中最大的项目并丢弃任何不适合数组的项目,但我仍然想进一步减少操作数量。
寻找符合以下要求的优先级队列算法:
- 队列可以实现为数组,它具有固定大小并且_不能_增长。严格禁止在任何队列操作期间进行动态内存分配。
- 任何不适合数组的东西都会被丢弃,但队列会保留所有遇到过的最小元素。
- O(log(N)) 插入时间(即,将元素添加到队列中应该占用 O(log(N)))。
- (可选)O(1) 访问队列中*最大* 的项目(队列存储 *最小* 项目,因此最大的项目将首先被丢弃,我需要它们来减少操作次数)
- 易于实施/理解。理想情况下——类似于二分搜索——一旦你理解了它,你就会永远记住它。
- 元素不需要以任何方式排序。我只需要保持 N 曾经遇到过的最小值。当我需要它们时,我会立即访问所有这些。所以从技术上讲,它不必是一个队列,我只需要存储 N 个最后的最小值。
我最初考虑使用二进制堆(它们可以通过数组轻松实现),但显然当数组不能再增长时它们表现不佳。链表和数组需要额外的时间来移动东西。stl 优先级队列增长并使用动态分配(不过我可能错了)。
那么,还有其他想法吗?
--EDIT--
我对 STL 的实现不感兴趣。由于大量的函数调用,STL 实现(由少数人建议)的工作速度比当前使用的线性数组慢一些。
我对优先队列算法感兴趣,而不是实现。