⊗jsSpOtSM 281 of 294 menu

Optimizimi i shpejtësisë me anë të kujtesës në JavaScript

Ka situata kur mund të sakrifikohet kujtesa operative për të rritur shpejtësinë e performancës.

Le të shohim një shembull. Kodi në vijim gjen numra miqësorë në një interval të caktuar:

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; }

Kodi i mësipërm nuk është optimal. Ai kryer një numër të madh operacionesh dhe me intervalin deri në 9000 faqja e shfletuesit thjesht do të ngecë.

Problemi i këtij kodi është se ne për çdo numër llogarisim shumën e pjestuesve të tij shumë herë, aq sa numra të gjithëse kontrollojmë. Kjo do të thotë se në rastin tonë për çdo numër, shuma e pjestuesve të tij do të gjendet 9000 herë. Nuk është çudi që gjithçka ngec.

Le të optimizojmë. Për fillim të bëjmë një funksion, që llogarit drejtpërdrejt shumën e pjestuesve, pa i ruajtur ata në varg:

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

Tani ka ardhur koha të sakrifikohet kujtesa operative. Le të bëjmë një funksion, që paraprakisht një herë llogarit shumën e pjestuesve të të gjithë numrave nga intervali i caktuar dhe i ruan ata në një varg.

Si rezultat, funksioni ynë do të kthejë një varg, ku çelësi do të jetë numri (me një më pak), dhe vlera - shuma e pjestuesve të tij. Le të implementojmë funksionin tonë:

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

Tani për kontrollin e miqësorisë ne nuk do të llogarisim çdo herë shumën e pjestuesve të numrave, por thjesht do marrim tashmë atë të llogaritur nga vargu:

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; }

Le të mbledhim gjithçka së bashku dhe të marrim kodin në vijim:

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; }

Kodi në vijim gjen numra relativisht të thjeshtë nga një interval i caktuar. Optimizojeni atë:

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; }
Shqip
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ne përdorim cookie për funksionimin e sajtit, analizën dhe personalizimin. Përpunimi i të dhënave bëhet në përputhje me Politikën e Privatësisë.
prano të gjitha konfiguro refuzo