如何解决质数上的 JavaScript 堆内存不足?
JavaScript 是一种高级的、动态类型的面向对象编程语言。当程序超出可用内存并导致溢出时,会引发“内存不足”错误。它也可能是由于对象太长或需要的内存大于分配的内存造成的。由于 JavaScript 中的一切都是对象,并且对象存储在堆中,因此我们在执行 JavaScript 程序时经常会遇到“堆内存不足”的错误。
让我们举一个非常常见的程序示例,该程序确定大数的素因子,例如 10^9 阶。克服内存泄漏问题的方法是使用一种算法,该算法不需要循环到数字的末尾来找到素因数。
算法:函数primeFactors()接受一个参数num ,它是要分解的原始数字。声明了一个空数组,它将存储主要因子。外部for循环从i=2循环到i=sqrt(num) 。如果该数字除以i的当前值,则将i的当前值推入数组。由于我们只关心找到不同的素因子,因此我们首先将因子推入数组,然后继续将数字除以i直到它不再可整除,然后它以num的减小值打破while循环。 for循环完成并检查num的最终值。如果num的值大于 2,则它是最大的素因数,并被推入数组。
示例 1:
Javascript
function primeFactors(num) {
var prime = [];
for (i = 2; i * i <= num; ++i) {
if (num % i === 0) {
// Prime factor found
prime.push(i);
while (num % i === 0) {
num /= i;
}
}
}
if (num > 2) {
// Largest prime factor
prime.push(num);
}
return prime;
}
console.log(primeFactors(992474117));
Javascript
function primeFactors(num) {
var prime = [];
for (i = 2; i * i <= num; ++i) {
if (num % i === 0) {
// prime factor found
prime.push(i);
while (num % i === 0) {
num /= i;
}
}
}
if (num > 2) {
//largest prime factor
prime.push(num);
}
return prime;
}
console.log(primeFactors(1000000000000000000));
输出:
[ 23719, 41843 ]
概括:
- 数量=992474117
- 已声明素数数组
- for 循环从i=2运行到i=31503
- i=23719将num除以rem=0并且 23719 也是质数,
因此它被推入数组。 - num/i = 41843因此num= 41843也是一个不能被任何数整除的素数
在我的范围内 - num>2并且是最大的素数,因此它被推入数组。
示例 2:
Javascript
function primeFactors(num) {
var prime = [];
for (i = 2; i * i <= num; ++i) {
if (num % i === 0) {
// prime factor found
prime.push(i);
while (num % i === 0) {
num /= i;
}
}
}
if (num > 2) {
//largest prime factor
prime.push(num);
}
return prime;
}
console.log(primeFactors(1000000000000000000));
输出:
[ 2, 5 ]
概括:
- num=1000000000000000000是偶数,可以被 2 整除。
- 2 被推入数组,我们不断将num的当前值除以 2,直到它不再可整除。
- 遍历i的范围,下一个质数是 5,它被推入数组。
- 在for循环num=0完成后,所有质因数都已存储。