如何快速识别下面和任何其他代码中的代码复杂性?

时间:2019-01-28 15:47:29

标签: c

#include <stdio.h>
int f(int (*d)[2], int n)
{
      int p = 0, cnt;
      for (int i=2; i*i <= n; ++i)
      {
             for (cnt = 0; n % i == 0; cnt++, n /= i) {}
             if (cnt == 0)
                  continue;
             d[p][0] =  i;
             d[p++][1] = cnt;
      }
      if (n > 1)
      {
             d[p][0] = n;
             d[p++](l] = 1;
      }
      return p;
}

据我了解,当我寻找复杂性时,我正在寻找循环。第一个循环很简单。它给我们O(sqrt(n)),但是有第二个循环使n减小,这一刻我不太了解。实验表明,复杂度为O(log(n))

1 个答案:

答案 0 :(得分:0)

谈到第二个循环:n%i == 0;和n = n / i;如果我们在for循环中循环,则在第一次迭代中将有n = n / i / i ....在第k次迭代中,我们将具有n /(i ^ k),这将在n%i时停止! = 0;假设n /(i ^ k)== 1,所以1%i == 1!= 0,所以从n /(i ^ k)== 1,我们将在i base中得到k = log(n),这意味着log(n)