解释实现记忆辅助函数
记忆是一种辅助函数,或者我们可以说是一种通过跟踪函数过去已经计算过的值来提高程序效率的技术。在本文中,我们将通过不同的示例讨论记忆辅助函数,并详细讨论所有示例,以便我们更好地理解记忆。
现在让我们在下面的部分深入讨论记忆辅助函数,并查看它们的实现和解释。
记忆辅助函数简介
记忆是一种编程技术,用于通过跟踪函数过去已经计算过的值来提高程序的时间复杂度和空间复杂度。通过将函数调用的结果保存在缓存中,程序变得更高效。通过使用之前计算过的相同参数重复运行函数,我们经常会浪费时间。然后,我们可以缓存计算出的值,并在使用相同参数调用函数时返回它。
记忆辅助函数的实现
在这里,我们将探索大量示例和解释,以帮助您更好地理解记忆辅助函数。
示例 1
让我们通过这个例子看看记忆辅助函数的工作原理,我们将讨论代码、输出和解释,以更好地理解这个概念 -
function add(num1,num2){
for(let i=0;i<100000;i++){
}
return num1+num2;
}
console.log(add(5,4));
console.log(add(5,4));
这里我们定义函数 add,通过向其中传递两个参数 num1 和 num2 来执行整数 num1 和 num2 的加法。在这个函数中,我们运行了 for 循环,之后我们必须返回两个整数的和。
在这种情况下,我们调用了加法函数,但由于 for 循环,我们的函数需要时间。而且我们使用相同的参数一次又一次地调用该函数。因此,如果我们通过存储加法值来使用记忆法,那么我们就可以节省时间,然后我们将返回缓存的值。我们不需要为相同的参数计算增加的值。
示例 2
让我们借助代码和解释看看我们的函数确定 add (5,4) 的值需要多长时间 −
function add(num1,num2){
for(let i=0;i<100000;i++){
}
return num1+num2;
}
console.time("所用时间");
console.log(add(5, 4));
console.timeEnd("所用时间");
我们的函数花费了 14.441ms 的时间来将整数 5 和 4 相加。
通过使用记忆技术,我们可以通过缓存已经计算出的值,然后在使用相同参数调用函数时返回该值来提高函数的效率。
示例 3
现在让我们讨论如何利用记忆技术来缩短使用相同参数重复执行函数所需的时间。
function memoizeFunction(func) {
let storage = {};
return function (val1, val2) {
const val = val1.toString() + val2.toString();
if (!storage[val]) {
storage[val] = func(val1, val2);
}
return storage[val];
}
}
function add(num1, num2) {
for (let i = 0; i < 10000000; i++) {
}
return num1 + num2;
}
console.time("第一次,花费的时间");
let func = memoizeFunction(add);
console.log(func(5, 4));
console.timeEnd("第一次,花费的时间");
console.time("第二次,花费的时间");
func = memoizeFunction(add);
console.log(func(5, 4));
console.timeEnd("第二次,花费的时间");
console.time("第三次,花费的时间");
func = memoizeFunction(add);
console.log(func(5, 4));
console.timeEnd("第三次,花费的时间");
注意 − 完成任务所需的时间长度可能会发生变化。
在本例中,我们使用记忆函数缓存了之前计算的值。当我们最初使用 func(4,5) 时,参数首先被转换为字符串形式,然后与计算值一起保存在对象"storage"中。
此外,当使用相同参数调用该函数时,它首先确定它是否已经存在于对象"storage"中。如果已经计算过,它就不会再做,而是直接返回对象"存储"中包含的值。
从输出中我们可以看到,每次使用具有相同参数的函数时,将 5 和 4 相加所花费的时间更少。
每次都花费时间 −
98.885 毫秒 83.375 毫秒 13.071 毫秒
因此,从输出中可以明显看出,记忆技术有助于缩短每次使用相同参数重复调用函数时的时间。
示例 4
让我们通过斐波那契数讨论另一个记忆辅助函数的例子。
function memoizeFunction(func) {
let storage = {};
return function (val) {
const value = val.toString();
if (!storage[value]) {
storage[value] = func(val);
}
return storage[value];
}
}
function fibonacci(num) {
if (num === 0 || num === 1)
return num;
else
return fibonacci(num - 1) + fibonacci(num - 2);
}
console.time("第一次,花费时间");
let func = memoizeFunction(fibonacci);
console.log(func(6));
console.timeEnd("第一次,花费时间");
console.time("第二次,花费时间");
func = memoizeFunction(fibonacci);
console.log(func(6));
console.timeEnd("第二次,花费时间");
console.time("第三次,花费时间");
func = memoizeFunction(fibonacci);
console.log(func(6));
console.timeEnd("第三次,花费时间");
如果所有步骤都不借助记忆技巧来执行,斐波那契数列的执行时间将呈指数级增长。通过存储先前的结果,我们可以获得预定义的结果,从而减少对计算结果的进一步检查,并且可以将步骤数线性化。
结论
在本文中,我们了解到 Memoization 是一种辅助函数或一种通过跟踪函数过去已经计算的值来提高程序效率的技术。通过将函数调用的结果保存在缓存中,程序变得更高效。然后,我们可以缓存计算出的值,并在使用相同参数调用函数时返回它。
相关文章
有用资源
javascript 参考教程 - 该教程包含有关 javascript 的更多信息:/javascript/