非大O复杂性

时间:2014-10-09 02:31:32

标签: c++ algorithm time-complexity

我对算法复杂度的计算非常困惑。对于一项任务,我们获得以下功能,并要求查找其复杂性。

int selectkth(int a[], int k, int n) {
    int i, j, mini, tmp;
    for (i = 0; i < k; i++) {
      mini = i;
      for (j = i+1; j < n; j++)
        if (a[j]<a[mini])
          mini = j;
      tmp = a[i];
      a[i] = a[mini];
      a[mini] = tmp;
    }
    return a[k-1];
}

赋值本身要求“找出用于在无序的整数数组中找到第k个最小整数的函数的复杂性。”

此外,我们被要求编写我们的f函数以及我们的g函数。

据我所知,对于f函数,我会在函数中添加所有赋值和运算。我在这个f函数中包含变量k或n吗?

作为最好的猜测,我会说f(n)= 6n + 4(n ^ 2),因为在第一个for循环中循环有6个操作,然后在嵌套for循环中循环4个操作。

为了进一步理解,这个函数的Big O复杂性是O(n ^ 2)吗?我这样说是因为有一个嵌套的for循环,这意味着每次都要经历每个项目的最坏情况。

如果我不清楚,我道歉。我很困惑这是如何工作的。

1 个答案:

答案 0 :(得分:0)

这是一个简单的分析:

外循环正在进行k次迭代。

Inter循环正在进行n-1次迭代,但它执行k次。

所以我们O(k*(n-1)) = O(kn-k) 由于k可以等于n(我们可以要求数组中的第n个最小整数),因此表达式为O(n*n-n) = O(n^2-n) = O(n^2)

有关Big O表示法表示法的更多帮助,请查看:http://web.mit.edu/16.070/www/lecture/big_o.pdf