- memoization์ด๋?
- 'ํจ์์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ์ ์ฅํ๊ณ , ๊ฐ์ ์ ๋ ฅ์ด ๋ค์ด์ค๋ฉด ์ ์ฅ๋ ์ถ๋ ฅ์ ๋ฐํํ๋ ๊ธฐ์ ' ์ด๋ค.
- ํ์ด์ ์ค๋ช ํ๋ฉด '์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํ ๋, ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ์ ๊ฑฐํ์ฌ ํ๋ก๊ทธ๋จ ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์ ' ์ด๋ค.
- ํจ์๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํด๋ ์ฑ๋ฅ ์ ํ๋ฅผ ์ต์ํ ํ ์ ์๋ค.
- ์ฆ, ํจ์์ ์ฑ๋ฅ์ ํฅ์ํ๊ณ , ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ๋ค.
- (๊ฐ๋จํ ๋ฐฉ๋ฒ) ํจ์์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ์ ์ฅํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ํธ์ถ์ ๊ฐ์ฒด์์ ์ ๋ ฅ์ ์ฐพ๊ณ , ์๋ค๋ฉด ํจ์๋ฅผ ํธ์ถํ๊ณ ์ถ๋ ฅ์ ์ ์ฅํ๋ค. => ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํด๋ณด์!
- ํจ์์ ์ ๋ ฅ์ ํค๋ก ์ถ๋ ฅ์ ๊ฐ์ผ๋ก ํ๋ ๋งต์ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
- ์์
fib(n) {
if n is 1 or 2, return 1;
return fib(n-1) + fib(n-2); }- ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋
const fibo = (num, memo) => {
memo = memo || {} // memoization : ๋น๊ฐ์ฒด ์์ฑ
if(memo[num]){
return memo[num]
}
if(num<=1){
return num;
}
return fibo(num-1, memo) + fibo(num-2, memo); }- memo[num]์ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ ์ฅํ ์ถ๋ ฅ์ ๋ฐํํ๋ค.
- ์์ ๊ฒฝ์ฐ ์ฌ๊ท ํจ์๋ฅผ ํตํด ๊ฐ์ ์ฐพ์ ํ ๋์ถํ ์ถ๋ ฅ๊ฐ์ ์ ์ฅํ๋ค.
// 1. ๋น ๊ฐ์ฒด ์์ฑ
const cache = {}
// 2. callback
export const memo = (key, callback) => {
if(!callback) return cache[key]; // ํด๋น ํค๋ฅผ ๊ฐ์ง๋ ๋ณ์๋ง ๋ฐํ
if(cache[key]){
console.warn(`${key}๋ ์ด๋ฏธ ์บ์๋ ๊ฐ์ด ์กด์ฌํฉ๋๋ค.`);
return cache[key]
}
cache[key] = callback(); // computed property
console.log(cache);
}
// 3. memoization
memo('cube', () => getNode('#cube')) // getNode ํ ๊ฐ ์์ฒด๊ฐ casche[key]์ value๋ก ์ค์ ๋จ
memo('cube', () => 1,2,3) // * ๋ฎ์ด์ฐ๊ธฐ ๋๋ฏ๋ก ์ค๋ณต ์ฒ๋ฆฌ!
console.log(memo('cube')); // div#cube-
memoํจ์- ํจ์์ ์
๋ ฅ๊ฐ๊ณผ ์ถ๋ ฅ๊ฐ์ ์์
cache๊ฐ์ฒด์ ์ ์ฅํ๋ค. - ๋ ๋ฒ์งธ ํธ์ถ์,
cache๊ฐ์ฒด์ ์ด๋ฏธcubeํค์ ๋ํ ๊ฐ์ด ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก,callback()ํจ์๋ฅผ ํธ์ถํ์ง ์๊ณcache๊ฐ์ฒด์์ ๊ฐ์ ๋ฐํํ๋ค.
- ํจ์์ ์
๋ ฅ๊ฐ๊ณผ ์ถ๋ ฅ๊ฐ์ ์์
-
memoization ์ฌ์ฉ
getNodeํ ๊ฐ ์์ฒด๊ฐcache[cube]์value๊ฐ์ผ๋ก ์ค์ ๋๋ค.- ์ด๋ฏธ ์ค์ ๋์ด ์๋ ๊ฐ์ ๋ค์ ์ค์ ํ๋ฏ๋ก,
cache๊ฐ์ฒด์cube์ ๋ํ ๊ฐ์ ๋ฎ์ด์์ด๋ค.