【问题标题】:Time Complexity of Simple Algo简单算法的时间复杂度
【发布时间】:2013-10-05 00:14:32
【问题描述】:
我正在尝试计算下面代码的运行时间。
如果add和trimToSize都是O(n),那么block内部会运行2N时间,那么由于循环需要N时间,那么整个程序会运行N*(2N)时间?... O(n^2)?
ArrayList a = new ArrayList();
for (int i = 0; i< N; i++){
a.add(i);
a.trimToSize();
}
【问题讨论】:
标签:
java
time
complexity-theory
【解决方案1】:
是的。但是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)!
【解决方案2】:
你是对的,应该是 O(n^2)。 for 循环执行 N 次,就像你说的,add 和 trimToSize 需要 O(n) 时间,所以它是:
N * (N + N) = N * (2N) = 2 * N^2
但是常数因子 2 对 big-O 表示法并不重要,因为 n^2 是函数的主要部分。因此,它是 O(n^2)。