函数*函数在循环中的函数的时间复杂度

时间:2018-11-18 08:52:53

标签: time-complexity

请帮助我找到以下功能的复杂性:

proc (int n) 
{
 for (i=0 ; i<n ; i++)
 {
   x = g(n)+f(n) ;
   for (j=0 ; j<n ; j++)
    {
      y=h(j)*g(j) ;
    }
  }
return x+y ;
}

当f = O(n ^ 2),g = O(n),h =Θ(log(n))。

我不确定的事情:

  1. 对于我n * log(n),“ y = h(j)* g(j)”的复杂度是多少?
  2. 如果在循环中是“ y = h(j)* g(j)”还是仅仅是“ h(j)* g(j)”,那么复杂度是否有所不同?
  3. 是对的,“ x = g(n)+ f(n)”的复杂度是n + n ^ 2吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

内循环的复杂度(h*g的总和)

由于h(j) = Θ(log(j))g(j) = O(j)h(j).g(j)的复杂度为O(j.log(j)),对于K> 0,则为<= K.j.log(j)。因此,内部循环产生

   K.(1.log(1) + 2.log(2) + ... + (n-1).log(n-1))
<= K'.n^2.log(n)

对于精心选择的常量K',内部循环会带来复杂性O(n^2.log(n))

g + f的复杂度
g = O(n)f = O(n^2),因此f + g的复杂度为O(n^2)

总体复杂性
A: n的{​​{1}}项O(n^2)的总和为f+g
B: O(n^3)的{​​{1}}项之和为j^2log(j)

因此,您的方法的复杂度为0 <= j < n

答案 1 :(得分:0)

Big O of x = O(n^2)
Big O of y = O(n log(n)) 

现在要计算整个算法的Big O,我们必须看一下最里面的循环。在这种情况下,最里面的循环包含在y = h(j)* g(j)中。 Big O可以从最低点开始向上计算。 x的Big O不会相加,因为它与内部for循环处于同一级别。

Big O = O(n log(n)) * O(n) * O(n) + O(n^2)
It can be written as:
Big O = O ((n log(n) * n * n) + (n * n^2))
Big O = O((n^3 log(n) + n^3)
Neglecting smaller terms would give us:
Big O = O(n^3 log(n))