mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-05 00:01:37 +08:00
merge: Added explicit cache feature & optional parameter (#941)
This commit is contained in:
@ -10,12 +10,10 @@
|
|||||||
* which lets us use it as [Higher-Order Function](https://eloquentjavascript.net/05_higher_order.html)
|
* which lets us use it as [Higher-Order Function](https://eloquentjavascript.net/05_higher_order.html)
|
||||||
* and return another function
|
* and return another function
|
||||||
* @param {Function} func Original function
|
* @param {Function} func Original function
|
||||||
|
* @param {Map} cache - it's receive any cache DS which have get, set & has method
|
||||||
* @returns {Function} Memoized function
|
* @returns {Function} Memoized function
|
||||||
*/
|
*/
|
||||||
const memoize = (func) => {
|
const memoize = (func, cache = new Map()) => {
|
||||||
// Initialization of a slot to store the function result by arguments as a key in Hash Map
|
|
||||||
const cache = new Map()
|
|
||||||
|
|
||||||
const jsonReplacer = (_, value) => {
|
const jsonReplacer = (_, value) => {
|
||||||
if (value instanceof Set) { // if the value is Set it's converted to Array cause JSON.stringify can't convert Set
|
if (value instanceof Set) { // if the value is Set it's converted to Array cause JSON.stringify can't convert Set
|
||||||
return [...value]
|
return [...value]
|
||||||
|
@ -2,6 +2,7 @@ import { memoize } from '../Memoize'
|
|||||||
import { union } from './cacheTest'
|
import { union } from './cacheTest'
|
||||||
import { fibonacci } from '../../Dynamic-Programming/FibonacciNumber'
|
import { fibonacci } from '../../Dynamic-Programming/FibonacciNumber'
|
||||||
import { factorial } from '../../Recursive/Factorial'
|
import { factorial } from '../../Recursive/Factorial'
|
||||||
|
import LFUCache from '../LFUCache'
|
||||||
|
|
||||||
const multipleFactorials = (arr) => arr.map(factorial)
|
const multipleFactorials = (arr) => arr.map(factorial)
|
||||||
|
|
||||||
@ -51,4 +52,17 @@ describe('Testing Memoize', () => {
|
|||||||
expect(memoUnion(...inputs)).toEqual(new Set([1, 2, 3, 4, 5, 6]))
|
expect(memoUnion(...inputs)).toEqual(new Set([1, 2, 3, 4, 5, 6]))
|
||||||
expect(memoUnion(...inputs)).toEqual(union(...inputs))
|
expect(memoUnion(...inputs)).toEqual(union(...inputs))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('Testing with explicit cache -> LFUCache', () => {
|
||||||
|
const LFU = new LFUCache(2)
|
||||||
|
|
||||||
|
const memoizeFibonacci = memoize(fibonacci, LFU) // added LFU cache explicitly
|
||||||
|
const fibOfFiveHundred = memoizeFibonacci(500)
|
||||||
|
const fibOfOneHundred = memoizeFibonacci(100)
|
||||||
|
|
||||||
|
expect(memoizeFibonacci(500)).toBe(fibOfFiveHundred)
|
||||||
|
expect(memoizeFibonacci(100)).toBe(fibOfOneHundred)
|
||||||
|
|
||||||
|
expect(LFU.leastFrequency).toBe(2)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user