我试图找出下面函数的运行时复杂性。它找到了给定数字的主要因素。
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)对吗?
答案 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)) )