该程序查找数字的素因的复杂度是多少?以及改善它的方法是什么(仅考虑时间复杂度而不考虑编码标准或空间复杂度)。
感谢和问候。
查看源代码:
function primes(n) {
let primeNumbers = [2];
if (n < 2) {
return [];
} else if (n == 2) {
return [2];
}
for (let i = 3; i <= n; i++) {
let x = i;
let j = 0;
let isPrime = true;
while (j < primeNumbers.length && primeNumbers[j] <= Math.sqrt(i)) {
if (x % primeNumbers[j] == 0) {
isPrime = false;
break;
} else {
j++;
}
}
if (isPrime) {
primeNumbers.push(x);
} else {}
}
return primeNumbers;
}
function primeFactors(n) {
let primeNumbers = primes(Math.sqrt(n));
let i = 0;
let x = n;
if (n == 1) {
return [1];
}
if (n == 2) {
return [2];
}
let primeFactors = [];
while (i < primeNumbers.length) {
while (x % primeNumbers[i] == 0) {
primeFactors.push(primeNumbers[i])
x = x / primeNumbers[i];
if (x == 1) {
break;
}
}
if (x == 1) {
break;
}
i++;
}
if (x == 1) {} else if (x > 2) {
primeFactors.push(x);
}
return primeFactors;
}
console.log("test : " + primes(122));
答案 0 :(得分:0)
这是对Eratosthenes筛子的一点改进,您可以在步骤i = sqrt(n)终止算法。假设每个步骤花费固定时间,则运行时间为O(sqrt(n))。
更好的算法是采用O(log n)的随机素数算法。 http://www.cs.ust.hk/mjg_lib/Classes/COMP3711H_Fall14/lectures/Randomized_Primality_Handout.pdf