JavaScript 实现一个备忘录辅助函数的解释

JavaScript 实现一个备忘录辅助函数的解释

备忘录是一个辅助函数,或者我们可以说是通过在过去保存函数已经计算过的值来提高程序效率的技术。在本文中,我们将讨论备忘录辅助函数,并使用不同的示例详细讨论这些示例,以便我们可以更好地理解备忘录。

现在让我们在下面的部分深入讨论备忘录辅助函数,并通过解释来看看它们的实现。

备忘录辅助函数简介

备忘录是一种编程技术,通过在过去保存函数已经计算过的值来提高程序的时间复杂度和空间复杂度。通过将函数调用的结果保存在缓存中,程序变得更加高效。通过重复使用以前计算过的相同参数运行函数,我们经常浪费时间。然后,我们可以缓存计算好的值,并在函数使用相同参数调用时只返回它。

备忘录辅助函数的实现

在这里,我们将探索大量的示例和解释,以帮助您更好地理解备忘录辅助函数。

示例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");

我们的函数添加整数5和4花费了14.441毫秒的时间。

通过使用记忆化技术,我们可以通过缓存已经计算过的值,并在使用相同参数调用函数时返回该值来提高函数的效率。

示例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");

如果在执行过程中不使用记忆化技术,斐波那契数列需要指数级时间。通过存储先前的结果,我们可以获取预定义的结果,减少进一步对计算结果的检查,并将步骤数减少到线性。

结论

在本文中,我们学习了记忆化是一种通过跟踪函数在过去已经计算过的值来提高程序效率的帮助函数或技术。通过将函数调用的结果保存在缓存中,程序变得更加高效。然后,我们可以缓存计算出的值,并在使用相同参数调用函数时直接返回它。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程