int main() {
int i, a[N];
// initialize the array
for(i = 2; i < N; i++) a[i] = 1;
for(i = 2; i < N; i++)
if(a[i])
for(int j = i; j*i < N; j++) a[i*j] =0;
// pirnt the primes less then N
for(i = 2; i < N; i++)
if(a[i]) cout << " " << i;
cout << endl;
}
在算法书中给出了我正在阅读上述程序的运行时间与N+N/2+N/3+N/5+N/7+N/11+...
成正比,
请帮助我理解作者如何从程序中得出上述等式。 谢谢! 文卡塔
答案 0 :(得分:3)
这是寻找素数的“Eratosthenes筛选”方法。对于每个素数,if(a[i])
测试成功并且内部循环被执行。考虑这个内循环在每个步骤终止的方式(记住,条件是j*i < N
,或等价地,j < N/i
):
总计操作总数(包括初始化数组/提取素数)给出了本书中提到的运行时。
有关详细信息,请参阅this question,包括讨论如何根据位{{3}转换为O(n(log n)(log log n)的扩展}。
答案 1 :(得分:1)
该算法称为Eratosthenes的Sieve。这张图片解释了一切:
(来自维基百科)
答案 2 :(得分:0)
内部循环(内部if(a[i])
)仅针对素数i
执行。即,i
等于2,3,5,7,1 ......,对于单i
,此循环具有大约N/i
次迭代。因此,我们总体上进行了N/2 + N/3 + N/5 + N/7 + N/11 + ...
次迭代。