使用两个堆栈实现队列的持续摊销复杂性

问题描述 投票:1回答:2

方法:保持两个堆栈A和B.推入A.弹出看B.如果B为空,则完全弹出A并将其推入B然后从B弹出。否则只需弹出B.

问题:1)运行时间和摊销运行时间有什么区别? 2)为什么摊销的运行时间在这里不变?它会不会随着输入数量的增加而增加,当我们决定从中弹出时?因为如果我们继续推动,那么当A为空时A充满了很多。现在,如果我们决定从B弹出,那么我需要复制所有A然后弹出。

stack queue complexity-theory asymptotic-complexity amortized-analysis
2个回答
4
投票

在查看摊余成本时,您不会查看单个操作,而是查看程序执行期间发生的多个操作。这个想法是,如果你有很多非常便宜的操作(比如单推或弹出),而且很少有昂贵的操作(比如弹出A中的所有项目并将其推送到B),你可以“分发”昂贵的操作成本低廉。与单个出列的最坏情况O(n)相比,这给出了“总体”成本。

在您的示例中,您可以显示每个元素最多被推送到堆栈两次(一次用于添加,一次用于将其推送到另一个堆栈)并弹出最大值。两次(一次用于从堆栈弹出它,一次用于弹出它以从队列中删除它)。因此,对于入队操作,摊销的最大值。 cost是3(因为当一个元素被推动而且从不弹出时它可能仍会弹出并被推送到另一个堆栈)和1表示一个两个都是常数的dequeue。


1
投票

这里的关键思想是一个项目在其整个生命周期中从stack1移动到stack2一次,即它在stack1中被推入,被移动到stack2然后弹出。没有任何反复的往来。因此它在其生命周期中最多可以进行4次操作

  1. (第一次推送)在队列中初始推送stack1
  2. (第一次弹出)当弹出从堆栈1移动到stack2时
  3. (第二次按下)当被推入堆栈2以便从堆栈1移动到堆栈2时
  4. (第二次弹出)出队时出队

假设每次推/弹操作费用为1美元。所以一个项目从入队到出队就会消耗4美元。因此,如果您运行此入队/出队业务,如果您开始为每个入队和出列运营收取4美元,您的业务将收支平衡(0美元的盈利或亏损)。因此,每个入队/出列联合作业的摊销成本为4美元。

相反,如果您只运营一个入队业务,那么您可以只收取1美元,因为您只需要一次推送即可完成工作。因此,每个入队操作的摊销成本为1美元。

如果你只运行一个出列的业务,那么每次出列操作都要收3美元,因为你必须弹出两次并按照上面的步骤推动一次。因此,每次出列行动的费用为3美元。

© www.soinside.com 2019 - 2024. All rights reserved.