我在做一些面试准备时遇到了这个问题。
<p>Hi bob</p>
给出的选择是:
据我了解,答案应该是O(n),因为每次迭代都会创建数组的新实例,而先前的引用也将丢失。但是,书中提到的答案是O(n ^ 2)。
可能是什么解释?
答案 0 :(得分:3)
您的解释正确。空间复杂度是线性。
但是,您的结论(以及书籍作者的结论)是错误的。正确答案是两者都是正确的。也就是说,空间复杂度在两个方面都存在:
O(n)
和O(n^2)
Big-O给出一个上限,而不是确切的上限。将其视为<=
,而不是=
。因此,如果a in O(n)
也确实是a in O(n^2)
(从数学上来说,Big-O提供了一组功能)。
确切界限由 Theta (=
)给出,下界由 Omega (>=
)给出,严格的下界为由 small-omega (>
)给出,并由 small-o (<
)给出严格的上限。因此,空间复杂度在Theta(n)
中。
有关更多信息和实际的数学定义,请参见Wikipedia。
如果我们假设Java的垃圾回收器是 active ,则空间复杂度只有 linear 。可以禁用它或将其替换为实际上不释放内存的模拟实现(请参见Epsilon-GC)。
在那种情况下,空间复杂度确实会是二次的。
算法本身需要分配二次存储量。但是,它将只能同时容纳 linear 个内存。通常根据必须同时容纳多少内存来进行空间复杂度分析。但是也许作者想从总需要分配多少方面来分析算法,这也可以解释他的选择。
答案 1 :(得分:1)
这本书似乎根本是错的。执行所需的空间为O(n)。关于可能的解释:作者考虑了运行时的复杂性。嵌套循环使运行时复杂度为O(n ^ 2)。如果这本书是新近流行的书,则可能会有勘误页面,这可能会为您提供启发。