⊗jsSpOtSM 281 of 294 menu

JavaScript-də yaddaş hesabına sürətin optimallaşdırılması

Operativ yaddaşı fəda etməklə performansı artırmaq mümkün olan vəziyyətlər olur.

Gəlin bir nümunəyə baxaq. Aşağıdakı kod verilmiş aralıqda dost ədədləri tapır:

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

Yuxarıdakı kod optimal deyil. O, çox sayda əməliyyat yerinə yetirir və göstərilən 9000 aralığında brauzerin səhifəsi sadəcə donacaq.

Bu kodun problemi ondadır ki, biz hər bir ədəd üçün onun bölənlərinin cəmini çox dəfə, yoxladığımız ədədlərin sayı qədər hesablayırıq. Bu o deməkdir ki, bizim vəziyyətimizdə istənilən ədəd üçün onun bölənlərinin cəmi 9000 dəfə tapılacaq. Təəccüblü deyil ki, hər şey donur.

Gəlin optimallaşdıraq. Əvvəlcə onları massivdə saxlamaqdan çəkinmədən, bölənlərin cəmini birbaşa hesablayan funksiya edək:

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

İndi operativ yaddaşı fəda etməyin vaxtıdır. Gəlin funksiya edək ki, əvvəlcədən bir dəfə verilmiş aralıqdakı bütün ədədlərin bölənlərinin cəmini hesablasın və onları massivdə saxlasın.

Funksiyamız nəticə olaraq massiv qaytaracaq, burada açar ədəd olacaq (bir az aşağı), dəyər isə onun bölənlərinin cəmi olacaq. Gəlin funksiyamızı həyata keçirək:

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

İndi dostluğu yoxlamaq üçün biz hər dəfə ədədlərin bölənlərinin cəmini hesablamayacağıq, sadəcə artıq hesablanmışı massivdən götürəcəyik:

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

Gəlin hamısını birlikdə yığaq və aşağıdakı kodu əldə edək:

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

Aşağıdakı kod verilmiş aralıqdan qarşılıqlı sadə ədədləri tapır. Onu optimallaşdırın:

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; }
Azərbaycan
AfrikaansБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Biz saytin işi, analitika və fərdiləşdirmə üçün cookie istifadə edirik. Məlumatların emalı Məxfilik Siyasəti əsasında həyata keçirilir.
hamısını qəbul et konfiqurasiya et rədd et