我对算法复杂度的计算非常困惑。对于一项任务,我们获得以下功能,并要求查找其复杂性。
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循环,这意味着每次都要经历每个项目的最坏情况。
如果我不清楚,我道歉。我很困惑这是如何工作的。答案 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