stack - 将一个堆栈/队列移动到另一个堆栈/队列的空间复杂度是多少?
问题描述
我试图了解将元素从一个堆栈移动到另一个堆栈的空间复杂性。
我在 leetcode 上找到了这篇文章,但存在一些差异。
假设我们通过执行 pop() 和 push() 3 次将 stack1 (1-2-3) 移动到另一个 stack2,我们是否会考虑 O(1) 额外空间,因为我们从 stack1 中删除一个元素并在 stack2 中创建一个元素因此没有使用额外的空间?或者我们认为它是 O(n) 空间复杂度,因为我们创建了一个与 stack1 大小相同的 stack2(但 stack1 已经消失了..)?
提前致谢!
解决方案
这取决于您的堆栈是如何实现的。也就是说,什么是后备存储?
如果堆栈被实现为一个数组,那么堆栈将被初始化为一些默认容量,当前计数为 0。类似于:
s = int[10];
count = 0;
当您将某些内容压入堆栈时,会添加该项目并将其count
递增到 1。如果您尝试压入的项目数量超过了数组将容纳的数量,则该数组将被扩展。(实际上,可能分配了一个新数组并将现有内容复制到其中。)
当你弹出一些东西时,count
减 1,然后s[count]
返回。但是数组分配没有改变。
因此,如果堆栈实现为数组,则从一个堆栈复制到另一个堆栈将需要 O(n) 额外空间。至少暂时。
如果栈实现为链表:
头>节点>节点>节点...
然后通常pop
只返回head
,新的头是head
先前指向的节点。在这种情况下,堆栈占用的内存会随着每次弹出而减少。当然,添加到新堆栈会增加相同数量的内存分配。因此,如果堆栈实现为链表,则从一个堆栈复制到另一个堆栈是 O(1) 额外空间。
推荐阅读
- python - Macbook 上的 Python 安装中断
- java - 每个单独的行如何容纳不同数量的项目?
- python - Selenium 是否适用于基于 Oracle 的网站?
- firebase - 登录 Firebase/Flutter
- javascript - 如何从 .aspx 页面 javascript 调用 C# 方法后面的 Web 窗体代码
- html - 侧边菜单宽度动画?
- hibernate - 如何解决:无法构建 Hibernate SessionFactory 原因:org.hibernate.HibernateException:命名查询中的错误
- django - 图像不会显示 Django3 服务 Angular8
- laravel - 试图从 API 获取 json 中非对象的属性
- server-sent-events - 如何在 Quarkus 中设置服务器发送事件 (SSE) 的事件名称