다이나믹 프로그래밍
-
메모리를 적절히 사용하여 수행시간 효울성을 비약적으로 향상시키는 방법
-
이미 계산된 결과(작은문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 합니다.
-
일반적으로 두 가지 방식(탑다운과 보텀업)으로 구성됩니다.
-
동적 계획법이라고도 부른다.
-
일반적인 프로그래밍 분야에서의 동적이란
- 자료구조에서 동적 할당은 프로그램이 실행되는 도중에 실행에 필요한 메모리를 할당하는 기법
- 다이나믹 프로그래밍의 다이나믹은 별다른 의미 없음
# 피보나치 함수(Fibonacci Function)을 재귀함수로 구현
def fibo(x) :
if x == 1 or x == 2:
return 1
return fibo(x-1) + fibo(x-2)
print(fibo(4))
단순 재귀 함수로 해결하면 지수 시간 복잡도를 갖음
f(2)가 중복 호출 됨
- 최적 부분 구조
- 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있습니다.
- 중복되는 부분 문제
메모이제이션
- 다이나믹 프로그래밍을 구현하는 방법 중 하나
- 한번 계산한 결과를 메모리 공간에 메모
- 같은 문제를 다시 호출하면 메모했던 결과를 그대로 가져옴
- 값을 기록해 놓는다는 점에서 캐싱이라고도 한다.
탑다운 VS 보텀업
- 탑다운(메모이제이션)방식은 하향식이라고도 하며 보텀업 방식은 상향식이라고도 한다.
- 다이나믹 프로그래밍은 전형적인 형태는 보텀업이다.
- 결과 저장용 리스트는 DP테이블이라고 부른다.
- 메모이제이션은 이전에 계산된 결과를 일시적으로 기록해 놓는 넓은 개념을 의미
- 메모이제이션은 다이나믹 프로그래밍에 국한된 개념이 아님
- 한번 계산된 결과를 담아 놓기만 하고 다이나믹 프로그래밍을 위해 활용하지 않을 수도 있다.