支持LIFO推送和弹出的优先级队列?

时间:2013-01-16 16:41:46

标签: data-structures stack priority-queue

我需要设计一个具有以下约束的“优先级队列堆栈”数据结构:

  • pop()和deleteMin()在平均情况下以O(log(n))运行。
  • push(x)和getMin()在平均时间内以O(1)运行

有没有人有关于如何设计这个的建议?

2 个答案:

答案 0 :(得分:3)

您可以通过将标准堆栈与支持O(1)插入和O(log n)摊销删除的优先级队列组合在一起来实现此目的。例如,您可以将堆栈与Fibonacci堆或倾斜二项堆配对,两者都具有这些保证。确保存储指向每个堆栈元素及其相应优先级队列元素的指针,以便在O(1)时间内可以在两者之间跳转。

要推送元素,请将其推入堆栈,并在O(1)时间内将其插入优先级队列。要读取最小值,请在O(1)时间内查询优先级队列中的最小值。

要删除最小值,请从优先级队列中调用extract-min以删除最小值,然后转到堆栈并将删除的元素标记为无效。这需要O(1)时间。要弹出,重复弹出堆栈,直到弹出未标记为无效的元素,然后在优先级队列上调用delete以删除该元素。这需要时间O(k + log n),其中k是执行的弹出数。但是,您可以通过使用潜在方法显示这是分摊O(1)。如果将堆栈的电位设置为无效参数的数量,则每个delete-min将电位增加1,并且弹出k个无效元素的每个pop操作将电位减小k。因此,pop的分期运行时间为O(log n)。

希望这有帮助!

答案 1 :(得分:0)

您可以使用Stack with point to Minimum Value Object。所以在这种情况下,push(x),pop(),getMin()将在O(1)中 - 在平均时间内。

但是在deleteMin()之后,您需要调整顶部项目。