티스토리 뷰
1. 개요
[그림 1] 동적 계획법 ( Dyanmic Programming )
완전검색을 좀 더 효율적으로 하는 방법
Recursive + Memoization 기법을 활용
(1) 메모이제이션 (Memoization) : 프로그램을 실행할 때 이전에 계산한 값을 메모리에 저장해서 매번 다시 계산하지 않도록 하여 전체적인 실행속도를 빠르게 하는 기법으로 동적계획법의 핵심이 되는 기술이다.
(2) 동적계획법의 적용 요건
1. 최적 부분문제 구조 (Optimal Substructure) : 최적화 원칙이란 어떤 문제에 대한 해가 최적일 때 그 해를 구성하는 작은 문제들의 해 역시 최적이어야 한다는 것이다.
동적 계획법의 방법 자체가 큰 문제의 최적 해를 작은 문제의 최적해 들을 이용해서 구하기 때문에 만약 큰 문제의 최적해가 작은 문제들의 최적해로 구성되어있지 않다면 이 문제는 동적 계획법을 적용할 수 없다.
2. 중복 부분문제 구조(Overlapping subproblem) : 동적 계획법 문제는 순환적인 성질 때문에 이전에 계산되어졌던 작은 문제의 해가 다른 어딘가에서 필요하게 되는데 이를 위해 이미 해결된 작은 문제들의 해들을 어떤 저장공간(Table)에 저장하게 된다.
이렇게 저장된 해들은 다시 필요할 때마다 해를 얻기 위해 다시 문제들을 재 계산하지 않고 Table의 참조를 통해서 중복된 계산을 피하게 된다.
(3) 동적계획법과 분할 정복의 비교
분할정복 (Divide and conquer) |
동적 계획법 (Dynamic Programming) |
-연관 없는 부분 문제로 분할 한다 - 부분 문제를 재귀적으로 해결한다. - 부분 문제의 해를 결합(combine)한다. - 분할 정복은 같은 부분문제가 나타날 경우 재계산한다. - 하향식 방법으로 문제를 해결 (병합정렬, 퀵 정렬) |
- 부분 문제들이 연관이 없으면 적용할 수 없다. 즉, 부분문 제들은 더 작은 부분문제들을 공유한다. - 모든 부분문제를 한번만 계산하고 재사용(동적 계획법은 같은 부분 문제가 나타날 경우 다시 계산하지 않음) - 상향식 방법으로 문제를 해결 |
(4) 동적 계획법 적용 3단계
1. 최적해 구조의 특성을 파악하라.
- 문제를 부분 문제로 나눈다.
2. 최적해의 값을 재귀적으로 정의하라
- 부분문제의 최적해 값에 기반하여 문제의 최적해 값을 정의한다.
3. 상향식 방법으로 최적해의 값을 계산하라.
- 가장작은 부분문제부터 해를 구한 뒤 테이블에 저장한다.
- 테이블에 저장되어 있는 부분 문제의 해를 이용하여 점차적으로 상위 부분 문제의 최적해를 구한다. (상향식 방법)
2. 동적 계획법 예제 1 - 피보나치 수열 (Fibonacci Series)
[그림 2] 피보나치 수열 ( Fibonacci Series )
피보나치 수열을 코드로 작성한다고 생각하면 재귀호출을 떠올리기 쉽다. 피보나치의 정의를 C언어로 구현하면 아래와 같다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
Run Length Decoding , 압축 복원 (0) | 2017.05.20 |
---|---|
Run Length Encoding , 압축 알고리즘 (0) | 2017.05.19 |
깊이 우선 탐색 (DFS) (0) | 2016.08.26 |
탐욕법 ( Greedy ) (0) | 2016.08.26 |
백 트래킹 ( Backtracking ) (0) | 2016.08.24 |