입력값의 증감에 따라 시간이 얼마만큼 비례하여 증감하는가? 즉, 입력값이 커짐에 따라 증가하는 시간의 비율을 얼마나 최소화하였는가와 동일. "이 정도 시간까지 걸릴 수 있다"
표기 방법은 Big-O (최악의 경우), Big-Ω (최선/최적의 경우), Big-θ (평균)
function sasha(arr, idx){
return arr[idx];
}
let arr = [1,2,3]
let idx = 2
let result = sasha(arr,2);
console.log(result);
function sasha(n){
for(let i = 0; i < n; i++){
return i;
}
}
function sasha2(n){
for(let i = 0; i < 2n; i++){
return i;
}
}// 코드의 실행 시간이 2초씩 증가.
O(log n): logarithmic complexity, O(1) 다음으로 빠른 시간 복잡도를 가짐. 대표적인 예인 BST의 경우, 원하는 값을 탐색할 때, 노드를 이동할 때마다 수가 절반으로 줄어들어, 후반으로 갈 수록 연산해야 할 양이 적어짐.
O(n log n): 합병 정렬.
function sasha(n) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++){
...
}
}
}
function fibonacci(n) {
if (n<=1){
return 1;
}
return fibonacci(n-1) + fibonacci(n-2);
}
프로그램 작성 시, 정확한 값을 제한된 시간 내에 반환하는 프로그램을 작성해야함. 시간 제한과 주어진 데이터 크기 제한에 따른 시간 복잡도를 대략적이나마 예측해보는 것이 중요.
데이터 크기 제한 | 예상되는 시간 복잡도 |
---|---|
n <= 1,000,000 | O(n) or O(log n) |
n <= 10,000 | O(n^2) |
n <= 500 | O(n^3) |
동적 계획법, 주어진 문제를 여러 개의 하위 문제로 나누어 풀고, 하위 문제들의 해결 방법을 결합하여 최종 문제를 해결하는 문제 해결 방식. 하위 문제를 계산한 뒤 그 해결책을 저장(Memoization)하여, 후에 같은 하위 문제가 나왔을 경우 저장된 해결책을 이용하여, 계산 횟수를 줄임.
본 프로그래밍은 다음과 같이 두 가지 가정이 만족하는 조건에서 사용 가능.