⊗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šuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Биз сайттин иштөөсү, аналитика жана персонализация үчүн cookie файлдарын колдонобуз. Маалыматтарды иштетүү Маалыматты коргоо саясаты боюнча жүргүзүлөт.
баарын кабыл алуу ыңгайлаштыруу четке кагуу