【问题标题】:A priority queue supporting LIFO push and pop?支持 LIFO 推送和弹出的优先级队列?
【发布时间】:2012-12-31 01:28:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: data-structures stack priority-queue


    【解决方案1】:

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

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

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

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您可以将堆栈与指向最小值对象一起使用。所以在这种情况下 push(x),pop(), getMin() 将在 O(1) 中 - 平均时间。

      但是在deleteMin()之后,需要调整top items。

      【讨论】:

      • 你将如何在 O(log n) 上执行 deleteMin() ?使用普通堆栈似乎很困难:p
      • 请不要将堆栈实现为数组,而应将其实现为双链表。总是有 3 个指针( Header、Min Item 指针、Last Item Pointer.push --> 在 Double LinkList 末尾添加项。pop --> 删除 LinkList 末尾的项。在这种情况下,所有操作 pop(),push( x), getMin() 会有 O(1)。只有 deleteMin,不会有 O(1) 平均时间,因为你需要重新计算下一个 Min;但你总是可以通过“2 Min”指针来优化它。推送时,我们需要检查推送的值是否为 Min 指针值并更改所需的 Min 指针。
      猜你喜欢
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多