您的位置:首页 > 其它

小红书上两种素数打表时间对比O(n*log(n)) O(n)

2014-05-14 20:44 169 查看
#include<stdio.h>

#include<time.h>

#define maxn 1000000000+10

bool valid[maxn];

void isprime(int n, int &tot)

{

tot = 0;

int i, j;

for(i = 2; i <= n; i++)

valid[i] = true;

for(i = 2; i <= n; i++)

{

if(valid[i] == true)

{

if(i*i > n)

break;

for(j = i*i; j <= n; j += i)

{

valid[j] = false;

}

}

}

}

int main()

{

int n, i;

int tot;

n = 100000000;

isprime(n, tot);

tot = 1;

for(i = 2; i <= n; i++)

{

if(valid[i])

{

printf((tot != 0 && tot % 12 == 0)?"%6d\n":"%6d ", i);

tot++;

}

}

printf("\n");

return 0;

}

o(n*log(n))的筛法

#include<stdio.h>

#define maxn 100000000+10

bool valid[maxn];

int ans[maxn];

void getprime(int n)

{

int i, j;

int tot = 0;

for(i = 2; i <= n; i++)

valid[i] = true;

for(i = 2; i <= n; i++){

if(valid[i])

{

tot++;

ans[tot] = i;

}

for(int j = 1; ((j <= tot) && (i*ans[j] <= n)); j++)

{

valid[i*ans[j]] = false;

if(i%ans[j] == 0) break;

}

}

}

int main()

{

int n;

n = 100000000;

getprime(n);

int i;

int tot = 1;

for(i = 0; i <= n; i++)

{

if(valid[i])

{

printf((tot%12 == 0)?"%6d\n":"%6d ", i);

tot++;

}

}

printf("\n");

return 0;

}

o(n)算法

时间对比上

数据量 运行时间

o(n*log(n) o(n)

100w 0.141 0.146

1000w 1.220 1.038

10000w 9.807 9.298

对比发现小数据范围内两种算法差别并不明显

然后好奇的打了一把o(n*n) 的算法

数据量 运行时间

o(n*log(n) o(n) o(n*n)

100w 0.141 0.146 0.339

1000w 1.220 1.038 7.067

10000w 9.807 9.298 192.984

完虐o(n*n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: