Data structures 支持后进先出推和弹出的优先级队列?

Data structures 支持后进先出推和弹出的优先级队列?,data-structures,stack,priority-queue,Data Structures,Stack,Priority Queue,我需要设计具有以下约束的“优先级队列堆栈”数据结构: 在一般情况下,pop()和deleteMin()在O(log(n))中运行 push(x)和getMin()在平均时间内以O(1)运行 有人对如何设计这个有什么建议吗?您可以使用带有指向最小值对象的堆栈。因此,在这种情况下,push(x)、pop()和getMin()将在O(1)中—在平均时间内 但是在deleteMin()之后,您需要调整顶部项目 您可以通过将标准堆栈与支持O(1)插入和O(logn)分期删除的优先级队列组合在一起来实现

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

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

有人对如何设计这个有什么建议吗?

您可以使用带有指向最小值对象的堆栈。因此,在这种情况下,push(x)、pop()和getMin()将在O(1)中—在平均时间内


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

您可以通过将标准堆栈与支持O(1)插入和O(logn)分期删除的优先级队列组合在一起来实现这一点。例如,可以将堆栈与斐波那契堆或斜二项堆配对,这两种堆都有这些保证。确保将指针存储在每个堆栈元素及其对应的优先级队列元素之间,以便在O(1)时间内可以在这两个元素之间跳转

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

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


希望这有帮助

如何在O(日志n)上执行deleteMin()?使用普通堆栈似乎很困难:请不要将堆栈实现为数组,而是将其实现为双链接列表。始终有3个指针(表头、最小项目指针、最后一个项目指针)。push-->在双链接列表末尾添加项目。pop-->删除链接列表末尾的项目。在这种情况下,所有操作pop()、push(x)、getMin()将有O(1)。只有deleteMin将没有O(1)平均时间,因为您需要重新计算下一分钟;但您始终可以使用“2分钟”指针对其进行优化。在推送时,我们需要检查推送值到最小指针值,并更改所需的最小指针。