시간복잡도(big-o)

악음·2021년 12월 12일
0

알고리즘

목록 보기
3/4
post-thumbnail

시간복잡도란?
알고리즘을 처리하는 데 시간이 얼마나 걸리는지 알려주는 것

big o란?
Big-O(빅-오)란 알고리즘의 성능을 수학적으로 표현해주는 표기법입니다. 이를 통해 알고리즘의 시간과 공간 복잡도를 표현할 수 있습니다. 빅오 표기법은 알고리즘을 처리하는 실제 시간을 표시하는 것이 아닙니다. 빅오 표기법은 데이터나 사용자의 증가율에 따른 알고리즘의 성능을 예측하기 위해 사용합니다.

참고한 싸이트
https://overcome-the-limits.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8B%9C%EA%B0%84%EB%B3%B5%EC%9E%A1%EB%8F%84-with-JavaScript

o(1) : constant Time (변하지 않는 시간)

입력 데이터의 크기에 상관없이 일정한 시간이 걸리는 알고리즘을 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) : linear Time (증가하는시간)

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)이라고한다.

o(n^2) :Quadratic time

입력 데이터의 크기의 제곱만큼 처리시간이 걸리는 알고리즘을 표현
(데이터가 커질수록 시간은 제곱으로증가)

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의 베열이 증가할수록 시간은 제곱만큼 증가한다.

o(2^n) 피보나치수열

피보나치수열은 아래와 같은 그림으로 표현된다
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의 제곱보다도 데이터의 증가에 따라 처리량이 현저하게 늘어나는 그래프를 볼 수 있습니다.

o(log 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)이라고 한다.

차트로 표현하자면

big o 표현법

같이 사용해야하는 알고리즘들의 시간복잡도 들중
무조껀 가장 오래걸리는 복잡도로 표현
또한 많은 데이터가 있다는 가정하에 표현해야한다.

profile
RN/react.js개발자이며 배운것들을 제가 보기위해서 정리하기 때문에 비속어 오타가 있을수있습니다.

0개의 댓글