小红书上两种素数打表时间对比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)
#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)
相关文章推荐
- LINUX下两种tar打包(.bz2)和(.gz)压缩效率时间对比试验
- ACM -- 算法小结(十)素数的两种打表法
- PAT 1041. 考试座位号(15),两种解法,时间复杂度和空间复杂度对比
- 素数打表(两种方法)
- <编程>比较两种素数表生成算法+计算程序运行时间+通过CMD重定向测试程序
- LINUX下两种tar打包(.bz2)和(.gz)压缩效率时间对比试验
- 素数打表(常用素数判断题节省时间复杂度)
- js 时间对比 精确到秒
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- 逍遥安卓与Genymotion两种安卓模拟器的对比测试
- 计算页面执行时间的两种方法
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- ReentrantLock和synchronized两种锁定机制的对比
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- MVC时间对比及时间范围判断
- Date类型时间对比
- 蓝桥杯 ALGO-51(素数,打表)
- 常见排序算法时间对比 分类: C/C++ 数据结构与算法 2015-06-16 10:26 167人阅读 评论(0) 收藏
- Qt之数据库的两种显示方式对比