우주먼지
article thumbnail

💡 시간복잡도

 

서로 다른 알고리즘의 효율성을 비교할 때 사용

시간복잡도 효율순 : O(1) < O( 𝑙𝑜𝑔𝑛 ) < O(n) < O(n 𝑙𝑜𝑔𝑛 ) < O( 𝑛2 ) < O( 2𝑛 ) < O(n!)


Big O 표기법이란?

- O (빅 오 복잡도) : 비교 대상인 그래프가 일치 혹은 아래에 있을 때. 비교 대상인 다른 알고리즘과 같거나 더 빠르다.
- θ (세타 복잡도) : 비교 대상인 그래프가 일치할 때. 비교 대상인 다른 알고리즘과 같다.
- Ω (빅 오메가 복잡도) : 비교 대상인 그래프가 일치 혹은 위에 있을 때. 비교 대상인 다른 알고리즘과 같거나 느리다.
- o (리틀 오 복잡도) : 비교 대상인 그래프가 아래에 있을 때. 비교 대상인 다른 알고리즘보다 더 빠르다.
- ω (리틀 오메가 복잡도) : 비교 대상인 그래프가 위에 있을 때. 비교 대상인 다른 알고리즘과 느리다.


부등호로 Big O 표현

O (빅 오 복잡도) : <=
θ (세타 복잡도) : =
Ω (빅 오메가 복잡도) : >=
o (리틀 오 복잡도) : <
ω (리틀 오메가 복잡도) : >


시간복잡도의 규칙

  • 규칙 1
    • input(입력값)은 항상 0 보다 크다
    • 음의 입력값은 시간복잡도를 고려할때 말이 되지 않는 경우임
  • 규칙 2
    • 컴퓨터 과학의 관점에서 함수는 많은 입력값이 있을때 더 많은 작업을 하게 됨
  • 규칙 3
    • 시간복잡도에서는 모든 상수를 삭제함 (ex: 3n = n, 5n = n)
  • 규칙 4
    • 낮은 차수의 항은 무시한다
    • n과 n^2 를 비교할때 그래프에서 (1,1)인 지점까지는 n이 더 오래걸릴 수 있지만
      알고리즘에서는 입력값이 1 보다 작은 값은 고려하지 않기 때문에
      n이 무한으로 커진 경우를 가정하고 비교를 해야함
    • n^3 + n^2 + n 이라는 함수가 있을때, n^2과 n은 알고리즘의 시간복잡도에 영향을 미치지 않고,
      n^3 만이 입력값이 무한이 될때 고려해야할 부분이다
  • 규칙 5
    • 시간복잡도 함수가 log 함수를 포함할 경우 밑은 무시한다
    • 모든 로그는 서로 배수 관계이므로, 복잡도에 관해선 로그의 밑을 고려하지 않아도 됨
    • 복잡도가 log인 알고리즘은 보통 무언가를 반으로 나누거나 2를 곱한 경우 자주 사용 됨
      ex: 반복문에서 무언가를 탐색하면서 반으로 나누거나 2를 곱할때 복잡도는 밑이 2인 로그가 됨,
      10으로 나누거나 10을 곱하면 밑이 10인 로그가 되고,
      이때 밑은 무시하고 log(n)의 시간복잡도를 가진다고 표현함
  • 규칙 6
    • 등호를 사용하여 표현한다
    • ex: 2n = O(n) -> 2n은 O(n)이라는 함수의 집합에 속함

시간복잡도가 O(1) 인 경우

  • O(1)은 constant complexity라고 하며, 입력값이 증가하더라도 시간이 늘어나지 않음.
  • 입력값의 크기와 관계없이 즉시 출력값을 얻어낼 수 있다는 의미임
  • 예를들어 arr의 길이가 100만이라고 해도, 즉시 해당 index에 접근해 값 반환 가능

입력값의 크기가 아무리 커져도 즉시 출력값을 얻어낼 수 있는 O(1) 알고리즘 예시


시간복잡도가 O(n) 인 경우

  • linear complexity라고 하며, 입력값이 증가함에 따라 시간 또한 같은 비율로 증가함
  • 예를들어 입력값이 1일때 1초의 시간이 걸리고,
    입력값을 100배 증가시켰을때 100초가 걸리는 알고리즘을 구현했다면,
    그 알고리즘은 O(n)의 시간 복잡도를 가진다고 할 수 있음.

첫번째 함수에선 입력값(n)이 1 증가할때마다 코드 실행시간이 1초씩 증가함
두번째 함수는 입력값이 1 증가할때마다 코드 실행시간이 2초씩 증가하므로 이 알고리즘은 O(2n) 이라고 표현할 수 있음


시간복잡도가 O(log n) 인 경우

  • logarithmic complexity라고 하며, Big-O 표기법중 O(1) 다음으로 빠른 시간복잡도를 가진다
  • 자료구조에서 배웠던 BST에선 원하는 값을 탐색할때, 노드를 이동할때마다 경우의 수가 절반으로 계속 줄어듬.
    BST의 값 탐색과 같은 로직으로 O(log n)의 시간복잡도를 가진 알고리즘(탐색기법) 임


시간복잡도가 O(n^2) 일 경우

  • quadratic complexity라고 하며, 입력값이 증가함에 따라 시간이 n의 제곱수의 비율로 증가
  • 예를들어 입력값이 1일 경우 1초가 걸리던 알고리즘에 5라는 값을 주니 25초가 걸리게 된다면
    이 알고리즘의 시간복잡도는 O(n^2)라고 표현함

2n, 5n을 모두 O(n)이라고 표현하는 것 처럼, n^3과 n^5도 모두 O((n^2)로 표기함. n이 커질수록 지수가 주는 영향력이 점점 퇴색됨


시간복잡도가 O(2^n) 일 경우

  • exponential complexity라고 하며, Big-O표기법 중 가장 느린 시간복잡도를 가짐

재귀로 구현한 fibonazzi 수열은 O(2^n)의 시간 복잡도를 가진 대표적인 알고리즘임.

'Data Architect > Data Structure' 카테고리의 다른 글

반복자 (Iterator)  (0) 2023.02.12
단순 연결 리스트 (Singly Linked List)  (0) 2023.02.06
자료구조의 특징  (0) 2023.02.05
Time Complexity & Greedy & Brute Force  (0) 2022.09.27
DFS & BFS  (2) 2022.09.26
profile

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그