算法是否比每次对所有队列元素进行循环更好?
由于我的应用程序中有限的整数域,我还在考虑稀疏直方图,包含队列中给定值的计数。因此,每次值到达时,我都会在直方图中增加其值,并在删除给定值时递减。然后为了获得最大/最小,我只需要获得非零计数的第一个/最后一个直方图索引。
答案 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中删除元素时,删除的元素也将从树中拉出。