시간 복잡도( Time Complexity )란?

 

  • 시간 복잡도란 입력 크기에 대해 알고리즘이 실행되는데 걸리는 시간이며 주요 로직의 반복 횟수를 중점으로 측정됩니다. 컴퓨터마다 사양이 다르기 때문에 시간으로만 성능을 표현하기가 애매할 수 있습니다. 그렇기 떄문에 시간 복잡도는 알고리즘의 성능을 표현할 때 유용합니다. 하지만, 시간 복잡도 또한 알고리즘의 성능을 완벽하게 표현할 수 없기 때문에 직접적으로 알고리즘 수행 시간이 얼마나 소요되는지 테스트 하는 것이 좋을 때도 있습니다.




Big-O 표기법( Big-O notation )

 

  • Big-O 표기법( Bit-O notation )이란 복잡도에 가장 영향을 많이 끼치는 항의 상수 인자를 빼고 나머지 항을 없애서 복잡도를 나타내는 표기법입니다.




Big-O 표기법 예시

 

for(int i = 0; i < 10; ++i){
    for(int j = 0; j < n; ++j){
        for(int k = 0; k < n; ++k){
            std::cout << i << j << k;
        }
    }
}

 

  • 위 코드의 시간 복잡도는 10n^2 + n 입니다. 해당 시간 복잡도를 Big-O 표기법으로 순서대로 바꾼다면 가장 영향을 많이 끼치는 항의 상수를 제거하였을 때 n^2 + n 이고 나머지 항을 제거한다면 n^2 입니다. 즉, 위 코드는 Big(n^2)으로 표현할 수 있습니다.

 

  • 가장 많이 영향을 끼치는 항이란 입력값이 커짐에 따라 소요시간이 가파르게 증가하는 항을 말합니다.




Big-O Complexity Chart

 

null




'알고리즘 & 자료구조' 카테고리의 다른 글

누적합( prefix sum )이란?  (0) 2023.01.28
공간 복잡도( Space Complexity )란?  (0) 2023.01.28
C++에서 split 구현  (0) 2023.01.28
LockFree Queue 구현 방법  (0) 2023.01.24
LockFree Stack 구현 방법  (0) 2023.01.24

STL ( Standard Template Library ) 컨테이너

  • STL 컨테이너 종류로는 시퀀스 컨테이너, 어댑터 컨테이너, 연관 컨테이너가 있습니다.




시퀀스 컨테이너

list

  • list 는 이중 링크드 리스트로 구현된 컨테이너입니다.

 

장점

  • 정렬이 가능합니다.
  • 중간에 데이터를 삽입하거나 삭제할 때 새롭게 연결만 해주면 되기 때문에 오버헤드가 적습니다.
  • 저장할 요소의 개수를 미리 알 수 없을 때 사용하기에 적합합니다.

 

단점

  • 랜덤 액세스가 불가능합니다.
  • 순회할 때 스페이셜 로컬리티의 이점을 얻을 수 없습니다.

 

사용하기 적합한 경우

  • 저장한 요소의 개수가 빈번하게 변화할 때
  • 삽입, 삭제가 빈번하게 발생될 떄
  • 랜덤 액세스가 필요하지 않을 때



vector

  • vector 는 배열로 구현된 컨테이너입니다.
  • 저장할 요소의 개수가 최대 크기를 넘어설 경우 현재 크기의 *2 만큼의 배열을 새로 확보한다.

 

장점

  • 정렬이 가능합니다.
  • 인덱스를 이용한 랜덤 액세스가 가능합니다.
  • 순회할 때 스페이셜 로컬리티의 이점을 얻을 수 있습니다.

 

단점

  • 중간에 데이터를 삽입하거나 삭제할 때 복사 오버헤드가 발생합니다.
  • 저장할 요소의 개수가 현재 컨테이너 크기보다 클 경우 새롭게 메모리를 확보하고 복사하는 오버헤드가 발생합니다.

 

사용하기 적합한 경우

  • 저장할 요소의 개수가 일정할 때
  • index를 이용한 랜덤 액세스가 필요할 때
  • 잦은 순회가 필요할 때




어댑터 컨테이너

stack

  • LIFO ( Last in first out ) 의 특징을 가진 컨테이너입니다.



queue

  • FIFO ( First in first out ) 의 특징을 가진 컨테이너입니다.



priority_queue

  • 힙 자료구조의 컨테이너입니다.




연관 컨테이너

map, set

  • 자가 균형 이진 탐색트리인 레드-블랙 트리로 구현된 컨테이너입니다.
  • key, value 를 한 쌍으로 저장하는 컨테이너입니다.
  • multimap, multiset 을 이용하면 중복 key 저장이 가능합니다.

 

장점

  • key를 기준으로 정렬이 가능합니다.
  • 랜더 액세스가 가능합니다.

 

단점

  • 시간 복잡도가 O(log N) 으로서 저장하는 데이터가 많아질 수록 검색 성능이 떨어집니다.

 

사용하기 적합한 경우

  • key를 이용한 랜덤 액세스가 필요할 때
  • key를 기준으로 정렬이 필요할 때



unordered_map, unordered_set

  • 해쉬 테이블로 구현된 컨테이너입니다.
  • key, value 를 한 쌍으로 저장하는 컨테이너입니다.
  • unordered_multimap, unordered_multiset 을 이용하면 중복 key 저장이 가능합니다.

 

장점

  • key 해쉬를 이용한 랜덤 액세스가 가능하기 때문에 저장할 요소의 개수의 상관없이 일정한 검색 시간 복잡도를 가집니다.

 

단점

  • 정렬이 불가능합니다.
  • 저장할 요소의 개수가 적다면은 오히려 해쉬 함수로 인해 성능이 떨어질 수 있습니다.
  • 해쉬 충돌이 발생될 경우 그만큼 검색 시간 복잡도가 증가합니다.

 

사용하기 적합한 경우

  • key를 이용한 랜덤 액세스가 필요할 때
  • 정렬이 필요하지 않을 때
  • 많은 양의 데이터를 저장해야 할 때
  • 많은 양의 데이터를 저장해도 일정한 검색 시간 복잡도를 원할 때




STL 컨테이너 비교

컨테이너 자료구조 검색 시간 복잡도 랜던 액세스 정렬
list 이중 링크드 리스트 O ( N ) X O
vector 배열 O ( 1 ) O O
map, set 레드-블랙 트리 O ( log N ) O O
unordered_map, unordered_set 해쉬 테이블 O ( 1 ) O X

+ Recent posts