Java方法的复杂性 - 让人难以理解

时间:2013-03-21 04:38:04

标签: for-loop big-o time-complexity

当我遇到这段代码时,我正在为UIL做一个计算机科学实践测试(Structure<E>类中有更多的方法,但它们似乎与问题无关):

public class Structure<E> 
{
    private E data;
    private Structure<E> s;

    Structure(E d) 
    {
        data = d; 
    }

    public void add(E d)
    {
        if (s == null)
            s = new Structure<E>(d);
        else
            s.add(d);
    }
}

// Client method
public Structure<Integer> demo(int[] vals)
{
    Structure<Integer> s;
    s = new Structure<Integer>(vals[0]);
    for (int i = 0; i < vals.length; i++)
        s.add(vals[i]);
    return s;
}

所以这个问题要求我确定demo()客户端方法最具限制性的复杂性。我读了大O符号(当然在进行测试之前!)并且说单循环操作,例如逐个将元素添加到列表中,应该具有线性复杂度,或者 O(N)

然而,正确答案实际上证明是 O(N ^ 2)。我很困惑为什么会这样,有人可以向我解释一下吗?因为我认为 O(N ^ 2)复杂性在嵌套 for循环中很常见......

1 个答案:

答案 0 :(得分:2)

它是O(n ^ 2),因为递归函数add有一个隐式遍历,即其中的第二个循环,如下所示:

s = new Structure<Integer>(vals[0]);
for (int i = 0; i < vals.length; i++) {
        Structure<Integer> p = s;
        while (p.s != null) p = p.s;
        p.s = new Structure<E>(d);
 }