Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 按升序排序堆栈(空间分析)_Sorting_Stack_Time Complexity_Space Complexity - Fatal编程技术网

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

Sorting 按升序排序堆栈(空间分析),sorting,stack,time-complexity,space-complexity,Sorting,Stack,Time Complexity,Space Complexity,我在翻阅《破解编码面试》一书时遇到了这个问题 编写一个程序以按升序对堆栈进行排序。您可以使用其他堆栈来保存项目,但不能将元素复制到任何其他数据结构(如数组)中。堆栈支持以下操作:推送、弹出、peek、isEmpty 这本书给出了一个O(n^2)时间复杂度和O(n)空间的答案 然而,我发现使用快速排序方法在O(n logn)时间复杂度方面提供了一个答案 我想知道的是空间复杂度O(n^2)?因为对该方法的每次调用都涉及初始化另外两个堆栈,以及另外两个递归调用 我对空间的复杂性仍然有点不确定。我不确定

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

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

然而,我发现使用快速排序方法在O(n logn)时间复杂度方面提供了一个答案

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

我对空间的复杂性仍然有点不确定。我不确定这是否是O(n^2)空间,每个递归调用产生的新堆栈是否比上一级的堆栈小


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

在这种快速排序方法中,空间复杂度将完全跟随时间复杂度-原因很简单。您将递归地(使用轴)划分子堆栈,直到每个元素都位于大小为1的堆栈中。这将导致x个子堆栈(对数n深度)的(2^x=n)划分,最终您有n个堆栈,每个堆栈的大小为1。因此,总空间复杂度将为O(n*logn)


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

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

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

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


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

我在那里没有找到任何关于空间复杂度的评论。对于博主提出的解决方案?是的,他没有留下一个,这就是为什么我要问这个问题。我自己也在想O(n^2),但不确定这是否正确。哦,为了澄清起见,我文章最后一句中的“他们”指的是任何对这个问题提出自己答案的人(O(n^2)或任何其他空间)。不过,博客作者的快速排序解决方案的空间复杂性是什么?好像你正从O(n^2)身上移开?对不起。。。我误解了你的问题。我现在正在编辑我的答案。