一尘不染

实现一个队列,其中push_rear(),pop_front()和get_min()都是恒定时间操作

algorithm

我遇到了一个问题: 实现一个队列,其中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()。

感谢所有的建议。


阅读 207

收藏
2020-07-28

共1个答案

一尘不染

您可以使用O(1)pop(),push()和get_min()来实现堆栈:只需将当前最小值与每个元素一起存储。因此,例如,堆栈[4,2,5,1](顶部为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元素。

要找到队列的最小元素,请查看各个最小堆栈的最小两个元素,然后取这两个值中的最小值。(当然,这里有一些额外的逻辑,如果其中一个堆栈为空,但这并不是很难解决的问题)。

这将有O(1)get_min()push()摊销O(1) pop()

2020-07-28