当前位置: 首页 > 知识库问答 >
问题:

堆栈升序排序(空间分析)

叶明辉
2023-03-14

我正在阅读《破解编码面试》一书,遇到了一个问题:“编写一个程序,按升序对堆栈进行排序。您可以使用其他堆栈来保存项目,但不能将元素复制到任何其他数据结构(如数组)中。堆栈支持以下操作:push、pop、peek、isEmpty。”

这本书用O(n^2的时间复杂度和空间复杂度给出了答案。

但是,我偶然发现了这个博客,它使用快速排序方法在O(n log n)时间复杂性中提供了答案。

我想知道的是空间复杂度是O(n^2)吗?因为对该方法的每次调用都涉及初始化另外两个堆栈,以及另外两个递归调用。

我对空间复杂性仍然有点摇摇欲坠。我不确定这是否是 O(n^2) 空间,每个递归调用生成的新堆栈都小于升级的堆栈。

如果有人能在他们的答案后面解释一下,那就太好了。

共有2个答案

咸昀
2023-03-14

在这种快速排序方法中,空间复杂度将完全遵循时间复杂度——原因很简单。递归地划分子堆栈(使用pivot ),直到每个元素都在一个大小为1的堆栈中。这导致(2^x = n)划分x个子栈(深度为log n ),最后你有n个栈,每个栈的大小为1。因此,总的空间复杂度将是O(n*log n)。

请记住,在这种情况下,空间复杂度将遵循时间复杂度,就像我们在每次迭代中占用新空间一样。所以,在最坏的情况下,空间复杂度将是O(n^2)。

邢昂然
2023-03-14

平均情况下空间复杂度也是O(n log n)。如果空间复杂度恰好是O(n^2),那么时间复杂度怎么可能是O(n log n),因为每个分配的空间至少需要一次访问。

因此,在一般情况下,假设堆栈每次都被分成两半,在第I个递归深度,数组的大小变成O(n/2^i,2^i递归在第I个深度分支。因此,在第I个深度上分配的总大小是O(n/2^i) *2^i = O(n)。

由于最大深度为logn,所以总体空间复杂度为O(nlogn)。

然而,在最坏的情况下,空间复杂度为O(n^2)。

 类似资料:
  • 我已经在Java和C中找到了这个问题的几个实现,但我还没有找到一个使用JavaScript的示例。这是一个相当常见的技术面试问题: 在2n空间中对堆栈进行排序。(仅使用2个堆栈对堆栈进行排序)

  • 在这个程序中,我必须打开一个文件并将其打印到文本区域,然后确保所有括号、括号等匹配。如果括号匹配,我将在另一个文本区域中打印出来。我的问题如下:我是从文件中读取还是从第一个文本区域读取?我是在Actionlistener还是在构造函数中创建堆栈?

  • 给定一个堆栈,任务是对它进行排序,使堆栈的顶部具有最大的元素。 示例1: 输入:堆栈:3 2 1输出:3 2 1示例2: 输入:堆栈:11 2 32 3 41输出:41 32 11 3 2 您的任务: 预期时间复杂度:O(N*N)预期辅助空间:O(N)递归。 约束:1

  • 以下是完整的问题: 编写一个java方法,它将接受两个排序后的堆栈a和B(最小值在顶部),并返回一个排序后的堆栈D(最小值在顶部)。只允许使用堆栈操作,如pop、push、isEmpty和peek。 示例:假设A={(top)1,4,7,9}和B={(top)2,3,6},那么函数将返回一个新的堆栈D={(top)1,2,3,4,6,7,9} 我写的代码是这样的: 你怎么认为?

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • 有3个堆栈-A、B、C 堆栈A和B被排序(堆栈顶部的数字最大)。堆栈C为空,仅允许5次操作: 推,弹出,顶,is_empty,创建 我们需要编写一个函数来接收堆栈A和B,将堆栈A和B中的所有数字移动到堆栈C,堆栈C必须排序(最大数字在顶部)。 我有算法: 弹出最小的元素并推送到堆栈C 重复步骤2,直到任何堆栈(A或B)变空 将剩余元素从非空堆栈移动到C。现在你有了C中的所有元素,但顺序是升序。(这