O(1)
- Constant Complexity 라고 하며, 입력값이 증가하더라도 시간이 늘어나지 않는다. 즉 입력값의 크기와 관계없이 즉시 출력값을 얻어낼 수 있다는 의미이다.
- 예시는 아래와 같다.
function O1_algorithm(arr, index) {
return arr[index];
}
let arr = [1, 2, 3, 4, 5];
let index = 1;
let result = O_1_algorithm(arr, index);
console.log(result); // 2
O(n)
- Linear Complexity 라고 하며, 입력값이 증가함에 따라 시간 또한 같은 비율로 증가하는 것을 의미한다. 즉 입력값이 1일때 1초의 시간이 걸리고, 입력값을 100으로 증가시켰을땐 100초의 시간이 걸린다는 의미이다. 위와 같은 알고리즘을 구현했다면 해당 알고리즘은 O(n)의 시간 복잡도를 가진다고 할 수 있다.
- 예시는 아래와 같다.
function On_algorithm(n) {
for(let i = 0; i < n; i++) {
// do something for 1 second
}
}
O(log n)
- Logarithmic Complexity 라고 하며, Big-O표기법중 O(1) 다음으로 빠른 시간 복잡도를 가진다. 해당 시간 복잡도를 가장 이해하기 쉽게 설명하자면 Up & Down 게임을 예시로 들면 이해하기가 조금 편하다. 1부터 50까지 숫자 중 랜덤으로 아무 숫자나 하나를 정해서 상대방이 해당 숫자를 맞추는 게임인데, 상대방이 말하는 숫자를 듣고 랜덤으로 정한 하나의 숫자가 어디에 있는지 Up인지 Down인지 알려주고 그런식으로 쭉 계속 해나가면서 처음 랜덤으로 정한 숫자를 맞추는 게임이다. 이 게임의 특징은 한번 숫자를 말할때마다 숫자가 Up인지 Down인지 맞출 수 있는 경우의 수가 반으로 줄어든다는것인데 O(log n)의 시간 복잡도를 가진 알고리즘도 이와 같다.
O(n2)
- Quadratic Complexity 라고 하며, 입력값이 증가함에 따라 시간이 입력값의 제곱수 비율로 증가하는 것을 의미한다. 즉 입력값이 1일때 1초의 시간이 걸리던 알고리즘에 입력값을 5로 줬더니 25(5x5)초의 시간이 걸렸다 라고 한다면 해당 알고리즘은 O(n2)의 시간 복잡도를 가진 알고리즘이라고 할 수 있겠다.
- 예시는 아래와 같다.
function O_quadratic_algorithm(n) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
// do something for 1 second
}
}
}
function another_O_quadratic_algorithm(n) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
for (let k = 0; k < n; k++) {
// do something for 1 second
}
}
}
}
O(2n)
- Exponential Complexity 라고 하며, Big-O 표기법 중 가장 느린 시간 복잡도를 가진다. 종이를 42번 접으면 그 두께가 지구에서 달까지의 거리보다 커진다는 이야기가 있는데 그 이유는 고작 종이처럼 얇은 것일지라도 한번 접을때마다 그 두께가 2배로 늘어나기 때문이다. 즉 입력값이 +1로 증가할때마다 따라 걸리는 시간이 두배로 늘어나는 알고리즘이 있을때 이러한 알고리즘을 O(2n)의 시간 복잡도를 가진 알고리즘이라고 한다.
- 예시는 아래와 같다.
function fibonacci(n) {
if (n <= 1) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}