【问题标题】:What is the space complexity of moving one stack/queue to another stack/queue?将一个堆栈/队列移动到另一个堆栈/队列的空间复杂度是多少?
【发布时间】:2019-08-07 23:36:18
【问题描述】:

我试图了解将元素从一个堆栈移动到另一个堆栈的空间复杂度。

我在 leetcode 上找到了this article,但存在一些差异。

假设我们通过执行 pop() 和 push() 3 次将 stack1 (1-2-3) 移动到另一个 stack2,我们是否会考虑 O(1) 额外空间,因为我们从 stack1 中删除一个元素并创建一个stack2 中的元素因此没有使用 extra 空间?或者我们认为它是 O(n) 空间复杂度,因为我们创建了一个与 stack1 大小相同的 stack2(但 stack1 已经消失了..)?

提前致谢!

【问题讨论】:

    标签: stack queue time-complexity big-o space-complexity


    【解决方案1】:

    这取决于您的堆栈是如何实现的。也就是backing store是什么?

    如果堆栈被实现为一个数组,那么堆栈将被初始化为一些默认容量,当前计数为 0。类似于:

    s = int[10];
    count = 0;
    

    当您将某些内容压入堆栈时,该项目被添加并且count 递增到 1。如果您尝试压入的项目数量超过了数组将容纳的数量,那么数组将被扩展。 (实际上,可能分配了一个新数组并将现有内容复制到其中。)

    当你弹出一些东西时,count 减 1,并返回 s[count]。但是数组分配没有改变。

    因此,如果堆栈实现为数组,则从一个堆栈复制到另一个堆栈将需要 O(n) 额外空间。至少暂时。

    如果栈实现为链表:

    头>节点>节点>节点...

    然后通常pop 只是返回head,而新的头是head 之前指向的节点。在这种情况下,堆栈占用的内存会随着每次弹出而减少。当然,添加到新堆栈会增加相同数量的内存分配。所以如果栈实现为链表,那么从一个栈复制到另一个栈是O(1)的额外空间。

    【讨论】:

    • 感谢您的回答。我在 C++ 中将堆栈视为std::stack。我认为这更像是您的链表案例,它不是固定大小,而是通过执行pop 减少了一定数量的内存分配,并通过执行push 在另一个堆栈中创建相同数量的内存。你同意我的观点吗?
    • @SLAM_DK 根据std::stack documentation,可以指定使用的序列容器的类型。在标准容器类型中,std::vector(实现为数组)、std::deque(固定大小的数组序列)和std::list(通常是链表)都可以使用。所以,再次,“这取决于。”如果您在创建堆栈时未指定容器,则使用std::deque。我不熟悉deque 的实现。我不知道随着堆栈中项目数量的减少,它是否或如何释放空间。
    • 我想我把问题简单化了。经过一番搜索,this 告诉我它不会释放deque 中的空间,因此将元素从一个堆栈移动到另一个堆栈时需要 O(n) 空间复杂度。不确定我是否想深入到算法面试中。再次感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多