Top-down / Bottom-up
DP(Dynamic Programming) 방식은 크게 두 가지로 나뉜다. Top-down 방식과 Bottom-up 방식이다.
두 방법 모두 큰 문제를 여러 개의 부분 문제들로 나누어 푸는 방식인데 아래의 차이가 있다.
- Top-down 방식은 가장 큰 문제를 방문한 후 작은 문제를 호출하여 답을 찾는 방식이다.
- Bottom-up 방식은 가장 작은 문제들부터 답을 구해가며 전체 문제의 답을 찾는 방식이다.
일반적으로 Top-down은 재귀 호출을 Bottom-up은 반복문을 이용하여 구현한다.
피보나치 문제의 구현하는 예시를 살펴보자.
Top-down
아래는 Top-down 방식의 예시이다.
int fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
if (dp[n] != -1) return dp[n];
dp[n] = fibonacci(n - 1) + fibonacci(n - 2);
return dp[n];
}
Top-down 방식은 재귀 호출을 이용해서 구현했다. 전달해야 되는 파라미터가 많다면 Bottom-up 방식보다 많은 리소스를 사용하게 된다.
재귀함수가 콜스택에 점점 쌓이게 되면서 메모리도 많이 점유하게 되고, 함수를 호출하면서 이동하는 비용도 만만치 않다.
Bottom-up
아래는 Bottom-up 방식의 예시이다.
int fibonacci(int n)
{
dp[0] = 0, dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
}
반복문을 사용해서 점차 아는 범위를 늘려나간다. 재귀함수를 사용하지 않으므로 처리 시간과 리소스 사용을 줄일 수 있다.
Reference
'Language > Algorithm' 카테고리의 다른 글
자료 구조 - 레드-블랙 트리(Red-Black Tree)를 왜 사용할까? (0) | 2022.09.30 |
---|---|
해시 충돌(Hash Collision)이란? [+ 전략 비교]! (0) | 2022.04.24 |
자주 사용하는 정규식 총 정리! (0) | 2022.03.26 |
대규모 서비스 - O(log n) 알고리즘을 사용하는 이유 (0) | 2021.12.25 |