재귀와 같이,, 자기 자신을 계속 호출하는 형태의 함수에서
각 함수의 결과를 미리 저장해 놓고, 호출시 저장된 값을 활용해 시간을 단축하는 방법
가령 피보나치 수열을 예로
위 그림과 같이 계속 반복되는 부분이 있을 때,,
초기 매개변수가 작다면 실행 시간에 큰 차이가 없지만,,
매개변수가 커졌을 때, 매번 그 부분을 계산하는 것은 매우 비효율적이다.
따라서 그 값을 저장해둔다.
아래는 비교
- 동적 계획법 X
/**
* 일반 재귀
* @param n
* @return
*/
public static int fibo(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
} else {
return fibo(n - 2) + fibo(n -1);
}
}
- 동적 계획법 O
static int[] dp;
/**
* 동적 계획법 사용
* @param n
* @return
*/
public static int fiboDynamic(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
/**
* 이전에 계산을 했다면 저장된 값 리턴
*/
} else if (dp[n] != -1) {
return dp[n];
} else {
dp[n] = fiboDynamic(n - 2) + fiboDynamic(n - 1);
return dp[n];
}
}
시간 비교..
public static void main(String args[]) {
int n = 48;
long s1 = System.currentTimeMillis();
System.out.println(fibo(n));
long e1 = System.currentTimeMillis();
System.out.println("일반 : " + (e1 - s1));
System.out.println("-----------");
dp = new int[n + 1];
for (int i = 0; i < dp.length; i++) {
dp[i] = -1;
}
long s2 = System.currentTimeMillis();
System.out.println(fiboDynamic(n));
long e2 = System.currentTimeMillis();
System.out.println("동적 : " + (e2 - s2));
}
512559680
일반 : 23160
-----------
512559680
동적 : 1
'Dev- > 자료구조, 알고리즘' 카테고리의 다른 글
2581번) 소수 (0) | 2018.09.27 |
---|---|
재귀함수의 쓰임은 무한루프만?? (0) | 2018.09.13 |
재귀함수가 무한루프에 빠지지 않기 위한 조건 2가지 (0) | 2018.09.10 |
시간복잡도란? (0) | 2018.09.10 |
정규화란? (0) | 2018.08.25 |