📚 다이나믹 프로그래밍(Dynamic Programming, DP)
- 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법
- 이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 함
다이나믹 프로그래밍 구현은 일반적으로 두 가지 방식(탑다운(top-down)과 보텀업(bottom-up))으로 구성
🟦 일반적인 프로그래밍 분야에서의 동적(Dynamic)이란?
자료구조에서 동적 할당은 '프로그램이 실행되는 도중에 실행에 필요한 메모리를 할당하는 기법'을 의미
반면 다이나믹 프로그래밍에서 '다이나믹'은 별다른 의미 없이 사용된 단어
▼ 다음의 조건을 만족할 때 사용
1. 최적 부분 구조 (Optimal Substructure)
큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제 해결 가능
2. 중복되는 부분 문제 (Overlapping Subproblem)
동일한 작은 문제를 반복적으로 해결해야 함
📙 메모이제이션(Memoization)
한 번 계산한 결과를 메모리 공간에 메모하는 기법
- 같은 문제를 다시 호출하면 메모했던 결과를 그대로 가져옴
- 값을 기록해 놓는다는 점에서 캐싱(Caching)이라고 함
📙 탑다운 vs 보텀업
탑다운(메모이제이션) 방식은 하향식이라고도 하며 보텀업 방식은 상향식이라고도 함
다이나믹 프로그래밍의 전형적인 형태는 보텀업 방식
- 결과 저장용 리스트는 DP 테이블이라고 부름
엄밀히 말하면 메모이제이션은 이전에 계산된 결과를 일시적으로 기록해 놓는 넓은 개념을 의미
- 따라서 메모이제이션은 다이나믹 프로그래밍에 국한된 개념은 아님
- 한 번 계산된 결과를 담아 놓기만 하고 다이나믹 프로그래밍을 위해 활용하지 않을 수도 있음
📙 다이나믹 프로그래밍 vs 분할정복
다이나믹 프로그래밍과 분할 정복은 모두 최적 부분 구조를 가질 때 사용할 수 있음
- 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아 큰 문제를 해결할 수 있는 상황
다이나믹 프로그래밍과 분할 정복의 차이점은 부분 문제의 중복임
- 다이나믹 프로그래밍 문제에서는 각 부분 문제들이 서로 영향을 미치며 부분 문제가 중복됨
- 분할 정복 문제에서는 동일한 부분 문제가 반복적으로 계산되지 않음
피보나치 수열
- 단순 재귀 함수로 피보나치 수열을 해결하면 지수 시간 복잡도를 가짐
- 다음과 같이 f(2)가 여러번 호출 되는 것을 확인 (중복되는 부분 문제)
- 이미 계산된 결과를 메모리에 저장하면 다음과 같이 색칠된 노드만 처리할 것을 기대할 수 있음
- 메모이제이션을 이용하는 경우 피보다니 수열 함수의 시간 복잡도는 O(N) 임
반응형
'Algorithm > Algorithm Theory' 카테고리의 다른 글
[Python] 정규표현식(RE) 정리 (0) | 2024.03.20 |
---|---|
[Algorithm] 02. 배열3 (0) | 2023.02.12 |
[Algorithm] 01. 배열2 (0) | 2023.02.12 |
[Algorithm] 00.배열 1 (0) | 2023.02.08 |
[Python] 07.객체 지향 프로그래밍2 + 에러와 예외 (0) | 2023.02.05 |