当我遇到这段代码时,我正在为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
循环中很常见......
答案 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);
}