这个素因子算法的时间复杂度是多少

时间:2019-02-27 12:19:09

标签: javascript time-complexity

该程序查找数字的素因的复杂度是多少?以及改善它的方法是什么(仅考虑时间复杂度而不考虑编码标准或空间复杂度)。

感谢和问候。

查看源代码:

function primes(n) {
  let primeNumbers = [2];

  if (n < 2) {
    return [];
  } else if (n == 2) {
    return [2];
  }

  for (let i = 3; i <= n; i++) {
    let x = i;
    let j = 0;
    let isPrime = true;
    while (j < primeNumbers.length && primeNumbers[j] <= Math.sqrt(i)) {
      if (x % primeNumbers[j] == 0) {
        isPrime = false;
        break;
      } else {
        j++;
      }
    }
    if (isPrime) {
      primeNumbers.push(x);
    } else {}
  }

  return primeNumbers;
}

function primeFactors(n) {
  let primeNumbers = primes(Math.sqrt(n));
  let i = 0;
  let x = n;

  if (n == 1) {
    return [1];
  }

  if (n == 2) {
    return [2];
  }

  let primeFactors = [];

  while (i < primeNumbers.length) {
  
    while (x % primeNumbers[i] == 0) {
      primeFactors.push(primeNumbers[i])
      x = x / primeNumbers[i];
      if (x == 1) {
        break;
      }
    }
    
    if (x == 1) {
      break;
    }
    
    i++;
  }

  if (x == 1) {} else if (x > 2) {
    primeFactors.push(x);
  }

  return primeFactors;
}

console.log("test : " + primes(122));

1 个答案:

答案 0 :(得分:0)

这是对Eratosthenes筛子的一点改进,您可以在步骤i = sqrt(n)终止算法。假设每个步骤花费固定时间,则运行时间为O(sqrt(n))。

更好的算法是采用O(log n)的随机素数算法。 http://www.cs.ust.hk/mjg_lib/Classes/COMP3711H_Fall14/lectures/Randomized_Primality_Handout.pdf