这个Prime Factor函数的运行时间?

时间:2015-06-08 22:16:36

标签: algorithm time-complexity

我写了这个素数分解函数,有人可以向我解释运行时吗?对我来说似乎很快,因为它不断地将一个数字分解为素数,而不必检查因子是否为素数,并且在最坏的情况下从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;
}

1 个答案:

答案 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)