복잡도란 알고리즘의 성능 평가 및 효율성을 나타내는 척도로써, 시간 복잡도와 공간 복잡도로 나눌 수 있다.
- 시간 복잡도 : 얼마나 빠르게 실행되는가?
- 공간 복잡도 : 얼마나 많은 저장 공간이 필요한가?
좋은 알고리즘은 실행 시간이 짧으면서 저장 공간도 적게 쓰는 알고리즘이다!
그러나 둘 다 만족시키기는 아래와 같은 이유로 어려움이 있다.
알고리즘이 실행되는 동안 필요한 추가 메모리의 양을 나타낸 것.
입력 크기와 상관없이 알고리즘이 필요로 하는 메모리의 양을 나타낸 것이다.
n! = 1 x 2 x ... x n
public class FactorialExample {
public static int factorial(int n) {
int fac = 1;
for (int i = 2; i <= n; i++) {
fac = fac * i;
}
return fac;
}
public static void main(String[] args) {
int result = factorial(3);
System.out.println("3! = " + result);
}
}
n! = 1 x 2 x ... x n
public class FactorialExample {
public static int factorial(int n) {
if (n > 1) {
return n * factorial(n - 1);
} else {
return 1;
}
}
public static void main(String[] args) {
int result = factorial(3);
System.out.println(result); // 출력: 6
}
}
factorialRecursive(3)
-> factorialRecursive(2)
-> factorialRecursive(1)n이므로 스택 메모리를 n개 사용알고리즘이 실행되는 동안 수행하는 기본적인 연산 횟수의 총량.
알고리즘의 효율성을 표기해주는 표기법
📌빅오 표기법은 최악의 경우를 고려하므로 프로그램이 실행되는 과정에서 소요되는 최악의 시간까지 고려가능하므로 가장 자주 사용된다.

O(1)는 일정한 복잡도라고하며, 입력값이 증가하더라도 시간이 늘어나지 않는다.

O(n)은 선형 복잡도라고 부르며, 입력값이 증가함에 따라 시간 또한 같은 비율로 증가하는 것을 의미한다.

O(log n)은 로그복잡도라고 부르며, 빅오 표기법 중 O(1) 다음으로 빠진 시간 복잡도를 가진다.

O(n²)는 2차 복잡도라고 부르며, 입력값이 증가함에 따라 시간이 n의 제곱수의 비율로 증가하는 것을 의미한다.

O(2n)은 기하급수적 복잡도라고 부르며, 빅오 표기법중 가장 느린 시간복잡도를 가진다.


| 표기법 | 소개 | 대표 예시 |
|---|---|---|
| O(1) | 입력 크기와 관계없이 항상 일정한 시간이 걸림 | ▪️배열에서 인덱스 접근 ▪️해시테이블에서 키로 값 가져오기 |
| O(n) | 입력 크기만큼 시간이 걸림 | ▪️배열 전체 순회(for) ▪️연결 리스트 탐색 |
| O(log n) | 입력 크기가 커질수록 조금씩만 시간이 늘어남 | ▪️이진 탐색 ▪️균행 이진탐색 트리에서 탐색 |
| O(n²) | 입력이 조금만 커져도 실행시간이 크게 증가 | ▪️버블 정렬 ▪️삽입 정렬 ▪️선택 정렬 |
| O(2ⁿ) | 입력 크기가 조금만 커져도 시간이 폭발적으로 증가 | ▪️부분집합 구하기 ▪️피보나치 수열(재귀) |
| O(n log n) | 효율적인 정렬 알고리즘의 대표적인 시간 복잡도 | ▪️병합 정렬 ▪️퀵 정렬 ▪️힙 정렬(최악은 O(2ⁿ)) ▪️이진 탐색 트리를 이용한 정렬 |

좋은 글 감사합니다 ^^