컨텐츠를 불러오는 중...
우리가 15kg의 양만 가방에 담을 수 있는데 우리가 담아야 하는 물건들이 각각12kg, 3kg, 4kg, 2kg, 1kg
가 있다. 우리는 이 물건들 중 가능한한 많은 양을 가방에 담아야 한다고 해보자. 이 경우 어떻게 하는 것이 가장 효율적일까?
O(N^3 + 50N + 17)
의 경우 O(n^3)
으로 표기한다. 왜냐하면 이미 n^3
은 이미 그 자체로도 너무나도 큰 값이기 때문에 세밀하게 나타낼 필요가 없다. 얼마만큼의 시간 복잡도를 가질 것인지에 대한 정확한 값이 필요하지 않기 때문에 큰 틀의 값으로 간단하게 표기하는 것이 좋다.시간 복잡도에대한 표기 규칙O(1) < O(logN) < O(N) < O(NlogN) < O(n^2) < O(2^n) < O(N!)
잠깐!Memorization
이 아니라Memoization
인가요? 이는 오타가 아닙니다!Memoization
은 알고리즘을 최적화 하는 기법으로써의 용어이고 계산 결과를 저장하는 기법인 반면Memorization
은 기억하거나 암기하는 일반적인 과정을 의미합니다!
[0, 1, -1, -1, -1]
[0, 1, ,1, -1, -1]
[0, 1, 1, 2, -1]
[0, 1, 1, 2, 3]
DP에서의 상태(State) = 문제의 시나리오를 충분히 설명할 수 있는 변수의 집합이다.
dp()
함수가 있을 경우 이 값의 현재 값이 어떻게 만들어지는지에 대한 것을 알아야 한다. dp(i) = dp(i - 1) + dp(i - 2)
와 같이 현재의 상태 변수가 어떻게 변화되는 지에 대한 관게에 대해서 알아야 한다.function fibonachi(number) {
if (n <= 1) {
return 0;
}
return fibonachi(number - 1) + fibonachi(number - 2);
}
const memo = new Map();
function fibo(number) {
if (memo.has(number)) {
return memo.get(number);
}
if (n <= 1) {
return n;
}
memo.set(number, fibo(number - 2) + fibo(number - 1));
return memo.get(number);
}
function fibo(number) {
if (number <= 1) {
return n;
}
const memo = [];
[memo[0], memo[1]] = [0, 1];
for (let i = 2; i < n; i++) {
memo[i] = memo[i - 2] + memo[i - 1];
}
return memo[number];
}