동일한 기능을 수행하는 알고리즘이 있을 때 복잡도가 낮을수록 좋은 알고리즘이라고 한다.
복잡도는 알고리즘의 성능을 나타내는 척도다.
복잡도는 시간 복잡도와 공간 복잡도로 나눌 수 있다.
효율적인 알고리즘이란?
알고리즘이 수행을 시작하여 결과가 도출될 때까지 실행에 걸리는 시간이 짧고 연산하는 컴퓨터내의 메모리와 같은 자원을 덜 사용하는 것이 효율적이라고 할 수 있다.
시간 복잡도란 특정한 크기의 입력에 대하여 알고리즘의 수행 시간 분석, 알고리즘을 실행하여 종료할 때까지 걸리는 시간을 의미한다.
즉, 알고리즘을 위해 필요한 연산의 횟수를 말한다.
시간 복잡도를 표기하는 방법 중에 가장 많이 사용하는 표기법은 Big-O(빅 오)표기법이다.
Big-O(빅 오)표기법은 알고리즘 최악의 실행 시간을 표기한다.
동전을 튕겨서 뒷면이 나올 확률을 이야기할 때, 운이 좋으면 한 번에 뒷면이 나오겠지만 운이 안 좋다면 N번만큼 동전을 튕겨야 할 수 있다. 이 최악의 경우를 계산하는 방식을 Big-O 표기법이라고 한다.
Big-O
Big-O 표기법은 여러 경우에 대한 성능의 상한을 표기한 것이며,
Big-Ω 표기법은 하한을 표기한 것이다.
공간 복잡도란 특정한 크기의 입력에 대하여 알고리즘의 메모리 사용량 분석, 알고리즘을 실행하여 종료할 때까지 필요한 기억장치의 크기를 의미한다.
즉, 알고리즘을 위해 필요한 메모리의 양을 말한다.
공간 복잡도에도 동일하게 Big-O 표기법을 이용할 수 있다.
// O(1)
function Space1(n) {
for (let i = 0; i < n.length; i++) {
console.log('Space Complexity!');
}
}
Space1([1,2,3,4,5]);
// O(n)
function Space2(n) {
let array = [];
for (let i = 0; i < n; i++) {
array[i]='hi';
}
return array;
}
Space2(5);
첫번째 함수는 변수 i를 0이라고 선언한 것 외에는 공간 복잡도에 영향 미치는 부분은 없다.
두번째 함수는 for문 내에 5번 반복 실행되면서 공간을 5번 사용했다.
좋은 알고리즘은 시간이 적게 걸리고 자원의 사용도 적어야 한다.
하지만 시간과 공간은 반비례적인 경향이 있기 때문에
시간이 빠른 경우엔 공간을 많이 사용하고, 시간이 느린 경우 공간을 적게 쓰는 경우가 있다.
대부분 알고리즘의 척도는 시간 복잡도를 위주로 판단한다.
[참고링크]