1. 알고리즘 복잡도(Algorithm Complexity)의 개요
정의: 알고리즘을 실행하는 데 필요한 자원(시간, 공간)의 양을 나타내는 척도입니다.
분류:
시간 복잡도 (Time Complexity): 알고리즘의 실행 속도(연산 횟수)를 측정.
공간 복잡도 (Space Complexity): 알고리즘 실행 시 필요한 메모리 공간을 측정.
평가 기준: 입력 데이터의 크기($n$)가 증가함에 따라 자원 소모량이 어떻게 변하는지를 분석합니다.
2. 성능 표기를 위한 Big-O Notation(빅오 표기법)의 개념
가. 개념
알고리즘의 실행 시간 중 가장 큰 영향을 주는 항만을 남겨서 **상한선(Upper Bound)**을 나타내는 점근적 표기법입니다.
최악의 경우(Worst Case)를 고려하여 성능을 보장하므로, 시스템 설계 시 안정성 판단의 근거가 됩니다.
나. 특징
상수항 무시: $O(2n)$은 $O(n)$으로 표기.
영향력 적은 항 무시: $O(n^2 + n)$은 $O(n^2)$으로 표기.
3. 빅오 표기법의 주요 유형 및 특성
입력 크기 $n$에 따른 성능 차이를 기준으로 분류합니다.
| 유형 | 명칭 | 설명 및 사례 | 성능 |
| $O(1)$ | Constant | 입력 크기와 상관없이 일정한 시간 소요 (예: 배열의 인덱스 참조) | 최상 |
| $O(\log n)$ | Logarithmic | 연산마다 탐색 범위가 절반으로 줄어듦 (예: 이진 탐색) | 우수 |
| $O(n)$ | Linear | 입력 크기에 비례하여 시간 소요 (예: 순차 탐색, for문 1개) | 양호 |
| $O(n \log n)$ | Linear-Logarithmic | 효율적인 정렬 알고리즘에서 발생 (예: 퀵 정렬, 병합 정렬) | 보통 |
| $O(n^2)$ | Quadratic | 이중 루프 구조에서 발생 (예: 버블 정렬, 삽입 정렬) | 나쁨 |
| $O(2^n)$ | Exponential | 지수적 증가, 재귀 호출이 비효율적일 때 발생 (예: 피보나치 수열) | 최악 |
4. 유형별 연산 시간의 차이 분석
입력값($n$)이 커질수록 각 복잡도 간의 처리 시간 격차는 기하급수적으로 벌어집니다.
| n (데이터 수) | O(logn) | O(n) | O(n2) | O(2n) |
| 10 | 3.3 | 10 | 100 | 1,024 |
| 100 | 6.6 | 100 | 10,000 | $1.26 \times 10^{30}$ |
| 1,000 | 10 | 1,000 | 1,000,000 | 측정 불가 (무한대급) |
분석 결과: 데이터 양이 많아질수록 $O(n^2)$ 이상의 알고리즘은 실무 적용이 불가능하며, 분할 정복(Divide & Conquer) 등을 통해 $O(n \log n)$ 이하로 낮추는 튜닝이 필수적입니다.
5. 기술사적 제언: 알고리즘 설계 시 고려사항
Time-Space Trade-off: 시간 복잡도를 줄이기 위해 메모리(공간 복잡도)를 더 사용하는 전략(예: 다이나믹 프로그래밍, 해시 테이블)을 상황에 맞게 선택해야 합니다.
평균 vs 최악의 경우: 실무에서는 Big-O(최악) 외에도 평균적인 성능인 Big-$\theta$(세타) 표기법을 함께 검토하여 실제 운영 환경의 성능을 예측해야 합니다.
데이터 규모에 따른 선택: 데이터 양이 적을 때는 구현이 단순한 $O(n^2)$ 알고리즘이 유리할 수 있으나, 빅데이터 환경에서는 $O(n \log n)$ 이하의 알고리즘 선택이 시스템의 생존을 결정합니다.
댓글 없음:
댓글 쓰기