CS/자료구조

[자료구조]복잡도 - 시간 복잡도, 빅오 표기법, 공간 복잡도

개발의 피 2023. 12. 6. 15:46

면접을 위한 CS 전공지식 노트 (주홍철, 길벗) : 233p ~ 237p

 

1. 자료구조 

- 자료구조(data structure) : 효율적으로 데이터를 관리하고 수정, 삭제, 탐색, 저장할 수 있는 데이터 집합

- C++ : STL을 기반으로 전반적인 자료 구조를 가장 잘 설명할 수 있는 언어

- STL(Standard Template Library) : C++의 표준 템플릿 라이브러리, 스택/배열 등 데이터 구조의 함수 등을 제공하는 라이브러리의 묶음 

 

2. 복잡도 : 시간 복잡도와 공간 복잡도로 나뉨

1) 시간 복잡도

① C++의 기본 

- main 함수를 중심으로 돌아감 -> main 함수를 무조건 하나 만들어야 함

- 이후 컴파일이 시작되면 전역변수 초기화, 라이브러리 import 등의 작업 .. -> main 함수에 얽혀 있는 함수들 작동 -> main 함수가 0을 리턴하며 프로세스가 종료 

#include <bits/stdc++.h> // 모든 표준 라이브러리가 포함된 헤더

using namespace std; // 네임 스페이스 : 같은 클래스 이름 구별, 모듈화에 쓰이는 이름 

string a = 0; // a : lvalue(추후 다시 사용될 수 있는 변수), rvalue : 한 번 쓰고 다시 사용되지 않는 변수 

int main()
{
	cin >> a;
    cout << a << "\n";
    
    return 0; // 프로세스가 정상적으로 마무리됨을 뜻함
}

 

② 빅오 표기법

- 시간 복잡도 : 문제를 해결하는 데 걸리는 시간과 입력의 함수 관계

-> 어떠한 알고리즘의 로직이 얼마나 오랜 시간이 걸리는지를 나타나는 데 쓰이며, 보통 빅오 표기법으로 나타냄

- 빅오 표기법 : 입력 범위 n을 기준으로 해서 로직이 몇 번 반복되는지 나타내는 것, '가장 영향을 많이 끼치는' 항의 상수 인자를 빼고 나머지 항을 없앰 (입력 크기가 커질수록 연산량이 가장 많이 커지는 항 : n의 제곱항, 다른 것은 그에 비비 미미하기 때문에 n의 제곱항만 신경 쓰면 됨)

 

ex. 입력 크기 n의 모든 입력에 대한 알고리즘에 대한 필요한 시간 : 10n^2 + 2 = 빅오 표기법 : O(n^2)

for (int i = 0; i < 10; i++) { // i 루프 :10회
	for (int j = 0; j < n; j++) { // j 루프 : n번 
    		for (int k = 0; k < n; k++) { // k루프 : n번
        		if (true) cout << k << '\n';
        }
    }
} // -> 10 x n x n = 10n^2

for (int i = 0; i < n; i++) { // i 루프 : n번
	if (true) cout << i << '\n';
} // n

// 10n^2 + n
// 빅오표기법 : 상수계수, 낮은 차수 항 무시 -> O(n^2)

 

③ 시간 복잡도의 존재 이유 : 효율적인 코드로 개선하는 데 쓰이는 척도

 

ex. 버튼을 누르고 화면이 나타나는 로직

원래 : O(n^2)의 시간 복잡도를 가지고, 9초가 걸림

O(n)의 시간 복잡도를 가지는 알고리즘으로 개선 -> 3초가 걸림

 

④ 시간 복잡도의 속도 비교 

출처 : 위키피디아 - Time Complexity (https://en.wikipedia.org/wiki/Time_complexity#/media/File:Comparison_computational_complexity.svg)

-> O(n^2)보다는 O(n), O(n)보다는 O(1)을 지향해야 함

 

2) 공간 복잡도

- 공간 복잡도 : 프로그램을 실행시켰을 때 필요로 하는 자원 공간의 양

정적 변수로 선언된 것 말고도 동적으로 재귀적인 함수로 인해 공간을 계속해서 필요로 할 경우도 포함

int a[1004]; // a 배열 : 1004 x 4바이트(int형)의 크기를 가짐

 

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

보통 시간 복잡도를 생각할 때 평균, 최악의 시간 복잡도를 고려하면서 씀 

 

평균 시간 복잡도

자료 구조 접근 탐색 삽입 삭제
배열(array) O(1) O(n) O(1) O(n)
스택(stack) O(n) O(n) O(1) O(1)
큐(queue) O(n) O(n) O(1) O(1)
이중 연결 리스(doubly 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)
이중 연결 리스(doubly linked list) O(n) O(n) O(1) O(n)
해시 테이블(hash table) O(n) O(n) O(n) O(n)
이진 탐색 트리(BST) O(n) O(n) O(n) O(n)
AVL 트리 O(longn) O(longn) O(longn) O(longn)
레드 블랙 트리  O(longn) O(longn) O(longn) O(longn)