⊗jsSpOtSM 281 of 294 menu

Оптимизација на брзината со помош на меморијата во JavaScript

Постојат ситуации кога може да се пожртвува оперативна меморија за да се подобри брзината на извршување.

Да го погледнеме примерот. Следниот код наоѓа пријателски броеви во даден опсег:

console.log(getFriendly(9000)); function getFriendly(range) { let res = []; for (let i = 1; i <= range; i++) { for (let j = 1; j < range; j++) { if (isFriendly(i, j)) { res.push([i, j]); } } } return res; } function isFriendly(num1, num2) { let sum1 = getSum(getOwnDivisors(num1)); let sum2 = getSum(getOwnDivisors(num2)); return sum1 == num2 && sum2 == num1; } function getOwnDivisors(num) { let res = []; for (let i = 1; i < num; i++) { if (num % i === 0) { res.push(i); } } return res; } function getSum(arr) { let sum = 0; for (let elem of arr) { sum += elem; } return sum; }

Горенаведениот код не е оптимален. Тој прави голем број на операции и при зададениот опсег до 9000 страницата во прелистувачот едноставно ќе се замрзне.

Проблемот со овој код е во тоа што за секој број ја пресметуваме сумата на неговите делители многу пати, онолку пати колку што вкупно броеви проверуваме. Ова значи дека во нашиот случај за кој било број сумата на неговите делители ќе биде пронајдена 9000 пати. Не е чудно што сè се замрзнува.

Да го оптимизираме. За почеток да направиме функција која директно ја пресметува сумата на делителите, без зачувување на нив во низа:

function getOwnDivisorsSum(num) { let sum = 0; for (let i = 1; i < num; i++) { if (num % i === 0) { sum += i; } } return sum; }

Сега е време да се пожртвува оперативната меморија. Да направиме функција, која однапред еднаш ќе ја пресмета сумата на делителите на сите броеви од зададениот опсег и ќе ги зачува нив во низа.

Како резултат нашата функција ќе врати низа, во која клучот ќе биде бројот (за еден помал), а вредноста - сумата на неговите делители. Да ја имплементираме нашата функција:

function getAllSum(range) { let arr = []; for (let i = 1; i <= range; i++) { arr.push(getOwnDivisorsSum(i)); } return arr; }

Сега за проверка на пријателскоста немаме потреба секој пат да ја пресметуваме сумата на делителите на броевите, туку едноставно ќе ја земеме веќе пресметаната од низата:

function getFriendly(range) { let sums = getAllSum(range); // [1, 2, 6...] let res = []; for (let i = 0; i < sums.length; i++) { for (let j = i; j < sums.length; j++) { let sum1 = sums[i]; let sum2 = sums[j]; let num1 = i + 1; let num2 = j + 1; if (num1 == sum2 && num2 == sum1) { res.push([num1, num2]); } } } return res; }

Да собереме сè заедно и да го добиеме следниот код:

console.log(getFriendly(9000)); function getFriendly(range) { let sums = getAllSum(range); let res = []; for (let i = 0; i < sums.length; i++) { for (let j = i; j < sums.length; j++) { let sum1 = sums[i]; let sum2 = sums[j]; let num1 = i + 1; let num2 = j + 1; if (num1 == sum2 && num2 == sum1) { res.push([num1, num2]); } } } return res; } function getAllSum(range) { let arr = []; for (let i = 1; i <= range; i++) { arr.push(getOwnDivisorsSum(i)); } return arr; } function getOwnDivisorsSum(num) { let sum = 0; for (let i = 1; i < num; i++) { if (num % i === 0) { sum += i; } } return sum; }

Следниот код наоѓа релативно прости броеви од зададен опсег. Оптимизирајте го:

console.log(getRelativelyPrime(10000)); function getRelativelyPrime(range) { let res = []; for (let i = 2; i <= range; i++) { for (let j = 2; j < range; j++) { if (isRelativelyPrime(i, j)) { res.push([i, j]); } } } return res; } function isRelativelyPrime(num1, num2) { let arr1 = getDivisors(num1); let arr2 = getDivisors(num2); let int = getIntersect(arr1, arr2); if (int.length === 0) { return true; } else { return false; } } function getIntersect(arr1, arr2) { let result = []; for (let elem of arr1) { if (arr2.includes(elem)) { result.push(elem); } } return result; } function getDivisors(num) { let res = []; for (let i = 2; i <= num; i++) { if (num % i === 0) { res.push(i); } } return res; }
Македонски
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ние користиме колачиња за работата на веб-страната, анализа и персонализација. Обработката на податоци се врши во согласност со Политиката за приватност.
прифати ги сите прилагоди одбиј