जावास्क्रिप्ट में मेमोरी का उपयोग करके गति का अनुकूलन
ऐसी स्थितियां होती हैं जहां प्रदर्शन बढ़ाने के लिए रैम का बलिदान दिया जा सकता है।
आइए एक उदाहरण देखें। निम्नलिखित कोड दिए गए अंतराल में मित्रवत संख्याएँ ढूंढता है:
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;
}