【问题标题】:Java Method Complexity - Troubling Figuring it OutJava 方法复杂性 - 难以弄清楚
【发布时间】:2013-03-21 12:49:24
【问题描述】:

当我遇到这段代码时,我正在为 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) 复杂性在 nested for 循环中很常见...

【问题讨论】:

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


    【解决方案1】:

    这是 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);
     }
    

    【讨论】:

    • 好的,所以它基本上循环到链表的末尾并将新元素添加到末尾?并且遍历发生在外循环中,使其成为 O(N^2)?
    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 2015-10-09
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2020-11-07
    • 2010-10-03
    • 2013-05-19
    相关资源
    最近更新 更多