添加新元素并删除最旧元素后,列表中的最大元素

时间:2013-04-11 23:38:53

标签: algorithm

我有一个包含最大元素的整数列表,我需要跟踪列表中的最大元素:

[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))插入和删除,但我想知道是否有更高效(可能[摊销]常量时间?)的方法它

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

例:

  1. New> = CurrentMax和First anything:CurrentMax更新为New;
  2. 新< CurrentMax和First<当前最大值:不变;
  3. 新< CurrentMax和First> =当前最大值:搜索以确定新的CurrentMax;
  4. 然而:

    为了使第三种情况符合性能,您需要按插入顺序维护一个(双向链接)元素列表,并按大小顺序维护一个树。然后,您只需在列表和树中执行插入/删除操作,并从树中读取新的当前最大值。这与您的树实现一样高效,O(N)用于构建插入顺序列表,O(N log N)用于构建排序树。

    保存列表元素的数据结构如下所示:

    public class Element {
      Element PrevInsertionOrder;
      Element NextInsertionOrder;
      Element RankingTreeParent;
      Element RankingTreeLeftChild;
      Element RankingTreeRightChild;
      int Data;
    }
    

    更新

    通过维护第二个(双重链接的)不同键值列表和出现次数(而不是上面的第二个树),O(1)时间执行MAX确定似乎是可能的。