복잡도는 알고리즘이나 데이터 구조의 성능을 분석하거나 비교하는 방법입니다.
주로 시간 복잡도와 공간 복잡도 두 가지를 고려합니다.
1. 시간 복잡도(Time Complexity): 이는 알고리즘이 문제를 해결하는 데 필요한 시간을 의미합니다. 보통 입력의 크기에 따라 얼마나 많은 계산이 필요한지를 측정합니다. 예를 들어, 배열에서 최대값을 찾는 알고리즘의 경우, 배열의 모든 요소를 검사해야 하므로 시간 복잡도는 O(n)이 됩니다. 여기서 n은 배열의 크기입니다.
2. 공간 복잡도(Space Complexity): 이는 알고리즘이 문제를 해결하는 데 필요한 메모리 사용량을 의미합니다. 예를 들어, 재귀 함수는 호출될 때마다 스택에 데이터를 저장하므로 공간 복잡도가 증가합니다.
빅 오 표기법(Big O notation)은 알고리즘의 성능을 나타내는 방법으로 가장 일반적으로 사용됩니다. 그 외도 Ω (Big Omega)와 θ (Big Theta) 등 다른 표기법들이 있지만, 대부분의 경우 빅 오 표기법이 가장 유용하게 사용됩니다.
빅 오 표기법은 입력값이 커질 때 알고리즘이 어떻게 동작할 것인지 상한선(upper bound)을 제공하여 나타냅니다. 아래에 몇 가지 주요 빅 오 클래스들과 그들의 예시를 보여드립니다:
- O(1): 상수 시간(Constant time). 입력 데이터량과 관계없이 항상 일정한 시간이 걸립니다.
- 예: 배열에서 원소 하나 접근하기
- O(log n): 로그 시간(Logarithmic time). 데이터양이 많아져도, 그에 비례해서 시간이 아주 조금씩만 증가합니다.
- 예: 이진 검색(Binary Search)
- O(n): 선형 시간(Linear time). 입력 데이터량과 처리시간이 직접적으로 비례합니다.
- 예: 단순 검색(Simple Search), 최대/최소값 찾기
- O(n log n): 로그 선형시간 or 리니어 로그타임(Linear Logarithmic time). 정렬 알고리즘에서 자주 보게 됩니다.
- 예: 퀵 정렬(Quick Sort), 병합 정렬(Merge Sort)
- O(n^2), O(n^3), ..., O(n^k): 다항식 시간(Polynomial time). 입력값 n에 대해 k차 다항식으로 계산시 각각 이런 형태를 보입니다.
- 예: 버블 정렬(Bubble Sort), 선택 정렬(Selection Sort)
- O(2^n), O(n!): 지수시 각각(Exponential time). 가능한 모든 결과를 탐색해야 할 때 나타납니다.
- 예: 외판원 문제의 브루트 포스 해결법, 모든 순열 찾기
복잡도 분석은 알고리즘의 효율성을 이해하고, 어떤 알고리즘이 다른 것보다 선호되는 이유를 설명하는 데 중요한 도구입니다. 그러나 실제 세계에서는 상수 시간이나 로우-레벨 최적화도 중요할 수 있으므로, 복잡성만으로 알고리즘의 성능을 완전히 판단하지는 않습니다. 실제 환경에서의 실행 시간, 구현의 복잡성 등도 고려되어야 합니다.
그렇다면 알고리즘의 복잡도가 높다면 항상 좋지 않은 건가요?
알고리즘의 복잡도가 높다는 것은 일반적으로 해당 알고리즘이 더 많은 시간이나 공간(메모리)을 필요로 한다는 것을 의미합니다. 따라서, 이론적인 관점에서 보면 복잡도가 낮은 알고리즘이 더 효율적인 것으로 간주됩니다.
그러나 실제 상황에서는 다양한 요소들이 고려되어야 합니다. 예를 들어, 아래와 같은 상황들이 있습니다:
1. 데이터의 크기:
만약 처리해야 할 데이터의 양이 작다면, 복잡도가 높더라도 실제 실행 시간에 큰 차이가 없을 수 있습니다.
2. 상수 요인:
때때로 복잡성이 낮지만 상수 요인(constant factor) 때문에 실제 실행 시간에 큰 차이가 없을 수 있습니다. 예를 들어, O(n)과 O(2n)은 모두 선형 시간입니다. 하지만 전자는 후자보다 상수 요인이 작아서 일반적으로 성능 면에서 우수하다고 간주됩니다.
3. 문제의 특성:
어떤 문제는 특정한 종류의 알고리즘이 다른 알고리즘보다 적합할 수 있습니다. 예를 들어, 정렬 문제에서 퀵 정렬과 합병 정렬은 모두 O(n log n)의 평균 시간 복잡도를 가지지만, 입력 데이터가 이미 거의 정렬된 경우에는 삽입 정렬(O(n^2))보다 더 효율적일 수 있습니다.
4. 자원 제약:
실행 환경에서 사용 가능한 자원(시스템 메모리, 프로세서 속도 등)에 따라 알고리즘 선택에 영향을 줄 수 있습니다. 만약 메모리 제한이 있는 경우, 공간 복잡도가 낮은 알고리즘이 선호될 수 있습니다.
따라서 알고리즘 선택은 단순히 복잡도만 고려하는 것보다 여러 가지 요소들을 종합적으로 고려하여 판단해야 합니다. 최선의 선택은 주어진 문제와 환경에 맞추어 최적화된 결과를 제공하는 알고리즘이 됩니다.
'개발일지 > 기타' 카테고리의 다른 글
Git - Divergent branches (0) | 2023.12.09 |
---|---|
웹서버만들기(1) (4) | 2023.11.17 |
반복문과 재귀함수 (0) | 2023.10.21 |
배열, 문자열에 대해 알아보자 (0) | 2023.10.21 |
hello, world (0) | 2023.10.14 |