Time Complexity
개요
시간 복잡도는 코드의 실행 시간이 입력값에 따라 어떻게 변하는지를 나타내는 개념입니다. 쉽게 말해, 입력이 커지면 코드가 얼마나 느려지는지를 나타내는 것입니다.
Big-O 표기법
어떤 코드에서 입력값
간단하게 기억하는 법
시간 복잡도를 나타낼 때에는 일반적으로
- 에라토스테네스의 체:
- 벨만-포드:
기타 점근 표기법
Big-O 표기법 외에도 여러가지 표기법이 있습니다.
| 표기법 | 설명 |
|---|---|
— 상수 시간
입력 크기에 관계없이 항상 일정한 시간만 걸리는 경우.
예:
- 배열의 인덱싱
- 해시를 이용한 집합과 맵에서 삽입/제거/검색
- 간단한 사칙연산
— 로그 시간
입력이 커져도 실행 시간이 아주 조금씩 커지는 경우.
예:
- 이분 탐색
- 힙에서 삽입/제거
- 이진 탐색 트리에서 삽입/제거/검색
일반적으로
— 선형 시간
코드의 실행 시간이 입력값에 정비례하는 경우.
예:
- 누적 합
- KMP
- 배열 내에서 원소 검색
— 선형 로그 시간
선형 시간보다 조금 더 느린 경우.
예:
- 병합 정렬, 퀵 정렬
- 볼록 껍질
- 최소 스패닝 트리
— 이차 시간
입력값이 커지면 연산 횟수가 제곱으로 증가하는 경우.
예:
- 버블 정렬, 선택 정렬, 삽입 정렬
- LIS(다이나믹 프로그래밍)
— 삼차 시간
입력값이 커지면 연산 횟수가 세제곱으로 증가하는 경우.
예:
- 플로이드-워셜
— 지수 시간
입력값이 커지면 연산 횟수가 기하급수적으로 증가하는 경우.
예:
- 모든 부분집합 구하기
- 부분 집합 백트래킹
— 계승 시간
코드의 실행 시간이 입력값의 계승에 비례하는 경우.
예:
- 순열, 조합 구하기
실제 시간
시간 복잡도를 알고 있으면 코드의 실제 실행 시간도 대략 예측할 수 있습니다. 보통 시간 복잡도의 변수에 수를 넣었을 때 값의
예를 들어 시간 복잡도
백준의 문제들에는 시간 제한이 있으므로 코드의 시간 복잡도를 계산하여 제한 시간 내에 통과할 수 있는지 판단하는 것이 중요합니다.