根据下面引用的规范,实现了一个队列(该语言在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
我想知道,你怎么能证明出队的摊还时间? 谢谢!
答案 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则为空。我们可以pop
上in
push
和[{1}} out
支付enqueue
的余额{{1}}。
我们可以通过&#34;支付&#34;每个都有3个,给出了O(1)的摊销复杂性。