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

时间:2014-05-30 07:52:52

标签: stack queue complexity-theory asymptotic-complexity amortized-analysis

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

这里的关键思想是项目在整个生命周期中仅一次从stack1移到stack2,即它被推入stack1,然后移到stack2,然后弹出。没有来回的一切。这样一来,它最多可以进行4次操作

  1. (第一次推送)入队时在stack1中的初始推送
  2. (第一个弹出窗口)从堆栈1移到堆栈2时弹出
  3. (第二次推送)在堆栈2中推送以从堆栈1移到堆栈2时
  4. (第二次弹出)在出队时弹出

假设每个推送/弹出操作的费用为1美元。因此,从入队到出队,一件物品将消耗4美元。因此,如果您正在运行此入队/出队业务,如果您开始为每个入队和出队操作收取$ 4的费用,则您的业务将收支平衡($ 0盈亏)。因此,每个入队/出队组合操作的摊销成本为4美元。

如果您经营的是仅入队业务,那么您只需收取1美元的费用,因为您只需要按一下按钮就可以完成工作。因此,每个入队操作的摊销成本为1美元。

如果您经营的是仅出队操作,则您需要为每次出队操作收取$ 3的费用,因为您必须按照上述步骤操作两次并按下一次。因此,每个出队操作的摊销成本为3美元。

相关问题