티스토리 뷰
Big-O(또는 Big-Oh) notation은 알고리즘의 시간 복잡도를 나타내는 표기법이며,알고리즘 최악의 경우 복잡도를 측정한다.나타내는 표현방식은 O(f(n))으로 나타내는데 여기에서 n은 입력의 개수를 나타낸다.
1) 빅 오 표기법
알고리즘의 복잡도를 판단하는 척도로는 시간복잡도(실행시간)와 공간 복잡도(실행공간) 두가지가 있는데, 빅 오 표기법은 시간복잡도를 다룬다.
빅 오 표기법을 고민할 때 가장 대표적으로 생각해야 할 질문이 "n이 무한으로 접근하면 무슨 일이 일어날까?"
대표적은 O(n)에 대해 예를 통해 이해해보자.
O(n)은 선형시간이고, 위의 예에서 최악의 경우 i는 0부터 n-1까지 n번의 연산을 수행해야 한다.
이를 이해했다면 다음은 O(n²), O(n³)의 시간복잡도를 살펴보자.
왜냐하면 n을 입력개수라고 했을 때 입력개수 대비 시간이 더 오래걸리기 때문에 그래프 상으로 봤을 때에도 비효율적이라고 할 수 있다.
로그의 시간 복잡도의 효율은 백만개의 항복 이상의 큰 입력이 있는 경우에 분명하다.n이 백만이라고 하더라도 log2(1,000,000) = 19.9315…이기 때문에 단지 19개의 항목만을 출력한다.
여기까지 이해했다면 빅오 표기법 규칙은 쉽게 이해할 수 있다.혹은 "극한"의 성질을 이해하면 된다.
알고리즘의 시간 복잡도를 f(n)이라고 표현했을 때, n은 입력 개수를 나타낸다.
f(n)time : 필요한 시간
f(n)space : 필요한 공간(추가적인 메모리)
알고리즘의 분석 목표는 f(n)을 계싼함으로써, 알고리즘의 효율성을 제대로 이해하는 것이다. 하지만 f(n)을 계산함으로써, 알고리즘의 효율성을 제대로 이해하는 것이다.
2) 계수 법칙
상수 k>0인 경우 f(n)이 O(g(n))이면 kf(n)은 O(g(n))이다.
위의 예시에서 case1의 시간복잡도는 f(n)=n, case2에서의 시간복잡도는 5f(n)이다.
(for문이 각각 0에서 n까지, 0에서 5n까지 실행되기 때문이다.)
하지만 n이 무한대로 커진다면 또는 아주 큰 수에 가까워진다면 계수가 존재한다고 해도 무한대로 나아가는 것은 다름없다.
따라서 이 둘의 결과값 즉 시간복잡도는 O(n)으로 동일하다.
2) 합의 법칙
f(n)이 O(h(n))이고 g(n)이 O(p(n))이라면 f(n) + g(n)은 O(h(n)+p(n))
위의 예에서 첫번째 for문은 f(n)=n에 해당하고, 일곱번째 줄은 f(n)=5n애 해당한다.
이로 인한 결과값은 n + 5n = 6n 이다.
따라서 이것 또한 n이 무한대로 커진다는 사실은 다름이 없으므로 이 것의 시간복잡도는 O(n) = n 이다.
3) 곱의 법칙
f(n)이 O(h(n))이고 g(n)이 O(p(n))이면 f(n)g(n)은 O(h(n)p(n))
이전의 O(n²), O(n³) 을 생각하면 된다. 위의 예에서 결과값은 f(n) = n*5n 이다. 내부 loop에 의해 5n번 실행되고 내부loop는 외부 loop에 의해 n번 실행되기 때문이다.
따라서 결과는 5n²번 연산이 일어난다. 즉 이것의 결과값은 O(n) = n²이 된다.
3) 전이 법칙
f(n)이 O(g(n))이고 g(n)이 O(h(n))이면 f(n)은 O(h(n))
3) 다항 법칙
f(n)이 3(k)차 다항식이면 f(n)은 O(n³(k))
f(n)이 2차 다항식이기 때문에 (네번째 줄이 n*n회 실행되기 때문) O(n) = n² 이 된다.
정리
- 빅오표기법은 알고리즘의 효율을 분석하고 비교하는 데 매우 중요하다.
- 우선 빅오를 분석하기 위해서는 코드를 살펴보고, 빅오 표기법을 단순화하고 위의 법칙들을 적용해야 한다.
- Total
- Today
- Yesterday
- 이벤트버스
- useState
- http
- 항해플러스프론트엔드
- focus와blur
- Vuex
- 이벤트리스너
- 빅오표기법
- 더미데이터
- Http통신
- vue.js3
- props
- store.js
- reactnative
- event종류
- React18v
- 항해솔직후기
- eventListner
- vue3
- 항해플러스후기
- 디바운싱
- 로그인 인증
- react
- Vue.js
- 웹훅
- Repository pattern
- 알고리즘
- JWT토큰
- loadbalancer
- 레포지토리패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |