这段代码的时间复杂度是否正确?

时间:2016-06-26 13:57:36

标签: c time-complexity

如果函数“process”的复杂度为O(logn),则计算此代码片段的时间复杂度

void funct (int a[], int n)
{
    int i=0
      while (i < n){
         process (a, n);
         if (a[i]%2 == 0)
           i = i*2+1;
         else
           i = i+1;
  }

我试图计算时间复杂度的最佳和最差情况;

最糟糕的情况是“else”语句被调用,所以它应该只是:

最坏情况:T(n)= O(nlogn)

我遇到了最好的情况。我试过这种方式,但我不知道这是否正确

因为在“if”语句中“i”增加了“2i + 1”,所以它应该是

i=2^k-1
2^k < n+1 

so k < log_2(n+1) 

说明while循环执行(log_2(n+1)-2)/2次是正确的,因为这是i&lt; n?

如果是这样,时间复杂度最好是O(lognlogn)?

1 个答案:

答案 0 :(得分:1)

最好的情况是a中的采样值是否均匀。在这种情况下,复杂度为O(log(n)*log(n)),因为循环行程计数为O(log(n))

最糟糕的情况是a中的采样值都是奇数。在这种情况下,复杂度为O(n*log(n)),因为循环行程计数为O(n)