Википедия определяет мемоизацию

В вычислениях мемоизация или мемоизация - это метод оптимизации, используемый в первую очередь для ускорения компьютерных программ за счет сохранения результатов дорогостоящих вызовов функций и возврата кэшированного результата, когда те же входные данные повторяются снова.

Проще говоря, вместо многократного выполнения фрагмента кода для выполнения конкретной задачи мы можем сохранить результаты предыдущих вычислений и использовать их позже, чтобы избежать ненужных вычислений.

Давайте начнем с простого примера. Давайте создадим функцию с именем add, которая добавляет число 10 к параметру, который передается в качестве аргумента.

const addTen = function(num){
      return num + 10;
}
console.log(addTen(20)) //Output of this would be 30

Допустим, вы вызываете одну и ту же функцию с одним и тем же аргументом 3 раза, как показано во фрагменте ниже.

const addTen = function(num){
      return num + 10;
}
console.log(addTen(20)) //Output of this would be 30
console.log(addTen(20)) //Output of this would be 30
console.log(addTen(20)) //Output of this would be 30

Обратите внимание на шаблон здесь, каждый раз передается один и тот же аргумент, и один и тот же процесс выполняется внутри функции addTen, в этом сценарии вычисление одного и того же кода снова и снова бесполезно. Скорее, мы можем сохранить результат вычисления, и если переданный параметр уже известен сниппету, тогда можно будет вернуть только что вычисленный сохраненный результат, как показано ниже.

let cache = {};
const addTen = function(num){
        if(num in cache){
          console.log("Inside Memoization block")
          return cache[num]
        }else{
          console.log("Inside Regular execution block")
          cache[num] = num + 10;
          return cache[num]
        }
}
console.log(addTen(20))
console.log(addTen(20))

Результатом приведенного выше фрагмента будет

Inside Regular execution block
30
Inside Memoization block
30

Как вы уже догадались, в первый раз произошло добавление и далее выполняется блок мемоизации. Это экономит сложные вычисления за счет сохранения результатов. Если на собеседовании задают вопрос, например, что такое мемоизация, объясните с помощью сниппета? Затем напишите приведенный выше код, он прост и легко объясним, вы даже можете добавить в него замыкания и внутренние функции, если вы знакомы с концепцией.

Некоторые интервью будут сложными, они зададут довольно сложные вопросы, как показано ниже.

  1. Можете ли вы написать функцию мемоизации для вычисления рядов Фибоначчи?
  2. Можете ли вы написать функцию мемоизации для нахождения факториала числа?

Давайте ответим на вопросы ниже,

Нахождение числа Фибоначчи с помощью мемоизации

Для тех из вас, кто не знает, что такое ряд Фибоначчи: это ряд чисел, где число представляет собой сложение двух последних чисел, начиная с 0 и 1. Пример последовательности: 0, 1, 1, 2 , 3, 5, 8, 13, 21, 34, 55…

Число Фибоначчи 2 равно = 1 + 1 = 2 // фибоначчи (1) + фибоначчи (0)

Сначала давайте посмотрим на обычный рекурсивный подход к вычислению ряда Фибоначчи.

function fibonacci(num) { 
 if (num <= 1) return 1;   
 return fibonacci(num - 1) + fibonacci(num - 2);
}

В приведенном выше подходе код выглядит очень простым, мы рекурсивно повторяем функцию до тех пор, пока базовый случай, I, E, не станет равным 0 или 1. Проблема с простой рекурсией заключается в том, что одни и те же значения вычисляются повторно, что увеличит вычисления, которые будут происходить внутри функция. Вместо того, чтобы вычислять значение каждый раз, мы можем использовать функцию мемоизации, как показано ниже.

function fibonacci(num, cache) {
  cache = cache || {};
  if (cache[num]) return cache[num];
  if (num <= 1) return 1;
   return cache[num] = fibonacci(num - 1, cache) + fibonacci(num - 2, cache);
}
fibonacci(4,{}) // output is 5

В этой строке

if (cache[num]) return cache[num];

Мы проверяем, вычислены ли уже фибоначчи значения, если оно уже вычислено, мы не будем пересчитывать его, а просто используем это значение. Это улучшит временную сложность алгоритма с 0 (2 ^ n) в предыдущем подходе до 0 (2N) в этом подходе.

Я оставлю читателям подход к нахождению Факториала числа с помощью Memoization. Удачного кодирования !!

Похожие статьи того же автора

  1. Прототип и прототипное наследование в JavaScript
  2. Как все объекты в JavaScript?
  3. Пузырьки событий и просачивание / захват событий в JavaScript - частый вопрос интервью

Подробнее здесь.