본문 바로가기
C/알고리즘

동적 표를 이용하자.

by stdlib.h 2016. 12. 18.

동적표란 우리가 계산하면서 나온 결과값을들 저장해두는 표를 말한다.


이러한 행위를 왜 하는가?


관계기반 설계를 설명할 때, 탐색기반을 함께 설명했었다.


그때 탐색기반의 단점을 해소 하기 위해 '배제'를 한다고 했었는데 동적 표를 이용하여


비슷한 개념의 행위로 똑같은 효과를 낼 수 있다.


무슨 뜻이냐면, 이미 계산한 결과를 저장해두고, 중복되는 일이 있을때 그값을 꺼내 오기만 하면 된다.


이로써 중복된 연산을 피할 수 있고, 결론적으로 더 빠르고 효율적인 프로그램이 되는 것이다.


또한, 이전 값을 이용해서 다음 값들을 채워 나갈 수 있다.


이전 값이 반드시 필요한데 이건 관계 기반 설계에서 f(1)을 미리 구한 것과 같다.



ex) 피보나치 수열


1) 동적 표를 사용하지 않은 방식


1
2
3
4
5
6
7
int f(int n)
{
    if (n <= 2)
        return 1;
    else
        return f(n - 1+ f(n - 2);
}
cs


2)사용한 방식


1
2
3
4
5
6
7
8
9
10
int dp[10000];
 
int f(int n)
{
    if (n <= 2)
        return 1;
    else if(dp[n] != 0)
        dp[n];
    return dp[n] = (f(n - 1+ f(n - 2));
}
cs



1번과 2번을 비교해 보겠다.


1번의 경우


5를 입력했다고 가정하면, f(4) + f(3) = f(3) + f(2) + f(2) + f(1) = f(1)+ f(2) + f(2) + f(2) + f(1) = 2f(1) + 3f(2)


3이 여러번 중복된다. 때문에 n이 클수록 연산 횟수가 기하급수적으로 쭉쭉 높아진다.


2번의 경우.


f(4) + f(3) 을 계산하면서 dp[3] 에 f(3)의 값을 저장하고, f(3)이 호출됬을때 return 함으로써, 중복된 연산을 피하게 되었다.



이처럼 동적표를 사용하면 중복된 연산을 줄일 수 있고, 재귀 호출이 많아질 때 Stack Overflow 가 나는 것도 방지할 수 있다.



'C > 알고리즘' 카테고리의 다른 글

관계기반 알고리즘의 설계  (0) 2016.12.18
Lower bound Upper bound  (0) 2016.05.10
인접 행렬 그래프, 깊이 우선탐색 (DFS), 너비 우선탐색(BFS)  (0) 2016.05.10
전체탐색  (0) 2016.05.08