【问题标题】:StackQueue Amortized Time ImplementationStackQueue 摊销时间实现
【发布时间】:2015-06-02 15:22:59
【问题描述】:

根据下面引号中的规范,实现了一个队列(该语言使用 Ruby,但希望每个人都可以阅读)。

使用堆栈实现队列。也就是写入队和出队 仅使用推送和弹出操作。

在性能方面,入队应该是O(1),但出队可能是 最坏情况 O(n)。就摊销时间而言,出队应该是 O(1)。 证明您的解决方案可以做到这一点。

class StackQueue
  def initialize
    @in, @out = [], []
  end

  def enqueue(value)
    @in << value
  end

  def dequeue
    if @out.empty?
      @out << @in.pop until @in.empty?
    end

    @out.pop
  end
end

我想知道,您如何证明出队的摊销时间? 谢谢!

【问题讨论】:

  • 对#1 的明显回答:shift 不在规范允许的方法集中,即pushpop

标签: performance data-structures queue


【解决方案1】:

直观地说,O(1) 摊销复杂度很容易理解:我们出队的每个元素都被推送到 in 恰好一次,从 in 弹出一次,恰好推送到 out 一次并从 out 弹出一次,所有这些都是 O(1) 操作。

使用势能法很容易证明。每次我们enqueue 一个价值,我们“支付” 3:1 的成本为push,2 我们为将来移动到out 保存。

我们也可以用 3 支付 dequeue:1 用于 empty 测试,1 用于 out 上的 pop,1 用于确定 in 为空。我们可以为in 上的每个popout 上的push 支付费用,而我们在enqueue 上的盈余可以节省下来。

我们可以通过为每个“支付”3 个操作来负担所有操作,给出 O(1) 的摊销复杂度。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2014-06-28
    • 2021-04-03
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多