检查这个大O分析

时间:2013-12-05 23:43:01

标签: java big-o

我正在尝试学习Big O分析,我想知道是否有人可以让我知道我是否正确地使用这两个例子(如果我不是,我哪里出错?)。我得到第一个是O(N ^ 2),第二个是O(N)。我如何获得它们的细分在下面的代码中。

第一个例子

public void sort(Integer[] v) {
    //O(1)
    if(v.length == 0)
        return;
    //O(N)*O(N)*O(1)
    for(int i = 0; i < v.length; ++i)
    {
        for(int j = i + 1; j < v.length; ++j )
        {
            if(v[j].compareTo(v[i]) < 0)
            {
                Integer temp = v[i];
                v[i] = v[j];
                v[j] = v[i];
            }
        }
    }
}

第二个例子

public void sort(Integer[] v){
    TreeSet<Integer> t = new TreeSet<>();
    //O(N)
    for(int i = 0; i < v.length(); ++i)
    {
        t.add(v[i]);
    }

    int i = 0;
    //O(N)
    for(Integer value : temp)
    {
        v[i++] = v;
    }
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

你是对的 - 第一个是O(N^2),因为你有一个循环嵌套在另一个循环中,每个循环的长度取决于输入v。如果v的长度为2,则您将进行4次交换。如果v的长度为8,则执行64次。

第二个是O(N),因为你已经迭代了输入,你的循环包含任何迭代或昂贵的操作。第二个实际上是O(n log(n)) - 参见对原帖的评论。

答案 1 :(得分:0)

你的第一个例子是O(N ^ 2),你是对的

你的第二个例子不是O(N),所以不是正确。

是O(N)* O(log N)+ O(N)

O(N)第一循环

O(log N)插入集合

O(N)第二循环

最后你有O(N * log N + N),取更高的值,所以答案是 O(N * log N)

<强>被修改

顺便说一句,Big O表示法不依赖于编程语言

It could helps