Javascript 生成前n个素数数组的时间复杂度?
对于接受整数Javascript 生成前n个素数数组的时间复杂度?,javascript,math,time-complexity,big-o,primes,Javascript,Math,Time Complexity,Big O,Primes,对于接受整数n并返回第一个n素数数组的函数,我们有: function nPrimes(n) { let primes = []; for(let i = 3; primes.length < n - 1; i += 2) { if (primes.every(prime => i % prime !== 0)) { primes.push(i); } } primes.unshift(2);
n
并返回第一个n
素数数组的函数,我们有:
function nPrimes(n) {
let primes = [];
for(let i = 3; primes.length < n - 1; i += 2) {
if (primes.every(prime => i % prime !== 0)) {
primes.push(i);
}
}
primes.unshift(2);
return primes;
}
函数n时间(n){
设素数=[];
对于(设i=3;素数长度i%prime!==0)){
素数推(i);
}
}
素数。反移位(2);
返回素数;
}
我不确定这个算法的复杂度。它看起来至少是二次的,因为每次
调用都会给运行时复杂性增加一个n
,其中n是给定迭代中素数数组的大小。末尾的unshift
添加了一个n
,但与此无关,因为它将与前导系数相形见绌
接下来是,有没有更有效的方法生成这样的数组 这个计算相当困难 外部循环执行
n
次,并为从3
到n
th素数的所有奇数调用every
构造
如果every
构造确实测试到目前为止列表中的所有素数,那么总工作量将与k.(p[k+1]-p[k])=k.G[k]
之和成比例,其中p[k]
是k
第个素数和G[k]
到下一个素数的间隔(当找到k
-th素数时,列表中有k
元素,并在下一个素数之前进行测试)
根据素数定理,我们知道“平均”间隔长度的顺序是logp[k]
,其本身的顺序是log(klogk)=logk+logk
。然后求和得到O(n.logn)
现在,如果每一个
构造在满足错误条件时停止,其成本就会降低。事实上,搜索将在测试数的第一个素数因子处停止,总工作量将与所有奇数的第一个素数因子的索引之和成比例,直到p[n]~n log n
通过网络搜索,似乎整数的第一个素数因子的分布遵循
1/p[k]log p[k]
中的规律,即k
-th素数,即1/k.log k.log(k.log k)
,我们需要使用k~m/log m
对所有整数进行求和m
。这既不严格,也不容易。对于更快的解决方案,我建议阅读。请注意,您的解决方案目前效率低下,因为它足以尝试高达的除数√仅限i
,这大大减少了尝试次数。