【发布时间】:2014-06-28 10:16:15
【问题描述】:
我有一个关于如何工作的问题:
使用 3 个堆栈实现双端队列。 Deque 有这些操作:InsertHead、InsertTail、DeleteHead、DeleteTail。证明每个操作的摊销时间为 O(1)。
我尝试将问题视为河内问题。 所以让我们将堆栈称为:L(左),M(中),R(右)。
伪代码实现:
InsertHead(e):
L.push(e);
DeleteHead(e):
L is empty:
while R is not empty:
pop and insert the element to M;
pop M;
while M is not empty:
pop and insert the element to R;
L is not empty:
L.pop(e);
InsertTail 和 DeleteTail 与上述实现原理相同。 如何证明摊销时间为 O(1)? 因为 L 中可以有 N 个元素,并且 wile 循环需要 O(n),现在如果我调用 deleteHead N 次来计算摊销时间,复杂度不会是 O(n^2)?
有人可以帮助我如何证明上述实现在摊销时间内需要 O(1)?
【问题讨论】:
-
使用两个堆栈:L 和 R。当尝试在空 L 上弹出(L)时,将 R 中的所有元素平均分配给 L 和 R(此操作需要第三个堆栈)。
-
为什么将 R 在 L 和 R 之间平分,而不是像我一样?
-
因为这样你不会得到 O(1) (如果 L 总是为空会发生什么?)
-
好的,假设我知道 R 中的元素数量是多少,我使用第三个堆栈将它平分在 L 和 R 之间(根据问题要求)所以如果我在 R 中有 N 个元素, 仍然.. 我需要遍历 R 中的 N 个元素,以平均划分 L 和 M 之间的元素,然后我需要移动 M 的元素以将它们转移回 R。对吗?现在,如果我尝试调用 DeleteHead N 次,它仍然是 O(n^2)。那么摊销时间怎么可能是 O(1)?!
-
Egor 和 n.m 我已经编辑了我的问题并添加了一张描述您的解决方案的图片。它怎么可能是 o(1)?
标签: algorithm data-structures stack deque amortized-analysis