본문 바로가기
Study/알고리즘

시간복잡도와 공간복잡도

by JSIM_DEV 2021. 3. 1.

공통

표기법

//시간복잡도의 판단 기준에 대한 내용 첨가 필요,

점근적 표기법 3가지

  • 최상의 경우 : 오메가 표기법 (Big-Ω Notation)
  • 평균의 경우 : 세타 표기법 (Big-θ Notation)
  • 최악의 경우 : 빅오 표기법 (Big-O Notation)

평균적인 세타 표기를 통한 시간복잡도 예측을 하는 게 좋지만, 평가하기가 까다로워 일반적으로 빅오 표기법을 많이 사용하며, 최악의 상황을 고려하니 평균과 가까운 성능으로 예측하기 쉽다.

빅오 표기법 (Big-O)

정의

빅오 표기법은 불필요한 연산을 제거하여 알고리즘 분석을 쉽게 할 목적으로 사용된다.

  • 시간복잡도는 입력된 N의 크기에 따라 실행되는 조작의 수를 나타낸다.
  • 공간복잡도는 알고리즘이 실행될 때 사용하는 메모리의 양을 나타낸다. (근대에는 메모리 용량의 증가로 중요도가 낮아졌다.)

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a3a5df95-8ece-4d7c-9f0c-9a7d8147b423/Untitled.png

Big-O 복잡성 차트

시간복잡도

정의

말 그대로 문제를 해결하는데 걸리는 시간,

왜 실행시간이 아닌 연산수치로 표현할까? 이는 컴퓨터의 사양마다 처리속도는 천차만별이기 때문에 성능을 고려하지 않은 명령어의 실행횟수만을 고려하는 것이다.

시간복잡도에서 중요하게 보는 것은 가장 큰 영향을 미치는 n의 단위이다.

방법) 상수를 제거하고 최고 차항만 남긴다.

 

복잡도 단위

명령어 실행횟수 최종 시간복잡도
1 O(1)
2n + 20 O(n)
3n² O(n²)

 

 

시간복잡도 별 문제해결 단계

시간복잡도 개념적 시간 설명
O(1)

상수 시간 오직 한번의 단계로 처리
O(log n) 로그 시간 문제 해결을 위한 단계를이 연산마다 특정 요인에 의해 줄어듬
O(n) 직선적 시간 문제 해결하기 위한 단계의 수가 입력값 n만큼의 횟수를 거침
O(n log n)   선형 로그형 단계를 거침 (부가설명 필요)
O(n²) 2차 시간 문제를 해결하기 위한 단계의 수는 입력값의 n의 제곱
O(Cⁿ) 지수 시간 문제를 해결하기 위한 단계의 수는 주어진 상수값 C의 n 제곱
O(n!) 팩토리얼 시간 문제 해결의 단계 수는 팩토리얼 수준
     

 

시간 복잡도 별 예제

시간복잡도 예제
O(1) 단순 출력 및 연산
O(log n) 효율좋은 검색 알고리즘
O(n) 입력된 자료의 수에 따라 선형적인 실행 시간이 걸리는 경우 (1차 배열 순회)
O(n log n) 효율좋은 정렬 알고리즘 (상세 설명 추가 필요)
O(n²) 이중 루프
O(Cⁿ) 데이터 갯수 만큼 중첩 루프
O(n!)  
   

 

시간복잡도 계산법

**계산법**

for(let i=0; i < n; i++) {  // 이 때 실제로 로직은 n번 실행되지만, 조건의 검증을 위한 마지막 i == n 인 경우 까지 포함하여, **(n + 1)** 회로 간주한다.
    if(...) ~ // 해당 영역은 위 조건에 부합하는 프로세스만 실행 되므로 n 회이다.

    for(let j=0; j < i ; j ++) { // {i 루프 횟수 (n)} * {j 루프 최대 가능 횟수 n (i == n)  + 마지막 검증 단계 + 1} ==> **최종 n * (n + 1)**
         ... // n * n
    } 
}

시간 복잡도의 계산은 모든 행의 복잡도를 더한 값에서 최고 차항의 계수를 지운 값을 나타낸다.

(n + 1) + n + (n * (n+1)) + (n * n) = 2n² + 3n + 1 =

log N 시간복잡도

2개의 자식 노드를 가지는 이진트리를 이용해서 M개의 노드 중 원하는 값의 노드를 찾는다고 해보자. 처음에는 M개의 노드 모두 탐색 대상이지만,
루트 노드에서 M / 2M / 4M / 8 이런식으로 점진적으로 ½로 줄어들게 된다.

만약, 탐색을 해야하는 자료의 수가 2ⁿ 개라면, 이진 트리를 사용할 경우 n 번의 탐색을 통해서 원하는 값을 찾을 수 있다. 이를 수식으로 나타내면,

$log_2(2^n) = n$ 이다.

이를 일반화하면, 각 노드의 자식 노드가 M개인 트리에서, N개의 자료 중 원하는 자료를 탐색하는 알고리즘의 시간 복잡도는

$log_m n 이다.

공간복잡도

정의

문제를 해결할 때 필요한 공간적인 자원, 필요로 하는 메모리양에 대한 지표