我有一个包含最大元素的整数列表,我需要跟踪列表中的最大元素:
[3, 1, 2] (3 is the max)
每个时间段,我都会获得一个新的随机元素,将其添加到列表的末尾,并在常量时间内删除列表的第一个元素。所以,在当前时间段结束时,我的列表将变换如下:
[3, 1, 2] (3 is the max)
-> [3, 1, 2, -5] (don't care about max at this moment)
-> [1, 2, -5] (now 2 is the max)
我可以保持一个优先级队列,键入列表中的值,给出O(log(n))插入和删除,但我想知道是否有更高效(可能[摊销]常量时间?)的方法它
答案 0 :(得分:1)
有一些算法具有O(1)摊销的复杂性:
with deque: Can min/max of moving window achieve in O(N)?
有两个堆栈: Implement a queue in which push_rear(), pop_front() and get_min() are all constant time operations
答案 1 :(得分:0)
例:
然而:
为了使第三种情况符合性能,您需要按插入顺序维护一个(双向链接)元素列表,并按大小顺序维护一个树。然后,您只需在列表和树中执行插入/删除操作,并从树中读取新的当前最大值。这与您的树实现一样高效,O(N)用于构建插入顺序列表,O(N log N)用于构建排序树。
保存列表元素的数据结构如下所示:
public class Element {
Element PrevInsertionOrder;
Element NextInsertionOrder;
Element RankingTreeParent;
Element RankingTreeLeftChild;
Element RankingTreeRightChild;
int Data;
}
更新
通过维护第二个(双重链接的)不同键值列表和出现次数(而不是上面的第二个树),O(1)时间执行MAX确定似乎是可能的。