Memoization is a programming technique that we used to speed up functions and it can be used to do whenever we have an expensive function ( takes a long time to execute). It relies on the idea of cache {}. A cache is just a plain object. It reduces redundant function expression calls.
Let’s understand how to write a simpler code of the Memoization function in JS.
Example 1: In this example, we will see the inefficient way of writing a function that takes more time to compute.
const square = (n) => { let result = 0;
// Slow function
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= n; j++) {
result += 1;
}
}
return result;
} console.log(square(10000006)); console.log(square(40)); console.log(square(5)); |
Output:
For this reason, to compute operation in less time for large, we use memoization.
There are two ways to do memoization:
- Function memoization
- Cache memoization
Slow function which takes a large time to compute using cache memoization.
Example 2: This example is used to find the Square of number
const preValues = [] function square(n) {
if (preValues[n] != null ) {
return preValues[n]
}
let result = 0;
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= n; j++) {
result += 1;
}
}
// Storing precomputing value
preValues[n] = result;
return result;
} console.log(square(50000)); console.log(square(5000)); console.log(square(500)); |
2500000000 25000000 250000
Uses in Dynamic programming using cache memoization.
Example 3: This example is used to print Fibonacci sequence
fib = (n, preValues = []) => { if (preValues[n] != null )
return preValues[n];
let result;
if (n <= 2)
result = 1;
else
result = fib(n - 1, preValues) + fib(n - 2, preValues);
preValues[n] = result;
return result;
} console.log(fib(100)); |
354224848179262000000
Using memoizer i.e. it takes a function and then it has to return a function.
Example 4: This example shows memoization in Javascript
// Memoizer const memoize = () => { // Create cache for results
// Empty objects
const results = {};
// Return function which takes
// any number of arguments
return (...args) => {
// Create key for cache
const argsKey = JSON.stringify(args);
// Only execute func if no cached val
// If results object does not have
// anything to argsKey position
if (!results[argsKey]) {
results[argsKey] = func(...args)
}
return results[argsKey];
};
}; // Wrapping memoization function const multiply = memoize((num1, num2) => { let total = 0;
for (let i = 0; i < num1; i++) {
for (let j = 0; j < num1; j++) {
// Calculating square
total += 1 *;
}
}
// Multiplying square with num2
return total * num2;
}); console.log(multiply(500, 5000)); |
Output:
1250000000