为什么Eratosthenes算法筛选的时间复杂度没有参数sqrt(n)?

时间:2017-01-06 23:00:21

标签: algorithm primes sieve-of-eratosthenes

我正在尝试理解Eratosthenes算法时间复杂度的筛选。在网上,它说时间复杂度是O(nloglog(n)),但我不明白为什么。

这是一些伪代码

factors =  new int[n+1];
for i from 2 to n
    factors[i] = 1; //true

for i from 2 to sqrt(n)
    if(factors[i] == 1) //isPrime
    {
        for all multiples of i upto n
            factors[multiple] = 0 //notPrime
    } 

return all indices of factors that have a value of 1

我认为我们都同意这个函数的时间复杂度取决于嵌套的for循环。现在进行分析。当i = 2时,内环运行n / 2次。当i = 3时,内环运行n / 3次。下一次内循环执行时是下一个素数,因此n / 5次。循环将一直运行

n / 2 + n / 3 + n / 5 + n / 7 + ...次

这是

n(1/2 + 1/3 + 1/5 + 1/7 + ...)

素数的倒数之和直到n是O(log(log(n)))的元素。 因此,总体复杂度为O(nlog(log(n)))

但是,正如我们的伪代码所写,外部for循环只运行root(n)次。因此,我们只将素数的倒数加到sqrt(n)。所以复杂性应该是O(nlog(log(sqrt(n))))而不是上面所说的。

我的分析有什么问题?

1 个答案:

答案 0 :(得分:14)

O(nlog(log(sqrt(n)))) O(nlog(log(n))),因为log(sqrt(n))= log(n)/ 2