复杂性和大O符号

时间:2013-02-13 19:37:21

标签: algorithm complexity-theory big-o

假设项目(ArrayList<Integer>)有足够的未使用空间,从而不需要重新调整大小,以下两种算法的最坏情况时间复杂度是多少?我最初的猜测是A会运行得更慢,因为它必须将每个元素移位以在索引[0]处添加新元素。我认为在最坏的情况下B是O(N^2),但我不确定。

一个。

for (int i = 0; i < N; i++)
    items.add(0, new Integer(i));

和B.

for (int i = 0; i < N; i++)
    items.add(new Integer(i));

3 个答案:

答案 0 :(得分:1)

如果你的问题是关于java的,那么第一个版本的速度较慢,并且由于你提到的原因而具有复杂性O(N^2),而B的复杂性为O(N)

答案 1 :(得分:1)

实现A可以假设items数组足够大,实现为:

for (int i = 0; i < n; i++) {
    for (int j = items.size; j > 0; j++) {
        items[j] = items[j-1]; 
    }
    items[0] = i;
}

在这种情况下执行的操作总数(假设mitems列表的初始大小)将是:

http://mathurl.com/bj762fv.png

复杂性 O(n 2

另一方面,选项B可以实现为

for (int i = 0; i < n; i++) {
    items[items.size] = i;
    items.size++;
}

并且在这种情况下执行的操作数将是

http://mathurl.com/c2ty89u.png

这具有复杂性 O(n)

答案 2 :(得分:0)