如何计算大小与当前索引相关的数组的运行时复杂度?

时间:2017-10-27 11:44:53

标签: javascript big-o

我试图找出下面函数的运行时复杂性。它找到了给定数字的主要因素。

function test(n){
    n = parseInt(n);

    var factors = [];

    for(var i = 2; i <= n; i++){
        while((n % i) === 0){
            factors.push(i);
            n /= i;
        }
    }

    return factors;
}

while循环的执行取决于i的值,我不知道如何计算它或应该是I.这不是O(N2)对吗?

1 个答案:

答案 0 :(得分:0)

很明显,您的外部for循环是O(n)。这里棘手的部分是你的内部while循环。此循环计算给定值n的素数因子的数量。因此,如果我们有一个显式函数,或者至少是上限,计算素数因子,我们可以乘以n得到整体约束。

我在姐妹网站数学堆栈交换中找到了以下两个有用的问题:

https://math.stackexchange.com/questions/938204/upper-bound-number-of-distinct-prime-factors https://math.stackexchange.com/questions/1972003/upper-bound-for-count-of-unique-prime-divisors

他们都表明上限是:

log(n) / log( log(n) )

因为你的循环是直接嵌套的,所以我们可以将这两个复杂性相乘得到:

O(n*log(n) / log(log(n)) )