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

标签 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;
}

最佳答案

在您的示例中,如果 num 是质数,那么它将恰好需要 num - 1 步。这意味着该算法的运行时间为 O(num)(其中 O 代表悲观 情况)。但是对于对数字进行运算的算法,事情会变得有点棘手(感谢您注意到 thegreatcontini 和 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)

关于algorithm - 这个 Prime Factor 函数的运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30720017/

相关文章:

asp.net - 将项目开发提升到一个新的水平

algorithm - 如何找到下面提到的算法的执行时间?

python - 我的代码更糟糕的时间复杂度是 log(n) 吗?

javascript - 在 javascript 中更改 RGB 颜色的色调

algorithm - 用矩形填充直线多边形

algorithm - AVL Tree的平衡过程

algorithm - 使用最少跳数的 A* 启发式算法

algorithm - 什么时候算法是 O(n + m) 时间?

algorithm - 常分区快速排序算法

algorithm - 如何检查数组是否仅包含时间复杂度为 n logn 的不同元素