简单算法的时间复杂性

时间:2013-09-28 21:57:08

标签: java time complexity-theory

我正在试图弄清楚下面代码的运行时间。

如果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();
}

2 个答案:

答案 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次,就像你说的那样,addtrimToSize花费O(n)时间,所以它会是:

  

N *(N + N)= N *(2N)= 2 * N ^ 2

但是常数因子2对于大O符号无关紧要,因为n ^ 2是函数的主要部分。因此,它是O(n ^ 2)。