馃棑 Publicado el 5 de agosto de 2019
驴Qu茅 es la memoizaci贸n (memoization en ingl茅s, no confundir con "memorizaci贸n") y c贸mo nos puede ayudar a reducir el tiempo de ejecuci贸n de un algoritmo?
Partiendo del problema de calcular el n-茅simo elemento de la serie de Fibonacci podemos obtener la muy conocida soluci贸n recursiva:
function fib (n) {
if (n < 2) return n
return fib(n - 1) + fib(n - 2)
}
Dicha soluci贸n tiene una complejidad algor铆tmica de O(2n) lo cual no es eficiente en absoluto. Esto se debe a que cada invocaci贸n a la funci贸n fibonacci recursiva mayor a 1 genera muchas mas llamadas a dicha funci贸n hasta llegar a la llamada con argumento 1 贸 0. Podemos observar un ejemplo de la llamada a la funci贸n recursiva fibonacci con n = 6:
Una forma para mejorar el tiempo de ejecuci贸n de este algoritmo (y de muchos otros) es utilizando la t茅cnica llamada Memoization la cual, de manera general, consiste en almacenar en una memoria cach茅 los resultados computacionalmente costosos de llamadas a funciones y retornarlos cuando sean requeridos por la llamada a la funci贸n con los mismos argumentos de entrada.
En el caso de la imagen anterior, s贸lo se calcular铆an los resultados con un fondo blanco y se almacenar铆an en cach茅 todos los resultados con fondo gris, reduciendo dr谩sticamente el tiempo de ejecuci贸n del algoritmo recursivo antes mencionado.
Para implementar esta t茅cnica en el problema de Fibonacci recursivo mencionado anteriormente, haremos lo siguiente:
memoizememoize almacenar谩 los resultados de la funci贸n fibonacci en una memoriamemoize consultar谩 en su memoria los resultados obtenidos anteriormente:
La implementaci贸n en JavaScript es la siguiente:
function fib (n) {
if (n < 2) return n
return fib(n - 1) + fib(n - 2)
}
function memoize (fn) {
const cache = {}
return function(...args) {
if (cache[args]) return cache[args]
const result = fn.apply(this, args)
cache[args] = result
return result
}
}
fib = memoize(fib)
console.log(fib(15))
Adicional a lo ya mencionado:
fn (que finalmente es la funci贸n fib) con un valor this determinado y los argumentos originales (el valor de n).fib a la funci贸n "memoizada" de fib con objeto de que las llamadas recursivas generadas en la funci贸n original fib hagan referencia a la versi贸n "memoizada" de fib recursivo.