如果我知道函数 f 有 O(log(n)),Ω(1),我被要求找到big-O和Big-Omega函数 g 有 O(n),Ω((log(n))^ 2)
for (int i = n; i >= 0; i/=2)
if (f(i) <= g(i))
for (int j = f(i)*f(i); j < n; j++)
f(j);
我遇到的一个大问题是,我不知道如何在计算中融入复杂的功能。我的意思是我知道如何计算看起来像这样的循环的复杂性:
for(int i =0 ; i< n*2; i++) {
....
}
或者像这样
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
}
}
提前谢谢。
这是我尝试过的:
for (int i = n; i >= 0; i/=2)// this is aproximatly O(log(n))
if (f(i) <= g(i))// because O(n) < O(log(n)) this line is O(n)
for (int j = f(i)*f(i); j < n; j++)// O(n*log(n))
f(j);// O(log(n))
所以根据我的计算得到O(log(n)* n * n * log(n)* log(n))= O(n ^ 2 * log ^ 3(n))
答案 0 :(得分:0)
这是一个棘手的问题,因为循环执行取决于函数f
和g
返回的值。但请记住,您需要估计最坏情况 - 所以您需要假设两件事:
f(i) <= g(i)
始终为true,因此内部循环始终执行0
开始,因为它是一个最小值,您可以通过平方f(i)
值获得因此,您的代码变得更加简单:
for (int i = n; i >= 0; i/=2)
{
f(i);
g(i);
f(i);
f(i);
for (int j = 0; j < n; j++)
f(j);
}
我想你可以从这里接管。