📜  Eratosthenes筛的时间复杂度如何为n * log(log(n))?(1)

📅  最后修改于: 2023-12-03 15:00:36.730000             🧑  作者: Mango

Eratosthenes筛的时间复杂度分析

Eratosthenes筛是一种用于寻找一定范围内所有素数的算法。其时间复杂度为O(n * log(log(n))),是一种高效的算法。下面将详细介绍其原理和时间复杂度的分析。

原理

Eratosthenes筛的基本思想是:从小到大枚举数,如果当前数是素数,则将它的倍数全部标记为合数。因为素数的倍数一定不是素数,所以只需要标记素数的倍数即可。最后,未被标记的数即为素数。

时间复杂度分析

假设要寻找n以内的所有素数,那么最多需要枚举到sqrt(n),因为如果一个数x大于sqrt(n),而它的因子不在[1, sqrt(n)]之内,则x不可能是素数。

对于每个素数p,需要标记p的倍数,其中包含p自己,即需要遍历p, 2p, 3p, …直到kp(kp <= n)。因此,在最坏的情况下,需要进行n/2 + n/3 + … + n/sqrt(n)次循环。这个和式估计可以大致等于 n * log(log(n))。

总时间复杂度即为O(n * log(log(n)))。

代码示例

下面是一段使用Eratosthenes筛寻找n以内素数的Python代码示例:

def eratosthenes(n):
    is_prime = [True] * (n+1)
    primes = []
    for num in range(2, n+1):
        if is_prime[num]:
            primes.append(num)
            for multiple in range(num*num, n+1, num):
                is_prime[multiple] = False
    return primes

在这个示例中,使用一个布尔数组is_prime来记录每个数是否为素数。首先将2~n之间的数都标记为素数,然后从2开始遍历每个数,如果当前数为素数,则将其所有倍数都标记为合数。

总结

Eratosthenes筛是一种高效寻找素数的算法,其时间复杂度为O(n * log(log(n)))。在实际应用中,可以通过加速常数来提高效率,例如使用位操作来降低空间占用和提高访问速度。