优化埃氏筛的时间复杂度分析
对于优化后的埃氏筛法:
bool v[N];
void sieve(int n) {
memset(v, 0, sizeof(v));
for (int i = 2; i <= n; i++) {
if (v[i]) continue;
for (int j = i; j <= n / i; j++)
v[i * j] = true;
}
}
简单分析一下它的流程,我们发现当i
不是素数的时候内层循环才会执行,而内层循环执行的次数约为次,暗示了其实对于,这个循环也不会被执行,这已经是埃氏筛的一个小优化:即一个数只会被它前半部分的素数筛去,那么总体的时间复杂度就可以表示为:
这告诉我们前半部分的复杂度是 的,因此合并起来,整个算法的复杂度为,和优化前的复杂度一致。