빅오 표기법(Big O notation)은 알고리즘의 성능을 표기하고 비교하기 위한 수학적인 표기법입니다. 알고리즘의 시간 복잡도(time complexity)를 표현하는 데 주로 사용됩니다. 빅오 표기법은 알고리즘의 실행 시간이 입력 크기에 어떻게 비례하는지를 나타냅니다.
빅오 표기법은 주어진 알고리즘의 최악의 경우(time complexity in worst-case)를 나타냅니다. 알고리즘의 최악의 경우 시간 복잡도는 입력 크기에 대한 상한을 제공합니다. 이를 통해 알고리즘의 성능을 예측하고 비교할 수 있습니다.
빅오 표기법은 함수로 표현되며, 주로 다음과 같은 형식으로 표기됩니다:
O(f(n))
여기서 f(n)은 입력 크기 n에 대한 함수입니다. 빅오 표기법에서는 상수 항이나 낮은 차수의 항들은 무시됩니다. 대표적인 빅오 표기법의 몇 가지 예시를 살펴보면:
- O(1): 상수 시간 복잡도(constant time complexity). 입력 크기에 상관없이 항상 일정한 실행 시간을 가지는 알고리즘입니다.
- O(log n): 로그 시간 복잡도(logarithmic time complexity). 입력 크기에 대해 로그의 형태로 증가하는 알고리즘입니다. 이러한 알고리즘은 입력 크기가 커져도 상대적으로 빠르게 실행됩니다.
- O(n): 선형 시간 복잡도(linear time complexity). 입력 크기에 정비례하여 실행 시간이 선형적으로 증가하는 알고리즘입니다.
- O(n^2): 이차 시간 복잡도(quadratic time complexity). 입력 크기의 제곱에 비례하여 실행 시간이 증가하는 알고리즘입니다. 중첩된 반복문을 사용하는 경우 주로 발생합니다.
- O(2^n): 지수 시간 복잡도(exponential time complexity). 입력 크기에 대해 2의 지수 함수로 실행 시간이 증가하는 알고리즘입니다. 매우 비효율적인 알고리즘으로, 입력 크기가 조금만 커져도 실행 시간이 급격히 증가합니다.
빅오 표기법을 사용하면 알고리즘의 성능을 간략하게 표현하고, 서로 다른 알고리즘들을 비교하여 효율적인 알고리즘을 선택할 수 있습니다. 일반적으로 빅오 표기법에서 시간 복잡도가 낮은 알고리즘은 입력 크기가 커질 때 실행 시간이 상대적으로 증가하는 속도가 더 낮습니다.
예를 들어, O(n)과 O(n^2)의 알고리즘이 있다고 가정해봅시다. 입력 크기가 작을 때는 두 알고리즘의 실행 시간 차이가 크지 않을 수 있지만, 입력 크기가 커질수록 O(n) 알고리즘이 O(n^2) 알고리즘보다 훨씬 더 효율적입니다. 따라서 대량의 데이터를 처리해야 하는 경우 O(n) 알고리즘이 더 선호됩니다.
빅오 표기법은 알고리즘의 시간 복잡도뿐만 아니라 공간 복잡도(space complexity)에 대해서도 적용할 수 있습니다. 공간 복잡도는 알고리즘이 실행되는 동안 사용되는 메모리 공간의 양을 나타냅니다.
빅오 표기법은 알고리즘의 성능을 예측하고 알고리즘 선택에 도움을 주는 유용한 도구입니다. 그러나 실제 실행 시간에는 다른 요소들도 영향을 미칠 수 있으므로, 빅오 표기법만으로 모든 상황을 완전히 설명하지는 못합니다. 따라서 알고리즘을 평가할 때에는 빅오 표기법 외에도 다른 요소들을 고려해야 합니다.
'JAVA > Algorithm' 카테고리의 다른 글
자바 재귀호출 (0) | 2023.05.30 |
---|---|
더블 링크드 리스트(Doubly Linked List) (0) | 2023.05.25 |
단방향 연결 리스트( Singlely Linked List) (0) | 2023.05.24 |
자바 알고리즘 Queue (0) | 2023.05.17 |
스택(Stack) (0) | 2023.05.16 |