跟踪FIFO队列中的最大元素

时间:2014-11-27 11:57:49

标签: algorithm queue max

问题

  • 我有固定长度的FIFO队列的整数值。
  • 每当我将新值推入其中时,最旧的值将被移除。
  • 每次插入后,队列必须能够分辨出来&删除操作,目前最大的价值在于它。

问题

算法是否比每次对所有队列元素进行循环更好?

接受更新后

由于我的应用程序中有限的整数域,我还在考虑稀疏直方图,包含队列中给定值的计数。因此,每次值到达时,我都会在直方图中增加其值,并在删除给定值时递减。然后为了获得最大/最小,我只需要获得非零计数的第一个/最后一个直方图索引。

2 个答案:

答案 0 :(得分:2)

实际上由于问题的具体结构,这可以通过O(1)摊销操作实现,这比使用max-heap要好得多。应用程序是sliding window minimum算法。基本上,您保留第二个队列,其中包含所有后缀最大值的递减子序列:

queue = new Queue()
mono = new Queue()
cnt = 0

def enqueue(x):  # O(1) amortized
  while !mono.empty() and x >= mono.back()[1]:
    mono.pop_back()
  queue.push_back([x, cnt])
  mono.push_back([x, cnt])
  cnt++

def dequeue():   # O(1) 
  if mono.front()[0] == queue.front()[0]:
    mono.pop_front()
  return q.pop_front()

def max():  # O(1)
  return mono.front()[1]

答案 1 :(得分:1)

这不仅仅是存储和速度之间的权衡。因此,如果您愿意存储按大小排序的树,当元素添加到FIFO时,FIFO中的元素指向该元素,则会将伴随元素添加到按大小排序的树中。同样,当您从FIFO中删除元素时,删除的元素也将从树中拉出。