我在做一些面试准备时遇到了这个问题。
public class Main {
public static void main(String[] args) {
// n is some user input value
int i = 0;
while (i < n) {
int[] a = new int[n];
for (int j = 0; j < n; j++){
a[j] = i * j;
}
i++;
}
}
}
所给出的选择是:
- O(n)
- O(n^2)
据我所知,答案应该是O(n),因为在每次迭代中都创建了一个新实例的数组,之前的引用被丢失了。然而,这本书提到答案是O(n^2)。
可能的解释是什么?
n
值。(不考虑 int 的最大值等)当分析复杂度时,通常只考虑算法本身,而不考虑 JVM 特定的实现细节,如垃圾收集算法。该算法分配了大小为n
的数组,共n
次。因此,空间复杂度为 O(n)。 - aioobea
是一个循环局部变量,而且n
在循环中不会改变,因此可能每次迭代都重用相同的数组。 - aioobe