解释实现记忆化辅助函数
记忆化是一个辅助函数,或者可以说是一种通过跟踪函数过去已经计算过的值来提高程序效率的技术。在本文中,我们将讨论记忆化辅助函数以及不同的示例,并详细讨论所有示例,以便我们能够更好地理解记忆化。
现在让我们在下面的部分深入讨论记忆化辅助函数,并了解其实现和解释。
记忆化辅助函数简介
记忆化是一种编程技术,用于通过跟踪函数过去已经计算过的值来提高程序的时间复杂度和空间复杂度。通过将函数调用的结果保存在缓存中,程序效率得到提高。通过重复运行具有先前已计算过的相同参数的函数,我们经常浪费时间。然后,我们可以缓存计算出的值,并在使用相同参数调用函数时直接返回它。
记忆化辅助函数的实现
在这里,我们将探索大量的示例和解释,以帮助您更好地理解记忆化辅助函数。
示例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));
在这里,我们通过传递两个参数 num1 和 num2 来定义函数 add,用于对整数 num1 和 num2 进行加法运算。在这个函数中,我们运行了 for 循环,然后返回两个整数的和。
在这种情况下,我们调用了加法函数,但由于 for 循环,我们的函数花费了时间。我们使用相同的参数反复调用函数。因此,如果我们使用记忆化来存储加法的值,我们就能节省时间,然后返回缓存的值。我们不需要为相同的参数再次计算加法值。
示例2
让我们借助代码和解释来看看我们的函数确定 add(5,4) 的值所花费的时间:
function add(num1,num2){ for(let i=0;i<100000;i++){ } return num1+num2; } console.time("Time taken"); console.log(add(5, 4)); console.timeEnd("Time taken");
我们的函数花费了 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("First time, time taken"); let func = memoizeFunction(add); console.log(func(5, 4)); console.timeEnd("First time, time taken"); console.time("Second time, time taken"); func = memoizeFunction(add); console.log(func(5, 4)); console.timeEnd("Second time, time taken"); console.time("Third time, time taken"); func = memoizeFunction(add); console.log(func(5, 4)); console.timeEnd("Third time, time taken");
注意:**完成任务所需的时间可能会发生变化**。
在这个例子中,我们使用记忆化函数缓存了之前计算的值。当我们第一次使用 func(4,5) 时,参数首先被转换为字符串形式,然后与计算出的值一起保存在对象 'storage' 中。
此外,当使用相同参数调用函数时,它首先确定该参数是否已经存在于对象 'storage' 中。如果已经计算过,它就不会再次计算,而是直接返回对象 'storage' 中包含的值。
从输出中我们可以看到,每次我们使用相同参数调用函数时,添加 5 和 4 所花费的时间都减少了。
每次花费的时间:
98.885 ms 83.375 ms 13.071 ms
因此,从输出可以看出,记忆化技术帮助缩短了每次我们使用相同参数重复调用函数所需的时间。
示例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("First time, time taken"); let func = memoizeFunction(fibonacci); console.log(func(6)); console.timeEnd("First time, time taken"); console.time("Second time, time taken"); func = memoizeFunction(fibonacci); console.log(func(6)); console.timeEnd("Second time, time taken"); console.time("Third time, time taken"); func = memoizeFunction(fibonacci); console.log(func(6)); console.timeEnd("Third time, time taken");
如果没有记忆化技术的帮助,斐波那契数列的执行需要指数级的时间。通过存储以前的结果,我们可以获得预定义的结果,从而减少对计算结果的进一步检查,并将步骤数减少到线性。
结论
在本文中,我们了解到记忆化是一个辅助函数或一种技术,它通过跟踪函数过去已经计算过的值来提高程序的效率。通过将函数调用的结果保存在缓存中,程序效率得到提高。然后,我们可以缓存计算出的值,并在使用相同参数调用函数时直接返回它。