data-structures - 支持 LIFO 压入和弹出的优先级队列?

标签 data-structures stack priority-queue

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

  • 一般情况下,pop() 和 deleteMin() 的运行时间复杂度为 O(log(n))。
  • push(x) 和 getMin() 的平均运行时间为 O(1)

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

最佳答案

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

要压入一个元素,请将其压入堆栈并在 O(1) 时间内将其插入优先级队列。要读取最小值,请在 O(1) 时间内查询优先级队列以获取最小值。

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

希望这有帮助!

关于data-structures - 支持 LIFO 压入和弹出的优先级队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14363319/

相关文章:

c - 使用 typedef 的链接列表

data-structures - 如何在没有头指针的情况下找到单链表的前一个节点

c++ - C/C++ 中超大静态数组的算术运算

c++ - STL 优先队列 : When/How Does Resorting Occur?

memory-management - 有没有一种方法可以在不将每个元素推送到字符串的情况下在使用它获取字符串的同时在空白处加入 BTreeSet?

java - 可以维护插入顺序,过滤掉重复元素并轻松删除第一个元素的数据结构?

c++ - 平衡括号问题为什么检查它是否为空?

c++ - 为什么 gprof 告诉我从 main() 只调用一次的函数被调用了 102 次?

scala - 在 Scala 中创建最小堆最简单、最有效的方法是什么?

java - 高效的集合使用