⊗jsSpOtSM 281 of 294 menu

Optimizacija brzine na račun memorije u JavaScript-u

Dešavaju se situacije kada možemo žrtvovati radnu memoriju da bismo poboljšali performanse.

Pogledajmo na primeru. Sledeći kod pronalazi prijateljske brojeve u datom intervalu:

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

Gore navedeni kod nije optimalan. Izvršava veliki broj operacija i sa navedenim intervalom do 9000 stranica u pregledaču će jednostavno prestati da reaguje.

Problem ovog koda je u tome što za svaki broj računamo sumu njegovih delilaca veoma mnogo puta, onoliko koliko ukupno brojeva proveravamo. To znači da u našem slučaju za svaki broj suma njegovih delilaca biće pronađena 9000 puta. Nije iznenađujuće da se sve zaleće.

Hajde da optimiziramo. Za početak načinimo funkciju koja direktno izračunava sumu delilaca, bez čuvanja u niz:

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

Sada je vreme da žrtvujemo radnu memoriju. Napravićemo funkciju koja će unapred jednom izračunati sumu delilaca svih brojeva iz zadatog intervala i sačuvati ih u niz.

Kao rezultat naša funkcija će vratiti niz, u kome će ključ biti broj (za jedan manji), a vrednost - suma njegovih delilaca. Realizujmo našu funkciju:

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

Sada za proveru prijateljstva nećemo svaki put izračunavati sumu delilaca brojeva, već ćemo jednostavno uzimati već izračunatu iz niza:

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

Sastavimo sve zajedno i dobijamo sledeći kod:

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

Sledeći kod pronalazi uzajamno-proste brojeve iz zadanog intervala. Optimizujte ga:

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; }
Srpski
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Koristimo kolačiće za rad sajta, analitiku i personalizaciju. Obrada podataka se vrši u skladu sa Politikom privatnosti.
prihvati sve podesi odbij