这段代码的复杂程度(Big O)是多少

时间:2014-11-21 07:13:21

标签: c big-o

我最初认为复杂度是O(n ^ 3),因为内部循环转到i * i,但现在我认为复杂性是O(n ^ 2),因为" break"言。

你的想法是什么?

#include <stdio.h>

int main()
{
    int i,k,l,m;
    unsigned int j;
    l=0;
    for (i=3; i<65535;i+= 2) {
        k=1;
        for (j=3; j <= i*i; j += 2) {
            if (j==i) continue;
            if(i%j ==0) {
                k=0;
                break;
            }
         }
         if (k) { l++; }
     }
     printf("%i\n", l);
     return 0;
}

2 个答案:

答案 0 :(得分:2)

内部循环对于素数是O(N ^ 2),对于非素数是快的(最坏情况是O(N ^ 1/2),因为你只需要搜索到sqrt(N))。

然而,素数的数量与非素数的数量相比较小。向上X的素数的近似值是:X / log(X),如reference link.

中所示

因此抛出非素数是无关紧要的,有N / log(N)素数,每个内部循环需要O(N ^ 2)时间,因此总时间为O(N ^ 3 / log(N) )。

答案 1 :(得分:0)

for (j=3; j <= i*i; j += 2) { if (j==i) continue; if(i%j ==0) { k=0; break; } }

没有j == i

这里j = 3,5,7,9,11,13,15,17 ...... 65535。这意味着j将包含除2之外的所有素数高达65535。 让我们在这里有一个数学。 J&LT;我*我如果i是2的幂或素数,则j循环将完全执行,但我们可以忽略2的幂,因为我总是奇数。对于任何i,在某些点i = j [ O( n)复杂性]

如果我是辅音,那么i%j == 0将很快发生。正如JS1所指出的那样,j循环将通过忽略j == i。

来取n / logn

总时间复杂度= O(N * 2 / logn)