다이나믹 프로그래밍은 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법이다. (동적계획법)
다이나믹 프로그래밍에서는 이미 계산된 결과를 별도의 메모리에 저장하여 다시 계산하지 않도록 해 수행 시간을 비약적으로 향상시킨다.
최적 부분 구조(Optimal Substructure)
큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있다.
중복되는 부분 문제(Overlapping Subproblem)
동일한 작은 문제를 반복적으로 해결해야 한다.
피보나치 수열은 다이나믹 프로그래밍으로 풀 수 있는 대표적인 문제 중 하나이다.
단순 재귀 함수로 피보나치 수열을 해결하면 지수 시간 복잡도를 가지게 되고 같은 연산이 여러번 호출되는 문제가 발생한다. 이러한 문제를 해결하기 위해 다이나믹 프로그래밍을 활용할 수 있다.
메모이제이션은 다이나믹 프로그래밍을 구현하는 바법 중 하나로 한 번 계산한 결과를 메모리 공간에 메모하는 기법이다.
같은 문제를 다시 호출하면 메모했던 결과를 그대로 가져오며 값을 기록한다는 점에서 캐싱(Caching)이라고도 한다.
d = [0] * 100
def fibo(x):
if x == 1 or x == 2:
return 1
if d[x] != 0:
return d[x]
d[x] = fibo(x - 1) + fibo(x - 2)
return d[x]
print(fibo(99))
탑다운(메모이제이션)은 하향식, 보텀업은 상향식이라고도 한다.
Top-Down: 재귀 함수를 이용하여 다이나믹 프로그래밍 코드를 작성하는 방법을 큰 문제를 해결하기 위해 작은 문제를 호출한다고 하여 Top-Down이라고 한다.
Botton-Up: 단순히 반복문을 이용하여 소스코드를 작성하는 경우 작은 문제부터 차근차근 답을 도출한다고 하여 Bottom-up 방식이라고 한다.
다이나믹 프로그래밍의 전형적인 형태는 보텀업 방식이며 보텀업 방식에서 사용되는 결과 저장용 리스트는 DP 테이블이라고 부르고 메모이제이션은 탑 다운 방식에 국한되어 사용되는 표현이다.
Ref