[CodingTest]시간 복잡도
시간 복잡도
시간 복잡도를 고려한다는 것 - 입력값의 변화에 따라 연산을 실행할 때, 연산 횟수에 비해 시간이 얼마만큼 걸리는가?
시간 복잡도는 주로 빅-오 표기법을 사용해 나타냄
Big-O 표기법
- Big-O(빅-오)
- Big-Ω(빅-오메가)
- Big-θ(빅-세타)
시간 복잡도를 각각 최악, 최선, 중간(평균)을 나타냄
Big-O 표기법이 가장 자주 사용 - 이 정도 시간까지 걸릴 수 있음을 고려
최악의 경우도 고려하여 대비하는 것이 바람직
O(1)
- constant complexity(일정한 복잡도)
- 입력값이 증가하더라도 시간이 늘어나지 않음
- 입력값의 크기와 관계없이, 즉시 출력값을 얻을 수 있음
e.g.
const O1 = (arr, index) => {
return arr[index];
};
console.log(O1([1, 2, 3], 2));
arr이 길어져도 상관없음
O(n)
- linear complexity(선형 복잡도)
- 입력값이 증가함에 따라 시간 또한 같은 비율로 증가
const On = (n) => {
for (let i = 0; i < n; i++) {
// ... 1 초걸림
}
};
console.log(On(5));
입력값 1이 증가할 때마다 1초 증가
const On = (n) => {
for (let i = 0; i < 2n; i++) {
// ... 1 초걸림
}
};
입력값 1이 증가할 때마다 2초 증가
같은 비율로 증가하고 있다면 5배, 10배로 증가하더라도 O(n)으로 표기
O(log n)
- logarithmic complexity(선형 로그 시간)
- Big-O표기법중 O(1) 다음으로 빠른 시간 복잡도
- BST(Binary Search Tree)도 O(log n)의 시간 복잡도를 가진 알고리즘(탐색기법)
O(n2)
- quadratic complexity(2차 복잡도)
- 입력값이 증가함에 따라 시간이 n의 제곱수의 비율로 증가
function On2(n) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
// ... 1초 걸림
}
}
}
n2
function On2(n) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
for (let k = 0; k < n; k++) {
// ... 1초 걸림
}
}
}
}
n3
O(2n)
- exponential complexity(기하급수적 복잡도)
- Big-O 표기법 중 가장 느린 시간 복잡도
- 종이를 계속 접는 것처럼..
function fibonacci(n) {
if (n <= 1) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
피보나치 수열
데이터 크기에 따른 시간 복잡도
정확한 값을 제한된 시간 내에 반환하는 프로그램을 작성
시간제한과 주어진 데이터 크기 제한에 따른 시간 복잡도를 어림잡아 예측해 보는 것은 중요
데이터 크기 제한 | 예상되는 시간 복잡도 |
---|---|
n ≤ 1,000,000 | O(n) or O (logn) |
n ≤ 10,000 | O(n2) |
n ≤ 500 | O(n3) |
댓글남기기