이번 포스트에서는 어떠한 문제에 대한 여러 해결법중 제일 효율적인 해결법을 찾기 위한 방법인 Big O notation에 대해 알아보겠다.
- Big-O(빅-오) : 최악의 경우를 표현
- Big-Ω(빅-오메가) : 최선의 경우를 표현
- Big-θ(빅-세타) : 평균의 경우를 표현
이렇게 3가지가 존재한다.
위의 3가지중 대부분 Big-O notation을 사용하는데, 이는 어떠한 알고리즘의 최악의 경우를 고려하여 대비하기 위해서 이다.
이렇게 코드를 작성할때 혹은 디버깅할때 코드를 느리게 만드는 원인을 찾아내데 Big O notation을 사용한다.
더 좋은 코드란?
실행속도가 빠른 코드, 메모리사용이 적은 코드, 가독성이 좋은 코드가 말그대로 '좋은코드'가 될수 있는데 만약 실행속도가 빠른 코드를 찾는다고 가정해보자.
임의의 숫자를 입력햇을때 입력값의 이전의 모든 양의 정수들을 더하는 두가지 함수를 만들어봤다.
function iterator(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
function formular(n) {
return (n * (n + 1)) / 2;
}
// 속도측정
let t1 = performance.now();
iterator(10000000);
let t2 = performance.now();
let t3 = performance.now();
formular(10000000);
let t4 = performance.now();
console.log(`반복문의 실행시간입니다. ${(t2 - t1) / 1000}`);
console.log(`공식의 실행시간입니다. ${(t4 - t3) / 1000}`);
첫번째 함수는 반복문을 사용하였고 두번째는 공식을 이용한 함수를 만들었다.
그후 실제속도를 측정해보면
위와 같이 직접 실행하는 속도를 측정할수 있었다.
Big O notation의 시간복잡도
O(n²) 예시
function iteratorIniterator(n) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
console.log(i, j);
}
}
}
위와같이 반복문안에 반복문을 작성을 하고 입력값으로 3이 주어졌을경우
빅오 표현식 단순화 하기
상수는 빅오 시간복잡도를 표현하는데 그렇게 도움이 되지않는다 예를들어
공간 복잡도
공간 복잡도는 메모리 할당과 사용에 해당된다.
자바스크립트에서 boolean, number, undefined, null은 모두 어떠한 값이오든 공간의 크기의 값은항상 일정 하지만 string의 경우 문자열의 길이에 따라 공간값이 달라지게 된다.
또한 array와 object도 안의 내용량에 따라 할당받는 공간값이 달라지게 된다.
function sum(arr) {
let total = 0;
for (let i = 0; i < arr.length; i++) {
total += arr[i];
}
return total;
}
위의 경우 함수 sum안에서 let total과 let i의 숫자로된 공간만 할당받으며 숫자의 경우 할당받는 메모리의 크기는 변하지 않으므로 빅오 공간복잡도는 O(1)이 된다.
function push(arr) {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
newArr.push(2 * arr[i]);
}
return newArr;
}
위의 함수 push는 함수 sum과는 비슷하지만 조금 다르다.
let total이라는 숫자로된 변수가아닌 newArr라는 array를 할당받고 있다.
입력받은 arr의 길이에따라 newArr의 길이가 달라지기에 이경우 빅오 공간복잡도는 O(n)이 된다.
로그
log는 제곱의 반대 표현이다.
마무리
어떠한 알고리즘의 성능을 분석하기 위해 Big O notation을 사용하며 시간복잡도 혹은 공간복잡도로 분석이 가능하다.
Big O notation은 정확한 시간이나 공간 할당량을 계산하는것이 아닌 그래프를 통한 전체적인 추세 혹은 효율을 시각화 한다.
'Datastructure & Algorithm' 카테고리의 다른 글
Quick Sort (퀵 정렬) 알고리즘 (0) | 2023.01.26 |
---|---|
Merge Sort(합병 정렬) 알고리즘 (0) | 2023.01.25 |
기본 정렬 알고리즘(Bubble, Selection, Insertion sorts) (0) | 2023.01.21 |
검색 알고리즘 (2) | 2023.01.18 |
배열과 오브젝트의 성능 평가 (0) | 2023.01.03 |