我正在阅读“破解编码面试”这本书并且遇到了这个问题 “编写一个程序来按升序对堆栈进行排序。您可以使用额外的堆栈来保存项目,但是您可以不将这些元素复制到任何其他数据结构(例如数组)。堆栈支持以下操作:push,pop ,偷看,是空的。“
本书给出了O(n ^ 2)时间复杂度和O(n)空间的答案。
然而,我遇到this blog使用快速排序方法提供O(n log n)时间复杂度的答案。
我想知道的是空间复杂度O(n ^ 2)虽然?由于每次调用该方法都涉及初始化另外两个堆栈,以及另外两个递归调用。
我对空间复杂性仍然有些不稳定。我不确定这是否是O(n ^ 2)空间,每个递归调用产生的新堆栈小于升级的堆栈。
如果有人能在他们的答案背后给出一点解释,那就太好了。
答案 0 :(得分:1)
在这种快速排序方法中,空间复杂度将完全遵循时间复杂度 - 原因很简单。您正在递归地划分子堆栈(使用数据透视),直到每个元素都在一个大小为1的堆栈中。这导致x子堆栈(log n深度)的(2 ^ x = n)划分,并且最终你有n个堆栈,每个堆栈大小为1。因此,总空间复杂度将为O(n * log n)。
请记住,在这种情况下,空间复杂度将遵循时间复杂度,正如我们在每次迭代中占据新空间一样。因此,在最坏的情况下,空间复杂度将为O(n ^ 2)。
答案 1 :(得分:1)
空间复杂度在平均情况下也是O(n log n)。如果空间复杂度恰好为O(n ^ 2),则时间复杂度如何为O(n log n),因为每个分配的空间至少需要一次访问。
因此,在平均情况下,假设堆栈每次被分成两半,在i th 递归深度处,数组的大小变为O(n / 2 ^ i)在i th 深度上有2个 ^ i递归分支。
因此,在i th 深度上分配的总大小为 O(n / 2 ^ i)* 2 ^ i = O(n)。
由于最大深度为log n,因此整体空间复杂度为O(n log n)。
然而,在最坏的情况下,空间复杂度为O(n ^ 2)。