알고리즘은 풀다가 시간복잡도와 공간복잡도에 대해 들어본 적이 있으신가요? 오늘 주제인 알고리즘 성능 표현 방법이 바로 시간복잡도와 공간복잡도입니다.
알고리즘을 평가 하는데 있어 수행시간과 메모리로 사용량을 기준으로 둡니다.
알고리즘 성능 표현 방법을 조금 더 간편하게 할 목적으로 표기하는 방법이 있습니다. 그게 바로 Big O 표기법 입니다.
앞서 말했듯이 알고리즘의 효율성을 표기해주며 보통 알고리즘의 시간복잡도오 공간복잡도를 나타내는데 사용합니다.
O(n² + n) -> O(n²)
O(2n + 3) -> O(n)
이렇게만 보면 이해가 잘되지않으니 그래프를 함께 봐봅시다!
시간복잡도란 알고리즘이 문제를 해결하기 위한 시간의 횟수, 입력 값의 개수와 알고리즘의 처리 시간과의 상관관계입니다.
시간복잡도의 표현방법으로는
이제 간단한 코드를 보며 시간복잡도를 계산해보도록 하겠습니다.
int func2(int a[], int size, int key) {
int i = 0;
for(i=0 ; i<size ; i++)
if (a[i] == key)
return i;
return -1;
}
코드를 보면 간단히 배열을 받고 size, 키를 받아서 배열을 사이즈만큼 포문을 돌려서 키값이랑 동일한지 체크하는 함수입니다. 이때 시간 복잡도를 계산할려면 실행횟수를 알면됩니다.
처음엔 i를 초기화해주는 줄은 1번
for문은 마지막에 조건문을 검사하기때문에 size + 1번
그 안에 있는 if문은 size번
그리고 if문을 만족하면 return문을 실행하니까 1번
만약 if문을 만족하지않는다면 -1을 return 해주므로 1번
이렇게 모든 실행횟수를 더해주면 2size + 4가 됩니다. 이걸 Big O 표기법으로 표시해봅시다. 아까 Big O 표기법의 규칙으로
계수 및 상수는 과감하게 버린다
라고했습니다. 이 규칙을 적용하게 된다면 최종적으론
size만 남음으로 O(n)으로 표기가 됩니다.
공간복잡도란 시간복잡도와 마찬가지로 비슷하지만 처리 시간 대신 메모리 사용량의 변화를 비교합니다. 최근에는 대용량 시스템이 보편화되면서 공간 복잡도보다는 시간 복잡도가 우선시됩니다.
공간 복잡도를 계산하는 방법은 실제 사용되는 저장공간을 계산하면 됩니다.
아래 코드를 보며 공간복잡도 계산을 해봅시다
반복문으로 팩토리얼을 구하는 간단한 코드입니다. 여기서의 공간복잡도는 반복문이 매개변수 n의 값에 상관없이 언제나 일정합니다. 때문에 Big O 표기법으로 구해보면
공간복잡도는 O(1)이 됩니다.
또 하나 예제를 봅시다
두 개의 코드가 무엇이 다른지 눈에 보이시나요? 바로 구현하는 방법이 다릅니다. 첫번째 코드는 반복문으로, 두번째코드는 재귀함수를 이용하였습니다.
재귀함수를 이용한 팩토리얼 구하기에선 n이 1이하일 때까지 함수가 재귀적으로 호출되면서 n부터 1까지 스택에 쌓이니까 입력 데이터의 크기에 비례하기 때문에 Big O 표기법으론 O(n)이 될 수 있습니다.
시간복잡도는 얼마나 빠르게 실행되느냐?
공간복잡도는 얼마나 많은 자원이 필요함?
좋은 알고리즘은 시간도 적게 걸리고 자원의 사용도 적어야하는 것이기 때문에 시간복잡도와 공간복잡도를 잘 고려해서 최적의 알고리즘을 짤 수 있습니다.
===출처 표기 예정