
시간 복잡도(Time Complexity)는 알고리즘의 성능을 평가하기 위한 중요한 지표로, 입력 크기와 실행 시간 간의 관계를 나타냅니다. 프로그램이 실행되는 데 걸리는 시간을 이론적으로 분석하여 성능을 비교하고 최적화할 수 있도록 돕습니다.
시간 복잡도는 알고리즘이 특정 입력 크기에서 얼마나 많은 연산을 수행하는지를 나타냅니다. 이를 통해 입력 크기가 커질수록 알고리즘이 얼마나 효율적으로 동작하는지 평가할 수 있습니다.
Big-O 표기법은 시간 복잡도를 수학적으로 나타내는 표기법입니다. 알고리즘의 성능을 표현할 때 가장 최악의 경우를 기준으로 계산합니다.
| Big-O 표기 | 의미 | 예시 알고리즘 |
|---|---|---|
| 𝑂(1) | 상수 시간: 입력 크기에 상관없이 일정 | 배열에서 첫 번째 원소에 접근하기 |
| 𝑂(log𝑛) | 로그 시간: 입력 크기의 로그에 비례 | 이진 탐색 |
| 𝑂(𝑛) | 선형 시간: 입력 크기에 비례 | 배열에서 특정 값을 찾는 순차 탐색 |
| 𝑂(𝑛log𝑛) | 로그 선형: 입력 크기와 로그의 곱에 비례 | 병합 정렬, 퀵 정렬 |
| 𝑂(𝑛2) | 이차 시간: 중첩 반복문 사용 | 버블 정렬, 선택 정렬 |
| 𝑂(2𝑛) | 지수 시간: 크기가 늘어날수록 기하급수적으로 증가 | 피보나치 수열 재귀 구현 |
다음 코드에서 시간 복잡도를 분석해 보겠습니다.
// 배열의 합 계산
int sum = 0;
for (int i = 0; i < n; i++) {
sum += array[i];
}
// 2중 반복문
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println(i + ", " + j);
}
}
알고리즘을 작성할 때 시간 복잡도를 줄이기 위한 코드를 작성해야 합니다. 예를 들어, 반복문을 줄이거나 동적 프로그래밍(DP)을 활용하면 효율성을 크게 향상시킬 수 있습니다.
선형 탐색 vs 이진 탐색 비교
| 알고리즘 | 시간 복잡도 | 입력 크기 (n) | 최대 연산 횟수 |
|---|---|---|---|
| 선형 탐색 | 𝑂(𝑛) | 1,000,000 | 1,000,000 번 |
| 이진 탐색 | 𝑂(log𝑛) | 1,000,000 | 20 번 |