我需要设计一个具有以下约束的“优先级队列堆栈”数据结构:
有没有人有关于如何设计这个的建议?
答案 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()之后,您需要调整顶部项目。