티스토리 뷰

CS/자료구조

복잡도

longbeom 2022. 9. 25. 17:06

복잡도

시간 복잡도와 공간 복잡도로 나뉜다.

 

빅오 표기법

시간 복잡도란 '문제를 해결하는 데 걸리는 시간과 입력의 함수 관계'를 가리킨다.

알고리즘의 로직이 '얼마나 오랜 시간'이 걸리는지를 나타내는 데 쓰이며, 보통 빅오 표기법으로 나타낸다.

다음 코드는 '입력 크기 n'의 모든 입력에 대한 알고리즘에 필요한 시간이 10n^2 + n이라고 했을 때의 내용이다.

for (int i = 0; i < 10; i++) {
  for (int j = 0; j < n; j++) {
    for (int k = 0; k < n; k++) {
      if (true) cout << k << '\n';
    }
  }
}

for (int i = 0; i < n; i++) {
  if (true) cout << i << '\n';
}

빅오 표기법이란 입력 범위 n을 기준으로 로직이 몇 번 반복되는지 나타내는 것인데, 코드의 시간 복잡도를 빅오 표기법으로 나타내면 O(n^2) 이 된다.

'가장 영향을 많이 끼치는'항의 상수 인자를 빼고 나머지 항을 없앤 것이다. 다른 항들이 신경쓰일 수 있겠지만 증가 속도를 고려한다면 그렇지 않다. 입력 크기가 커질수록 연산량이 가장 많이 커지는 항은 n의 제곱항이고, 다른 것은 그에 비해 미미하기 때문에 이것만 신경쓰면 된다는 이론.

 

시간 복잡도의 존재 이유와 속도

시간 복잡도는 효율적인 코드로 개선하는 데 쓰이는 척도가 된다.

시간 복잡도가 O(n^2), O(n), O(1) 이 있을 때, 입력 크기가 커질 수록 O(1)과 O(n)의 시간 차이가 많이 나게 된다.

O(n^2)은 더 심한 차이가 나기 때문에 O(n^2) 보다는 O(n), O(n) 보다는 O(1)을 지향해야 한다.

 

공간 복잡도

프로그램을 실행 시켰을 때 필요로 하는 자원 공간의 양을 말한다. 정적 변수로 선언된 것 말고도 동적으로 재귀적인 함수로 인해 공간을 계속해서 필요로 할 경우도 포함한다.

int a[1004];

위와 같은 배열이 있다고 하면 a 배열은 1004 X 4 바이트의 크기를 가지게 되는데 이런 공간을 의미한다.

 

자료 구조에서의 시간 복잡도

자료 구조를 쓸 때는 시간 복잡도를 잘 생각해야 한다.

 

자료 구조의 평균 시간 복잡도

자료 구조 접근 탐색 삽입 삭제
배열 (array) O(1) O(n) O(n) O(n)
스택 (stack) O(n) O(n) O(1) O(1)
큐 (queue) O(n) O(n) O(1) O(1)
이중 연결 리스트
(double linked list)
O(n) O(n) O(1) O(1)
해시 테이블 (hash table) O(1) O(1) O(1) O(1)
이진 탐색 트리 (BST) O(logn) O(logn) O(logn) O(logn)
AVL 트리 O(logn) O(logn) O(logn) O(logn)
레드 블랙 트리 O(logn) O(logn) O(logn) O(logn)

 

자료 구조 최악의 시간 복잡도

자료 구조 접근 탐색 삽입 삭제
배열 (array) O(1) O(n) O(n) O(n)
스택 (stack) O(n) O(n) O(1) O(1)
큐 (queue) O(n) O(n) O(1) O(1)
이중 연결 리스트
(double linked list)
O(n) O(n) O(1) O(1)
해시 테이블 (hash table) O(n) O(n) O(n) O(n)
이진 탐색 트리 (BST) O(n) O(n) O(n) O(n)
AVL 트리 O(logn) O(logn) O(logn) O(logn)
레드 블랙 트리 O(logn) O(logn) O(logn) O(logn)

 

 

Reference

'CS > 자료구조' 카테고리의 다른 글

비선형 자료 구조(1)  (0) 2022.09.26
선형 자료 구조  (0) 2022.09.26