Skip to content

Latest commit

ย 

History

History
80 lines (63 loc) ยท 2.92 KB

File metadata and controls

80 lines (63 loc) ยท 2.92 KB

๋ฉ”๋ชจ์ด์ œ์ด์…˜ (memoization)


๋ชฉ์ฐจ


memoization ์€ ์™œ ํ•„์š”ํ• ๊นŒ?

  • memoization์ด๋ž€?
    • 'ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ €์žฅํ•˜๊ณ , ๊ฐ™์€ ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค๋ฉด ์ €์žฅ๋œ ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ' ์ด๋‹ค.
    • ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๋ฉด '์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•  ๋•Œ, ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋™์ผํ•œ ๊ณ„์‚ฐ์˜ ๋ฐ˜๋ณต ์ˆ˜ํ–‰์„ ์ œ๊ฑฐํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ' ์ด๋‹ค.
    • ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ํ•จ์ˆ˜์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•˜๊ณ , ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•œ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  1. (๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•) ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ํ˜ธ์ถœ์‹œ ๊ฐ์ฒด์—์„œ ์ž…๋ ฅ์„ ์ฐพ๊ณ , ์—†๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ถœ๋ ฅ์„ ์ €์žฅํ•œ๋‹ค. => ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋ณด์ž!
  2. ํ•จ์ˆ˜์˜ ์ž…๋ ฅ์„ ํ‚ค๋กœ ์ถœ๋ ฅ์„ ๊ฐ’์œผ๋กœ ํ•˜๋Š” ๋งต์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

  • ์˜ˆ์‹œ
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]์˜ ๊ฐ’์ด ์žˆ์„ ๊ฒฝ์šฐ ์ €์žฅํ•œ ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์—†์„ ๊ฒฝ์šฐ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ฐพ์€ ํ›„ ๋„์ถœํ•œ ์ถœ๋ ฅ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

์ˆ˜์—… ๋ณต์Šต : memo.js

// 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
  1. memo ํ•จ์ˆ˜

    • ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’์˜ ์Œ์„ cache ๊ฐ์ฒด์— ์ €์žฅํ•œ๋‹ค.
    • ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์‹œ, cache ๊ฐ์ฒด์— ์ด๋ฏธ cube ํ‚ค์— ๋Œ€ํ•œ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, callback() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  cache ๊ฐ์ฒด์—์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  2. memoization ์‚ฌ์šฉ

    • getNode ํ•œ ๊ฐ’ ์ž์ฒด๊ฐ€ cache[cube] ์˜ value ๊ฐ’์œผ๋กœ ์„ค์ •๋œ๋‹ค.
    • ์ด๋ฏธ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ๋‹ค์‹œ ์„ค์ •ํ•˜๋ฏ€๋กœ, cache ๊ฐ์ฒด์˜ cube ์— ๋Œ€ํ•œ ๊ฐ’์„ ๋ฎ์–ด์”Œ์šด๋‹ค.