Developer Cafe

시간복잡도 Time Complexity 본문

개발자답게

시간복잡도 Time Complexity

개발자 카페 2022. 8. 3. 10:10
728x90
효율적인 알고리즘이란 입력값이 커짐에 따라 증가하는 시간의 비율을 최소화한 알고리즘을 말한다.
이때 고려되는것이 시간복잡도인데 주로 빅-오 표기법으로 나타낸다.

 

코드를 예시로 자세히 알아보자

1. O(1)

O(1)는 일정한 복잡도(constant complexity)라고 하며, 입력값이 증가하더라도 시간이 늘어나지 않는다.
즉, 입력값 크기와 관계없이, 즉시 출력값을 얻어낼 수 있다는 의미이다.

function O_1_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

2. O(n)

O(n)은 선형 복잡도(linear complexity)라고 부르며, 입력값이 증가함에 따라 시간 또한 같은 비율로 증가하는 것을 의미한다.

function O_n_algorithm(n) {
  for (let i = 0; i < n; i++) {
    // do something for 1 second
  }
}

3. O(log n)

O(log n)은 로그 복잡도(logarithmic complexity)라고 부르며, Big-O표기법중 O(1) 다음으로 빠른 시간 복잡도를 가진다.

  • 이해하기 쉬운 게임으로 비유해 보자면 up & down을 예로 들 수 있다.
    1. 1~100 중 하나의 숫자를 플레이어1이 고른다. (30을 골랐다고 가정한다.)
    2. 50(가운데) 숫자를 제시하면 50보다 작으므로 down을 외친다.
    3. 1~50중의 하나의 숫자이므로 또다시 경우의 수를 절반으로 줄이기 위해 25를 제시한다.
    4. 25보다 크므로 up을 외친다.
    5. 경우의 수를 계속 절반으로 줄여나가며 정답을 찾는다.

4. O(n2)

O(n2)은 2차 복잡도(quadratic complexity)라고 부르며, 입력값이 증가함에 따라 시간이 n의 제곱수의 비율로 증가하는 것을 의미한다.

function O_quadratic_algorithm(n) {
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      // do something for 1 second
    }
  }
}

5. O(2n)

O(2n)은 기하급수적 복잡도(exponential complexity)라고 부르며, Big-O 표기법 중 가장 느린 시간 복잡도를 가진다. (재귀함수로 구현된 피보나치 수열이 대표적)

function fibonacci(n) {
  if (n <= 1) {
    return 1;
  }
  return fibonacci(n - 1) + fibonacci(n - 2);
}
728x90

'개발자답게' 카테고리의 다른 글

WS(Web Server)와 WAS(Web Application Server)  (0) 2022.10.27
int와 Integer  (0) 2022.10.27
HTTP가 지원하고 있는 메소드  (0) 2022.01.17
일반인에게 개발의 세계에 대해서  (0) 2021.06.22
URI VS URL VS URN 차이  (0) 2021.05.07
Comments