这个筛子真的是O(n)吗?

时间:2017-06-07 20:04:23

标签: algorithm math primes sieve

任何人都可以告诉我这是如何在O(n)中工作的。

http://www.geeksforgeeks.org/sieve-eratosthenes-0n-time-complexity/

product = await response.Content.ReadAsAsync<Product>();

我认为外循环将运行O(n)时间,并且内部循环将运行O(素数小于N)在素数情况下和O(1)在复合情况下运行。但总体上应该是O(n)* O(素数小于n)。我错过了什么吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

关键思想是在SPF计算中只遇到2和 n 之间的每个整数,因此最内层循环的迭代总数为O(n)。

最内层循环填充SPF数组,表示2和n之间的每个整数的最小素数因子。

实际上,为了计算SPF数组,2和 n 之间的每个整数 k 表示为k = i*prime[j],其中prime[j]是素数数字低于 i 的所有素因子(这由prime[j] <= SPF[i]条件确保,否则会破坏循环)。这意味着prime[j] k 的最小素数因子。但是这种表示对于每个 k 都是唯一的(即,不会再次遇到相同的 k ,作为另一个k = i2 * prime[j2]因子分解,因为如果{{1} }不等于prime[j2],那么其中一个不会是 k 的最小素因子。因此,在2和 n 之间的每个数字 k 恰好在产品prime[j]中出现一次,在最里面的循环中计算。