【问题标题】:Keep track on biggest element in FIFO queue [duplicate]跟踪FIFO队列中的最大元素[重复]
【发布时间】:2015-01-26 00:35:09
【问题描述】:

问题

  • 我有固定长度的整数值 FIFO 队列。
  • 每次我向其中添加新值时,都会删除最旧的值。
  • 队列必须能够在每次插入和删除操作之后告诉它当前最大的值是什么。

问题

有没有比每次循环遍历所有队列元素更好的算法?

接受更新后

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

【问题讨论】:

标签: algorithm queue max


【解决方案1】:

事实上,由于问题的特定结构,这可以通过 O(1) 摊销操作实现,这比使用最大堆要好得多。一个应用程序是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]

【讨论】:

  • 谢谢,我就是这么想的。
【解决方案2】:

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

【讨论】:

  • '+1' 没错,像我这样的接缝需要保持元素与两个结构的链接。
猜你喜欢
  • 2019-11-02
  • 2013-05-26
  • 2012-07-19
  • 1970-01-01
  • 2016-12-03
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多