我正在试图弄清楚下面代码的运行时间。
如果add和trimToSize都是O(n),则块的内部将在2N时间内运行,然后由于循环需要N次,整个程序将在N *(2N)时间内运行?...为O(n ^ 2)?
ArrayList a = new ArrayList();
for (int i = 0; i< N; i++){
a.add(i);
a.trimToSize();
}
答案 0 :(得分:3)
是。但是ArrayList#add
通常是 O(1),除非必须增加内部存储阵列。
如果要优化代码,请按以下步骤操作:
ArrayList a = new ArrayList(N); // reserve space for N elements
for (int i = 0; i < N; i++) {
a.add(i); // O(1)
}
// no need for trimToSize
现在只有 O(n)!
答案 1 :(得分:2)
你是对的,它会是O(n ^ 2)。 for
循环执行N次,就像你说的那样,add
和trimToSize
花费O(n)时间,所以它会是:
N *(N + N)= N *(2N)= 2 * N ^ 2
但是常数因子2对于大O符号无关紧要,因为n ^ 2是函数的主要部分。因此,它是O(n ^ 2)。