下面这段代码的空间复杂度?

时间:2019-05-24 07:39:07

标签: java space-complexity

我在做一些面试准备时遇到了这个问题。

 <p>Hi bob</p>

给出的选择是:

  1. O(n)
  2. O(n ^ 2)

据我了解,答案应该是O(n),因为每次迭代都会创建数组的新实例,而先前的引用也将丢失。但是,书中提到的答案是O(n ^ 2)。

可能是什么解释?

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)。如果这本书是新近流行的书,则可能会有勘误页面,这可能会为您提供启发。