簡體   English   中英

如何使我的代碼在性能方面更高效?

[英]How can I make my code below more efficient in terms of performance?

下面的代碼比較兩個 arrays 並檢查兩個 arrays 上匹配索引處的元素是否具有相似的素因數。 如果這是真的,匹配因子(“匹配”)的計數增加 1。

/* eslint-disable no-console */
const primeFactors = (n) => {
  let number = n;
  const factors = [];
  let divisor = 2;

  while (number >= 2) {
    if (number % divisor === 0) {
      factors.push(divisor);
      number /= divisor;
    } else {
      divisor += 1;
    }
  }
  return factors;
};

const solution = (A, B) => {
  let matching = 0;

  for (let index = 0; index < A.length; index += 1) {
    const a = A[index];
    const b = B[index];

    let aFactors = primeFactors(a);
    aFactors = new Set(aFactors);
    aFactors = Array.from(aFactors);
    aFactors = aFactors.sort((first, second) => first - second);
    let bFactors = primeFactors(b);
    bFactors = new Set(bFactors);
    bFactors = Array.from(bFactors);
    bFactors = bFactors.sort((first, second) => first - second);

    if (JSON.stringify(aFactors) === JSON.stringify(bFactors)) {
      matching += 1;
    }
  }
  return matching;
};

這將返回 1,因為匹配索引處只有 15 和 75 具有相似的素因子(各 3 和 5)

console.log(solution([15, 10, 3], [75, 30, 5]));

我怎樣才能使這個算法更有效? 它目前的效率得分為 84%,未能通過針對大型數據集的兩次優化測試。

  1. 將數組轉換為集合再轉換回數組似乎很浪費精力。 為什么不在primeFactors中消除重復項?

     while (number >= 2) { if (number % divisor === 0) { factors.push(divisor); while (number % divisor === 0) { number /= divisor; } } else { divisor += 1; } }
  2. 如上得到的 arrays 無需排序。 它們已經排序。 也沒有必要對它們進行字符串化。 只需逐個元素地比較它們。

  3. 基本的加速來自觀察到這兩個數字具有相同的素數組成當且僅當它們具有相同的gcd素數組成。 gcd很容易計算; 它也往往比它的 arguments 小得多,因此更容易分解。 此外,它只需要一次分解,而不是您的解決方案中的兩次分解。 考慮

     same_prime_composition(a, b) g = gcd(a, b) primes = primeFactors(g) return is_decomposable(a/g, primes) && is_decomposable(b/g, primes) prime_decomposable(x, primes) for p in primes while (x % p == 0) x /= p return x === 1
  4. 預先計算素數可能是有益的。

  5. 我不知道是否支持divmod 如果是這樣,還有更大的優化空間。

一個快速的加速方法是讓 PrimeFactors 在 sqrt(n) 處停止。 當時的number值必然是最后一個素數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM