시간복잡도 Time Complexity

시간복잡도는 알고리즘이 얼마나 빠른지 측정하는 방법이다.
알고리즘이 동작하는 환경(하드웨어 조건)이 모두 다르기때문에 단순히 시간으로 측정하는 것이 아니고
얼마나 많은 단계를 거쳐 동작하는가를 중심으로 속도를 판단한다.



Big-O notation

어떤 알고리즘이 얼마나 느린지, 빠른지 설명하기 위해 Big-O 표기법을 활용한다.
이 알고리즘은 n개의 요소가 있을때 n만큼의 단계가 필요하다 라고 설명하기보다
그 알고리즘은 O(n)의 시간복잡도를 가지고 있다 라고 표현하는 것이다.

시간복잡도를 비교할 수 있는 여러가지 Big-O 표기가 있는데
O(1) < O(log n) < O(n) < O(n log n) < O(n2) < O(2n) < O(n!) 의 순서로 볼 수 있다.

O(1) : Constant time

O(1)은 아무리 요소가 많은 자료가 오더라도 한번의 실행으로 절차가 끝나는 알고리즘을 말한다.

1
2
3
function solution(arr) {
  console.log(arr[0]);
}

Big-O는 함수의 디테일에는 관심이 없다.
따라서 200개의 요소를 출력하는 함수라해도, 표현은 O(1)으로 하면된다.

O(n) : Linear time

O(n)은 요소의 수만큼 절차가 실행되는 알고리즘을 말한다.
인풋이 커지는만큼 절차가 늘어난다.

1
2
3
4
5
function solution(arr) {
  for (let i = 0; i < n; i++) {
    console.log(i);
  }
}

O(log n)

O(log n)은 로그 시간복잡도를 지니며, 인풋이 큰 경우에도 절차를 확 줄일 수 있다.

1
2
3
4
5
function solution(arr) {
  for (let i = 1; i <= n; i *= 2) {
    console.log(i);
  }
}

O(n log n)

O(n)의 절차 내부에서 O(log n)가 실행되는 것을 말한다.

1
2
3
4
5
6
7
function solution(arr) {
  for (let i = 0; i < n; i++) {
    for (let j = 1; j <= n; j *= 2) {
      // ...
    }
  }
}

O(n2)

O(n) 내부에서 O(n)이 실행되는 것을 말한다.

1
2
3
4
5
6
7
function solution(arr) {
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      // ...
    }
  }
}

이 외에 O(2n) 와 O(n!)의 시간복잡도는
코딩테스트에서 사용할 일이 없고 사용해서도 안된다.


image 시간복잡도 그래프

Leave a comment