시간복잡도란?
알고리즘을 처리하는 데 시간이 얼마나 걸리는지 알려주는 것
big o란?
Big-O(빅-오)란 알고리즘의 성능을 수학적으로 표현해주는 표기법입니다. 이를 통해 알고리즘의 시간과 공간 복잡도를 표현할 수 있습니다. 빅오 표기법은 알고리즘을 처리하는 실제 시간을 표시하는 것이 아닙니다. 빅오 표기법은 데이터나 사용자의 증가율에 따른 알고리즘의 성능을 예측하기 위해 사용합니다.
입력 데이터의 크기에 상관없이 일정한 시간이 걸리는 알고리즘을 o(1)이라 한다.
example .1
const example = [1,2,3,4,5]; function findO1(example) {
console.log(example[0]); // O(1) console.log(example[1]); // O(1)
}
findO1(example);
위에 코드는 element에서 필요한값을 딱 찍었기때문에 단 한 번만 이루어지면된다.
이러한 알고리즘을 o(1)의 시간 복잡도를 가진다고 한다.
o(n)은 데이터의 크기에따라 비례해서 처리시간도 늘어나는 알고리즘을 표현할 때 사용한다.
const people = ['epitone', 'junggyun', 'sangsu', 'soonhee', 'hansik'];
const findPerson = array => {
for (let i = 0; i < array.length; i++) {
if (array[i] === 'hansik') {
console.log("Found hansik");
}
}
};
findPerson(people);
위에 코드처럼 people 배열의 길이가 길어질수록 반복문의 횟수는 비례하여 증가하기때문에 저러한 알고리즘을 o(n)이라고한다.
입력 데이터의 크기의 제곱만큼 처리시간이 걸리는 알고리즘을 표현
(데이터가 커질수록 시간은 제곱으로증가)
const people = ["epitone", "junggyun", "sangsu", "soonhee", "hansik"];
const findPerson = (array) => {
for (let i = 0; i < array.length; i++) {
for (let k = 0; k < array.length; k++) {
console.log(array[i], array[k]);
}
}
};
findPerson(people);
위와같이 2중 for문을 걸면 people의 베열이 증가할수록 시간은 제곱만큼 증가한다.
피보나치수열은 아래와 같은 그림으로 표현된다
1,1,2,3,5,8,13,21,34
이전값과 자신의값을 더해 다음값을 반환한다.
다음과같은 코드로 구현 할 수 있다.
function a(n){
if(n <= 0) {
return 0;
} else if(n === 1) {
return 1;
} return a(n-1) + a(n-2);
}
피보나치수열을 구하는 코드를 재귀 함수를 통해 구현한다면 이렇게 표현할 수 있습니다.
즉 함수를 호출할 때마다 바로 전 숫자와 그 전 숫자를 알아야 숫자를 더하면서 앞으로 나올 숫자를 파악할 수 있습니다. 이렇게 매번 함수가 호출될 때마다 두 번씩 호출합니다. 이걸 트리의 높이만큼 반복합니다.
n의 제곱보다도 데이터의 증가에 따라 처리량이 현저하게 늘어나는 그래프를 볼 수 있습니다.
이진 탐색 등의 알고리즘에서 사용
만약 정렬된 배열에서 특정 숫자를 찾을 때 이진 검색을 이용한다면
1. 배열의 가운데 값과 키값을 비교한다.
2. 만약 가운데 값이 키값보다 작다면 작은 값들은 탐색할 필요 x
3. 배열에서 키값보다 작은 값을 제거
4. 1번으로 감
let arr = [];
function log(k, s, e){
for(let i = s; i <= e; i++){
arr.push(i); let m = (s+e)/2;
if(arr[m] === k){
console.log(m)
} else if(arr[m]> k){
return log(k, s, m-1);
} else{
return log(k, m+1,e)
}
}
}
출처: https://overcome-the-limits.tistory.com/entry/자료구조-시간복잡도-with-JavaScript [Plus Ultra]
이렇게 한번 처리 될 때마다 검색해야 하는 데이터의 양이 절반씩 떨어지는 알고리즘을
o(log n)이라고 한다.
차트로 표현하자면
같이 사용해야하는 알고리즘들의 시간복잡도 들중
무조껀 가장 오래걸리는 복잡도로 표현
또한 많은 데이터가 있다는 가정하에 표현해야한다.