StackQueue摊销时间实施

时间:2015-06-02 15:23:00

标签: performance data-structures queue

根据下面引用的规范,实现了一个队列(该语言在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 个答案:

答案 0 :(得分:0)

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

使用潜在方法很容易证明。每当我们enqueue一个价值时,我们就会付出&#34; 3:1表示push的费用,2我们保存以便将来转移到out

我们也可以为empty测试支付3:1的出列费用,pop上的out支付1,而确定in的1则为空。我们可以popin push和[{1}} out支付enqueue的余额{{1}}。

我们可以通过&#34;支付&#34;每个都有3个,给出了O(1)的摊销复杂性。