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

时间:2009-03-09 01:25:32

标签: algorithm stack amortized-analysis

我有一个抽象的数据类型,可以看作是从左到右存储的列表,具有以下可能的操作: 推送:在列表的左端添加一个新项目 弹出:删除列表左端的项目 拉:删除列表右端的项目

使用三个堆栈和常量额外内存实现此功能,以便任何推送,弹出或拉动操作的分摊时间保持不变。堆栈具有基本操作,isEmpty,Push和Pop。

摊销时间的意思是“如果我花费这么长时间,我可以花费另一块时间将其存放在一堆时间中以便以后使用。”就像每次推送操作一样,花费三个恒定时间的块,因此对于每个按下的元素,你有2个额外的恒定时间块。

4 个答案:

答案 0 :(得分:10)

做出一些假设:

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

    使用三个堆栈实现此目的   不断增加内存,这样   任何推,弹出的摊销时间,   或拉动操作是不变的。该   堆栈有基本操作,isEmpty,   推,然后弹出。

    然后,我的第一个建议是忽略那些与你谈论链接列表的人。是的,这就是任何理性的人如何实现它没有三个堆栈要求,但是家庭作业的关键因素不是按照合理的人的方式去做,而是你的教练要你怎么做

    我的第二点建议是获得一些积木,一副纸牌或一堆泡沫塑料杯并指定三个堆叠(例如带有杯垫或其他东西)。

    ,当你将一个堆栈的内容传输到另一个堆栈时会发生什么事情,开始四处游戏。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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