我遇到了一个问题: 实现一个队列,其中push_rear(),pop_front()和get_min()都是恒定时间操作。
我最初想到的是,使用最小堆数据结构对get_min()具有O(1)复杂度。但是push_rear()和pop_front()将为O(log(n))。
有谁知道实现具有O(1)push(),pop()和min()的队列的最佳方法是什么?
我对此进行了搜索,并想指出这个Algorithm Geeks线程。但是似乎所有解决方案都没有一个遵循恒定时间规则,这三个方法分别是push(),pop()和min()。
感谢所有的建议。
您可以使用O(1)pop(),push()和get_min()来实现堆栈:只需将当前最小值与每个元素一起存储。因此,例如,堆栈[4,2,5,1](顶部为1)变为[(4,4), (2,2), (5,2), (1,1)]。
[4,2,5,1]
[(4,4), (2,2), (5,2), (1,1)]
然后,您可以使用两个堆栈来实现队列。推入一个堆栈,从另一个堆栈弹出;如果在弹出期间第二个堆栈为空,则将所有元素从第一个堆栈移至第二个。
例如,对于一个pop请求,将所有元素从第一个堆栈中移出[(4,4), (2,2), (5,2), (1,1)],第二个堆栈将为[(1,1), (5,1), (2,1), (4,1)]。现在从第二个堆栈返回top元素。
pop
[(1,1), (5,1), (2,1), (4,1)]
要找到队列的最小元素,请查看各个最小堆栈的最小两个元素,然后取这两个值中的最小值。(当然,这里有一些额外的逻辑,如果其中一个堆栈为空,但这并不是很难解决的问题)。
这将有O(1)get_min()和push()摊销O(1) pop()。
get_min()
push()
pop()