当前位置: 首页 > 知识库问答 >
问题:

StackQueue摊销时间实现

狄阳秋
2023-03-14

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

使用堆栈实现队列。也就是说,只使用push和pop操作来写入队列和出队列。

就性能而言,enqueue应该是O(1),但dequeue在最坏的情况下可能是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个答案

党俊健
2023-03-14

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

用势法很容易证明。每当我们排队一个值时,我们为推入的成本“支付”3:1的费用,为将来转移到out节省2的费用。

我们还可以用3:1emptytest,1poponout,1in为空来支付出队列费用。我们可以用我们在enqueue中节省的盈余来支付每次poponinpushonout的费用。

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

 类似资料:
  • Edit:您可以假设hashtable使用基本链接,其中元素位于相应链表的末尾。我的真正问题是关于概率算法的摊销分析。 编辑2:我在quicksort上发现了这篇文章,“摊销运行时间和预期运行时间之间有一个微妙但重要的差异。使用随机枢轴的quicksort的预期运行时间为O(n log n),但其最坏的运行时间为θ(n^2)。这意味着quicksort的成本很小,但随着n的增加,这种可能性接近于零

  • 问题内容: 与渐进分析有何不同?您何时使用它,为什么? 我读过一些写得不错的文章,例如: http://www.ugrad.cs.ubc.ca/~cs320/2010W2/handouts/aa-nutshell.pdf http://www.cs.princeton.edu/~fiebrink/423/AmortizedAnalysisExplained_Fiebrink.pdf 但我仍然没有完

  • 假设您使用一个数组实现了一个堆,并且每次数组满时,您都将其复制到一个数组,该数组的大小是数组的两倍。向堆中插入元素的摊销时间复杂度(对于最坏的情况)是多少? 我认为我们有(这是最坏情况下n个操作序列总成本的一个上界),那么根据一个公式摊销的复杂度是。 但我认为这是非常错误的,因为从直觉上很清楚,我应该得到或更低……那么我应该如何计算这个呢?

  • 本文向大家介绍解释息税折旧及摊销前的收益(EBITDA)。,包括了解释息税折旧及摊销前的收益(EBITDA)。的使用技巧和注意事项,需要的朋友参考一下 EBITDA指未计息税折旧和摊销前的收益。EBITDA通过排除非运营决策来专注于企业的运营决策。 公司/行业之间的盈利能力可以使用EBITDA进行分析。息税折旧摊销前利润为正值表示公司正在通过其运营获得利润,而息税折旧摊销前利润为负意味着该公司未通

  • 问题内容: 如何更改phpmyadmin自动注销时间? 它会在1440秒后自动注销,这对我来说非常低。如何更改选项或完全删除登录请求? 问题答案: 创建或编辑文件并在其中设置此变量值: 整数以秒为单位。500000秒是5.7天。然后重新启动apache。

  • 我在java应用程序中使用gRPC(非阻塞存根),两个函数调用之间的响应时间约为5-8ms。我想减少它。你有什么建议?有可能吗?