我正在尝试理解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))))而不是上面所说的。
我的分析有什么问题?
答案 0 :(得分:14)
O(nlog(log(sqrt(n))))是 O(nlog(log(n))),因为log(sqrt(n))= log(n)/ 2