algorithm
메모이제이션과 타뷸레이션
메모이제이션 (동적 프로그래밍 ①)
계산 결과를 저장해 같은 계산을 여러 번 수행하지 않도록 하는 기법
- 메모이제이션은 재귀를 이용해 문제를 하향식으로 해결한다.
이미 실행되었던 함수가 나중에 똑같이 다시 실행되는 동작이 반복되면서 성능을 저하시킨다.
따라서 이때 이미 한 번 실행되었던 함수의 결과를 저장해두었다가 같은 함수 호출이 발생한다면 이미 실행되었던 함수의 결과를 재사용 하는 것을 메모이제이션이라고 한다.
메모이제이션을 사용하면 함술 호출 수가 현저하게 줄어들며 성능이 향상된다.
+) 메모이제이션은 속도를 위해 메모리를 사용한다.
이때 사용하는 자료구조가 바로 해시 테이블이다. 자바스크립트의 객체가 이와 동일하다.
코드 - 피보나치 함수를 해시 테이블을 사용해 성능 향상
메모이제이션을 사용해 피보나치 수열은 O(n^2) 에서 O(n)이 되었다.
// 원본
function fibonacci(n) {
if(n == 0 || n == 1) return n;
return fibonacci(n - 2) + fibonacci(n - 1);
}
// 성능 향상
function fibonacci(n, memoization) {
if(n == 0 || n == 1) return n;
if(memoization[n] == null) { // 메모이제이션에 존재하지 않는 경우
memo[n] = fibonacci(n - 2, memo) + fibonacci(n - 1, memo);
}
return memo[n]
}
타뷸레이션 (동적 프로그래밍 ②)
계산에 필요한 모든 값을 전부 미리 계산한 후 테이블에 저장해두는 기법
- 타뷸레이션은 상향식으로 해결한다.
function fibonacci(n, memoization) {
if(n <= 1) return n;
let table = [0, 1];
for(let i = 2; i <= n; i++) {
table[i] = table[i - 2] + table[i - 1];
}
return table[n];
}