计算下面这段代码的big-O和big-Omega

时间:2017-09-14 15:00:49

标签: complexity-theory

如果我知道函数 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))

1 个答案:

答案 0 :(得分:0)

这是一个棘手的问题,因为循环执行取决于函数fg返回的值。但请记住,您需要估计最坏情况 - 所以您需要假设两件事:

  • 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);
}

我想你可以从这里接管。