我写了这个素数分解函数,有人可以向我解释运行时吗?对我来说似乎很快,因为它不断地将一个数字分解为素数,而不必检查因子是否为素数,并且在最坏的情况下从2到数字。
我知道没有函数可以在多项式时间内计算素数。另外,运行时间如何渐近地与大质数因子分解?
function getPrimeFactors(num) {
var factors = [];
for (var i = 2; i <= num; i++) {
if (num % i === 0) {
num = num / i;
factors.push(i);
i--;
}
}
return factors;
}
答案 0 :(得分:1)
在您的示例中,如果num
是素数,那么它将完全采用num - 1
步。这意味着算法的运行时为O(num)
(其中O
代表悲观情况)。但是如果算法对数字进行操作,那么事情会变得有点棘手(感谢注意到了强大的持续性和Chris)!我们总是将复杂性描述为输入大小的函数。在这种情况下,输入是一个数字num
,它用log(num)
位表示。因此输入大小为log(num)
。由于num = 2 ^ (log(num))
,您的算法具有复杂性O(2^k)
,其中k = log(num)
- 输入的大小。
这就是使这个问题变得困难的原因 - 输入非常非常小,来自num
的任何多项式都会导致指数算法......
在旁注@rici是正确的,您需要最多检查sqrt(num)
,从而轻松地将运行时间缩短为O(sqrt(num))
或更正确O(sqrt(2) ^ k)
。