[英]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%,未能通過針對大型數據集的兩次優化測試。
將數組轉換為集合再轉換回數組似乎很浪費精力。 為什么不在primeFactors
中消除重復項?
while (number >= 2) { if (number % divisor === 0) { factors.push(divisor); while (number % divisor === 0) { number /= divisor; } } else { divisor += 1; } }
如上得到的 arrays 無需排序。 它們已經排序。 也沒有必要對它們進行字符串化。 只需逐個元素地比較它們。
基本的加速來自觀察到這兩個數字具有相同的素數組成當且僅當它們具有相同的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
預先計算素數可能是有益的。
我不知道javascript是否支持divmod
。 如果是這樣,還有更大的優化空間。
一個快速的加速方法是讓 PrimeFactors 在 sqrt(n) 處停止。 當時的number
值必然是最后一個素數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.