📢 동적프로그래밍
- 동적프로래밍(DP, Dynamic Programming) : 알고리즘 설계의 일반적 기법 중 하나
- 언뜻 보기에 많은 시간( 심지어 지수 시간 )이 소요될 것 같은 문제에 주로 적용한다.
- 적용의 조건은 :
👉 부문제 단순성(Simple Subproblems) : 부문제들이 j,k,l,m 등과 같은 몇 개의 변수로 정의 될 수 있는 경우
👉 부문제 최적성(Optimality Subproblems) : 전체 최적치가 최적의 부문제들에 의해 정의될 수 있는 경우
👉 부문제 중복성(Overlap Subproblems) : 부문제들이 독립적이 아니라 상호 겹쳐질 경우 ( 즉, 상향식으로 구축 ) - 대표적 예시
👉 피보나치 수(Fibonacci progression)에서 N-번째 수 찾기
👉 그래프의 이행적폐쇄 계산하기 - 동적프로그래밍 vs 분할통치법
공통점
👉 알고리즘 설계기법의 일종
👉 문제공간 : 원점-목표점 구조 ( 원점 : 문제의 초기 또는 기초지점 / 목표점 : 최종해가 요구되는 지점 )
차이점
👉 문제해결 진행 방향
동적프로그래밍(단방향) : 원점 -> 목표점
분할통치법(양방향) : 목표점 -> 원점 -> 목표점 ( 단, 해를 구하기 위한 연산을 진행, 방향은 원점->목표점 )
성능
👉 동적프로그래밍 : 단방향 특성때문에 종종 효율적
👉 분할통치법 : 분할 회수(보통 2분할을 한다.) , 중복연산 수행 회수에 따라 다름 - 이름은 "동적"프로그래밍이지만, 실제로 우리가 아는 "동적", 그때그때 사용하는 그런 의미는 아니다.
하나 구한 것은, 다를 때, 사용하는 의미일 뿐이고, 이러한 기법의 이름을 지은 사람이 그냥 "동적프로그래밍"이라 작명한 것 일 뿐이다. 오해하지말자.
📢 동적프로그래밍 예시
- N-번째 피보나치 수 찾기 : 피보나치 수열(Fibonacci Progression)은 i = 0,1에 대해 f(i) = 1이며, i >= 2 에 대해
f(i) = f(i-1) + f(i-2)인 수열이다. - 즉, f(0) = 1, f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, f(5) = 8, .......
- f(n), 즉 피보나치 수열의 n-번째 수를 찾기 위해, 정의로부터 직접 재귀알고리즘 f를 작성할 수도 있지만,
불행히도 지수시간(exponential time)에 수행하므로 너무나 비효율적이다 !! - 이를, 동적프로그래밍에 기초하여 f(n)을 찾는 비재귀, 선형시간 알고리즘을 다음 두 버젼으로 작성해보자.
👉 1. 선형공간으로 수행하는 버젼
👉 2. 상수공간으로 수행하는 버젼
Alg f(n) // 선형 공간
if(n == 0 || n == 1)
return 1
A[0] <- 1
A[1] <- 1
for i <- 2 to n
A[i] <- A[i-1] + A[i-2]
return A[n]
=============================
Alg f(n) // 상수 공간
if(n == 0 || n == 1)
return 1
a <- 1
b <- 1
for i <- 2 to n
c <- a + b
a <- b
b <- c
return c
728x90
반응형
'Algorithm Theory' 카테고리의 다른 글
최단경로(Shortest Path) (0) | 2020.12.15 |
---|---|
최소신장트리(Minimum Spanning Tree) (0) | 2020.12.15 |
방향 그래프(Directed graph) (0) | 2020.12.14 |
그래프 순회(Graph Traversal) (0) | 2020.12.14 |
그래프(Graph) (0) | 2020.12.13 |