알고리즘을 설계하고 구현할 때는 이러한 복잡도를 최소화하려고 노력해야 한다. 그 이유는 시간 복잡도가 높은 알고리즘은 실행 시간이 길어져 사용자에게 대기 시간을 늘리며, 공간 복잡도가 높은 알고리즘은 많은 메모리를 사용하여 시스템의 다른 부분이 필요로 하는 메모리를 줄인다. 따라서, 알고리즘의 복잡도는 그 알고리즘의 효율성과 성능에 직접적인 영향을 미치며, 좋은 알고리즘은 동시에 시간 복잡도와 공간 복잡도를 최소화하려고 노력한다.
예를들어, 정수의 절댓값을 구할 때, 문제를 푸는 알고리즘이 다양할 수 있다.
다양한 알고리즘 중 어느 알고리즘이 더 좋은지를 분석하기 위해, 복잡도를 정의하고 계산한다.
알고리즘 복잡도는 알고리즘이 얼마나 효율적인지를 측정하는 방법이다. 복잡도는 일반적으로 두 가지 주요 유형으로 나뉜다. 시간 복잡도와 공간 복잡도다.
시간 복잡도: 이는 알고리즘이 문제를 해결하는 데 얼마나 많은 시간이 필요한지를 측정한다. 시간 복잡도는 일반적으로 입력 데이터의 크기에 따라 얼마나 많은 단계가 필요한지를 나타낸다. 대표적으로 '빅 오' 표기법(O 표기법)을 사용하여 표현한다. 예를 들어, O(N)은 입력 크기에 선형적으로 비례하는 시간이 걸린다는 것을 의미하고, O(N^2)은 입력 크기의 제곱에 비례하는 시간이 걸린다는 것을 의미한다.
공간 복잡도: 이는 알고리즘이 문제를 해결하는 데 얼마나 많은 메모리 공간이 필요한지를 측정한다. 공간 복잡도는 일반적으로 알고리즘이 실행되는 동안 필요한 메모리 양을 나타낸다.
시간 복잡도가 매우 중요하므로, 꼭 이해하고 계산할 수 있어야 한다.
알고리즘의 시간 복잡도는 알고리즘이 실행되는 동안 수행하는 주요 연산의 수에 크게 의존한다. 이는 일반적으로 다음과 같은 요소들에 의해 결정된다.
이 외에도 다양한 요소들이 알고리즘의 시간 복잡도에 영향을 미칠 수 있다. 따라서 알고리즘을 설계하거나 선택할 때는 해당 알고리즘의 시간 복잡도를 고려하는 것이 중요하다.
Big O 표기법 (O-notation): Big O 표기법은 알고리즘의 최악의 성능을 나타낸다. 알고리즘에 가장 큰 입력 크기를 제공했을 때 알고리즘이 얼마나 많은 작업을 수행할지를 설명한다. 예를 들어, O(n)은 알고리즘이 최악의 경우에 선형 시간을 걸린다는 것을 의미하며, O(n^2)는 알고리즘이 최악의 경우에 제곱 시간을 걸린다는 것을 의미한다.
Omega 표기법 (Ω-notation): Omega 표기법은 알고리즘의 최선의 성능을 나타낸다. 즉, 알고리즘이 가장 적은 작업을 수행할 때의 성능을 설명한다. 예를 들어, Ω(n)은 알고리즘이 최선의 경우에 선형 시간을 걸린다는 것을 의미한다.
Theta 표기법 (θ-notation): Theta 표기법은 알고리즘의 평균 성능을 나타낸다. 알고리즘이 평균적으로 얼마나 많은 작업을 수행할지를 설명한다. Theta 표기법은 일반적으로 Big O 표기법과 Omega 표기법 사이의 상호 작용을 설명하기 위해 사용된다.
입력 n애 따라 결정되는 시간 복잡도 함수
빅 오 표기법(Big O notation)은 알고리즘의 시간 복잡도와 공간 복잡도를 나타내는데 사용되는 수학적 표기법이다. 이 표기법은 입력 데이터의 크기에 따라 알고리즘의 실행 시간이나 메모리 사용량이 어떻게 변화하는지를 간략하게 설명하는 방법을 제공한다. 빅 오 표기법은 알고리즘의 "최악의 경우" 성능을 나타낸다.
다음은 몇 가지 주요 빅 오 표기법의 예이다.
이 외에도 여러 가지 빅 오 표기법이 있으며, 각각 알고리즘의 실행 시간이 어떻게 증가하는지를 설명한다. 이를 통해 우리는 알고리즘의 효율성을 비교하고, 입력 데이터의 크기가 커짐에 따라 어떤 알고리즘이 더 효율적인지 판단할 수 있다.
def sum_all(n):
total = 0
for num in range(1, n+1):
total += num
return total
sum_all(100) # 5050
n의 개수에 따라서, 반복문이 n번 수행되므로, 시간 복잡도는 O(n)이다.
def sum_all(n)
return int(n*(n+1)/2)
반복문이 없으므로, 시간 복잡도는 1이므로, 빅오 표기법으로 O(1)이다.