【问题标题】:Design a stack that can also dequeue in O(1) amortized time?设计一个也可以在 O(1) 摊销时间内出列的堆栈?
【发布时间】:2010-10-12 02:26:38
【问题描述】:

我有一个抽象数据类型,可以将其视为从左到右存储的列表,具有以下可能的操作: Push:在列表的左端添加一个新项目 pop:移除列表左端的项目 拉取:移除列表右端的项目

使用三个堆栈和恒定的附加内存来实现这一点,以便任何推送、弹出或拉取操作的摊销时间都是恒定的。堆栈具有基本操作,isEmpty、Push 和 Pop。

摊销时间的意思是“如果我花费了这么多时间,我可以再花费一部分时间并将其存储在时间银行中以备后用。”就像每次推送操作一样,花费三个常量时间块,所以对于每个推送的元素,您有 2 个额外的常量时间块。

【问题讨论】:

  • 显然,但我想没关系,这是一个有趣的问题,我想听听解决方案。
  • 家庭作业与否影响回答方式。作业指导思想,不要只发代码,不是吗?
  • 我对待家庭作业的问题和非一样。也就是说,这个问题实际上是一个指令“做我的功课”,没有任何迹象表明 OP a)理解问题,b)想要理解问题,或 c)关心从任务中学习任何东西。这并不能满足回答。

标签: algorithm stack amortized-analysis


【解决方案1】:

使用双向链表并保持指向头部和尾部的指针。其余的,您需要先编写自己的代码,然后让我们帮助您更正。

【讨论】:

  • 这可能是构建这个东西的最佳方式,因为它没有人为的大小限制,但相对复杂。
  • 有关双向链表(在 Actionscript 中)的一个很好的例子,请访问 www.polygonal.de
【解决方案2】:

你可以做一些只使用 3 个堆栈的事情。想想tower of Hanoi

【讨论】:

    【解决方案3】:

    做一些假设:

    1. 这是家庭作业
    2. 这一段是作业的一部分

    使用三个堆栈和 恒定的附加内存,因此 任何推送,弹出的摊销时间, 或拉操作是恒定的。这 栈有基本的操作,isEmpty, 推送,然后弹出。

    那么我的第一个建议是忽略与您谈论链表的人。诚然,任何理性的人都会这样做没有三个堆栈的要求,但是家庭作业的关键因素不是按照一个理性的人的方式去做,而是你的老师希望你怎么做.

    我的第二条建议是准备一些积木、一副纸牌或一堆泡沫塑料杯,并指定三叠(例如杯垫或其他东西)。开始尝试将一个堆栈的内容转移到另一个堆栈时会发生什么,这应该会给你一个想法。

    【讨论】:

    • @sflossen 同意,但我认为分配的目标可能是让他们内化堆栈语义。如果阅读作业没有做到这一点,那么可能需要动手经验。
    【解决方案4】:

    首先根据两个堆栈(一个非常标准的问题)实现一个队列并进行概括。

    【讨论】:

    • 这就是我对这个问题的不理解。 “标准”/Okasaki 两个列表解决方案没有 O(1) 摊销时间出队吗?
    猜你喜欢
    • 2014-06-28
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2013-10-21
    • 2011-01-27
    • 2021-06-02
    • 1970-01-01
    相关资源
    最近更新 更多