Algorithm 设计一个堆栈,也可以在O(1)摊销时间内出列?

Algorithm 设计一个堆栈,也可以在O(1)摊销时间内出列?,algorithm,stack,amortized-analysis,Algorithm,Stack,Amortized Analysis,我有一个抽象数据类型,它可以被视为从左到右存储的列表,具有以下可能的操作: 推送:将新项目添加到列表的左端 Pop:删除列表左端的项目 拉动:删除列表右端的项目 使用三个堆栈和恒定的额外内存来实现这一点,这样任何推、弹出或拉操作的摊销时间都是恒定的。栈有基本的操作:isEmpty、Push和Pop 摊销时间意味着“如果我花了这段时间,我可以再花一段时间,并将其存储在一个时间库中,以备以后使用。”就像每个推送操作一样,花三段固定时间,因此对于每个推送的元素,您有两个额外的固定时间块。使用双链接列表

我有一个抽象数据类型,它可以被视为从左到右存储的列表,具有以下可能的操作: 推送:将新项目添加到列表的左端 Pop:删除列表左端的项目 拉动:删除列表右端的项目

使用三个堆栈和恒定的额外内存来实现这一点,这样任何推、弹出或拉操作的摊销时间都是恒定的。栈有基本的操作:isEmpty、Push和Pop


摊销时间意味着“如果我花了这段时间,我可以再花一段时间,并将其存储在一个时间库中,以备以后使用。”就像每个推送操作一样,花三段固定时间,因此对于每个推送的元素,您有两个额外的固定时间块。

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

您可以只使用3个堆栈来完成某些操作。思考。

做一些假设:

  • 这是家庭作业
  • 本段是作业的一部分
  • 使用三个堆栈和 恒定的额外内存,以便 任何推送、弹出、, 或拉动操作是恒定的。这个 堆栈有基本的操作,isEmpty, 推,然后砰的一声

    那么我的第一个建议就是忽略那些和你谈论链表的人。诚然,这是任何一个通情达理的人在没有三层结构要求的情况下都会实现它的方式,但家庭作业的关键因素不是按照通情达理的人的方式来做,而是按照你的导师希望你的方式做


    我的第二点建议是拿一些积木、一副卡片或一堆聚苯乙烯泡沫塑料杯,并指定三层(例如带杯垫或其他东西)。开始玩弄将一个堆栈的内容转移到另一个堆栈时会发生什么,这应该会给你一个想法。

    从实现两个堆栈的队列开始(这是一个相当标准的问题)并进行概括。

    显然,但我想这并不重要,这是一个有趣的问题,我想听听答案。家庭作业与否会影响答案。对于指导思想的家庭作业,不要只是发代码,不是吗?我对待家庭作业问题和对待非问题一样。这就是说,这个问题实际上是一个指令“做我的家庭作业”,没有任何迹象表明OP a)理解问题,b)想理解问题,或c)想从任务中学到任何东西。这并不能让回答变得令人满意。这可能是构建这个东西的最佳方式,因为它没有人为的大小限制,但它相对复杂。有关双链接列表的一个好例子(在Actionscript中),请访问www.polygol。de@sflossen同意,在某种程度上,但我认为赋值的目标可能是让它们内部化堆栈语义。如果阅读作业做不到这一点,那么可能需要亲身体验。这就是我不理解这个问题的原因。“标准”/“Okasaki双列表”解决方案是否有O(1)个摊销时间出列?