시간복잡도
기본 정보
개요
시간 복잡도(Time Complexity)는 입력 데이터의 크기(N)가 증가할 때 알고리즘의 실행 시간이 얼마나 증가하는지를 나타내는 척도이다.
실제 실행 시간을 측정하는 것이 아니라, 연산 횟수가 얼마나 증가하는지를 수학적으로 표현한다.
예를 들어 데이터가 10개일 때 1초가 걸리고, 100개일 때 100초가 걸린다면 효율이 좋지 않은 알고리즘일 가능성이 높다.
왜 중요한가?
데이터가 적을 때는 차이가 크지 않지만, 데이터가 많아질수록 성능 차이가 매우 커진다.
예시
N = 1,000,000
O(N) → 약 1,000,000회
O(N²) → 약 1,000,000,000,000회
같은 데이터를 처리해도 연산량 차이가 엄청나게 발생한다.
Big-O 표기법
시간 복잡도는 일반적으로 Big-O 표기법을 사용한다.
O(1)
O(log N)
O(N)
O(N log N)
O(N²)
O(2^N)
O(N!)
O(1) - 상수 시간
입력 크기와 상관없이 항상 같은 시간이 걸린다.
const arr = [1,2,3,4,5];
console.log(arr[0]);
배열 첫 번째 요소 접근
N=10
N=1,000,000
모두 동일
가장 이상적인 성능이다.
O(log N) - 로그 시간
데이터를 절반씩 줄여가며 탐색한다.
대표 예시
- 이진 탐색(Binary Search)
100개
↓
50개
↓
25개
↓
12개
↓
6개
O(N) - 선형 시간
데이터 개수만큼 반복한다.
for(let i=0; i<n; i++){
}
예시
N=10
→ 10번
N=100
→ 100번
O(N log N)
정렬 알고리즘에서 자주 등장한다.
대표 예시
- Merge Sort
- Quick Sort(평균)
- Heap Sort
1,000개 데이터
↓
약 10,000회 연산
O(N²)
이중 반복문
for(let i=0;i<n;i++){
for(let j=0;j<n;j++){
}
}
예시
N=100
↓
10,000회
데이터가 커질수록 급격히 느려진다.
O(2^N)
모든 경우를 탐색하는 경우
예시
- 완전 탐색
- 백트래킹 일부
N=20
↓
1,048,576
O(N!)
순열(Permutation)
5!
=
120
10!
=
3,628,800
매우 비효율적이다.
시간 복잡도 비교
좋음
O(1)
↓
O(log N)
↓
O(N)
↓
O(N log N)
↓
O(N²)
↓
O(2^N)
↓
O(N!)
나쁨
배열(Array)
| 작업 | 시간 복잡도 |
|---|---|
| 접근 | O(1) |
| 검색 | O(N) |
| 추가(끝) | O(1) |
| 삭제(끝) | O(1) |
| 추가(중간) | O(N) |
| 삭제(중간) | O(N) |
연결 리스트(Linked List)
| 작업 | 시간 복잡도 |
| -- | ------ |
| 접근 | O(N) |
| 검색 | O(N) |
| 삽입 | O(1) |
| 삭제 | O(1) |
해시 테이블(Hash Table)
| 작업 | 시간 복잡도 |
| -- | ------ |
| 검색 | O(1) |
| 삽입 | O(1) |
| 삭제 | O(1) |
평균 기준이다.
대표 정렬 알고리즘
| 알고리즘 | 시간 복잡도 |
|---|---|
| Bubble Sort | O(N²) |
| Selection Sort | O(N²) |
| Insertion Sort | O(N²) |
| Merge Sort | O(N log N) |
| Quick Sort | O(N log N) 평균 |
| Heap Sort | O(N log N) |
예제 비교
비효율적
for(let i=0;i<n;i++){
for(let j=0;j<n;j++){
}
}
O(N²)
개선
for(let i=0;i<n;i++){
}
O(N)
실무에서 중요한가?
웹 개발에서는 직접 알고리즘을 작성하는 경우보다
- 대량 데이터 처리
- 검색 기능
- 통계 기능
- 로그 분석
- AI 데이터 처리
에서 중요성이 커진다.
예를 들어 회원 100명일 때는 문제가 없지만,
100명
↓
10만명
↓
100만명
으로 증가하면 성능 차이가 크게 발생한다.
실무 메모
실무에서는 다음과 같은 방식이 권장된다.
- 중첩 반복문 최소화
- HashMap 적극 활용
- DB 인덱스 활용
- 정렬은 내장 함수 우선 사용
- 검색은 Binary Search 고려
- 캐싱(Cache) 활용
- 불필요한 반복 제거
- Big-O를 기준으로 설계 검토
- 성능 측정은 실제 데이터로 진행
- 공간 복잡도와 함께 고려
시간 복잡도와 함께 사용하는 기술
대표 면접 질문
- O(1)과 O(N)의 차이는?
- HashMap 검색 속도는?
- Quick Sort 평균 시간 복잡도는?
- Binary Search 조건은?
- Array와 Linked List 차이는?
- N² 알고리즘을 개선하는 방법은?
관련 문서
출처
- Algorithm Analysis 이론
- CLRS (Introduction to Algorithms)
- GeeksForGeeks