์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (Optimal Substructure)
โก ๋ถ๋ถ ๋ฌธ์ ๋ค์ ์ต์ ์ ๋ต์ ์ด์ฉํด ๊ธฐ์กด ๋ฌธ์ ์ ์ต์ ์ ๋ต์ ๊ตฌํ ์ ์๋ค
์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ (Overlapping Subproblems)
โก ๋ถ๋ถ ๋ฌธ์ ๋ค์ ํ๋ค๋ณด๋ฉด ์ค๋ณต๋๋ ๋ฌธ์ ๋ค์ด ์์ ์ ์๋ค
Memoization
Tabulation
def fib_memo(n, cache):
if n < 3:
return 1
if n in cache:
return cache[n]
cache[n] = fib_memo(n - 1, cache) + fib_memo(n - 2, cache)
return cache[n]
def fib(n):
# n๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๋ด๋ ์ฌ์
fib_cache = {}
return fib_memo(n, fib_cache)
print(fib(10))
print(fib(50))
print(fib(100))
# 55
# 12586269025
# 354224848179261915075
def fib_tab(n):
table = []
for i in range(n):
if i <= 1:
table.append(1)
else:
table.append(table[i-2]+table[i-1])
return table[-1]
print(fib_tab(10))
# 55
๊ณตํต์ : ๋ ๋ค ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ์ ๋นํจ์จ์ ํด๊ฒฐ
์ฐจ์ด์
Memoization | Tabulation |
---|---|
์ฌ๊ทํจ์ ์ฌ์ฉ | ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ |
๊ณผ๋ํ Call stack์ผ๋ก ๊ณผ๋ถํ, ์ค๋ฅ๊ฐ ๋ ์ ์์ | Call stack์ผ๋ก ์ธํ ์ค๋ฅ ์ํ ์์ |
ํ์์๋ ๊ณ์ฐ์ ์ํด๋ ๋๋ ์ฅ์ | ํ์์๋ ๊ณ์ฐ๊น์ง ๋ค ํด์ผํ๋ ๋จ์ |