3 / 12 멘토링 체크포인트
시간복잡도
알고리즘의 실행 시간이 아닌 알고리즘을 수행하는데 연산이 몇 번 이루어지는지
T(n) 의 형태로 표기하지만 시간복잡도는 일반적으로 빅오표기법으로 나타냄
빅오표기법(O(n))
└연산 횟수가 다항식으로 표현될 경우 최고차항을 제외한 모든 항과 최고차항의 계수를 제외하고 표현
└최악의 경우를 나타낼 때 씀 (보통 최악의 경우를 가정하고 쓰므로 가장 많이 사용)
└최선은 빅오메가, 보통은 빅세타
const function (num) {
let sum = 0 //대입 1회
for (let i = 0; i < num; i++) { //반복문 n+1회
sum += i //덧셈 n회
}
for (let i = 0; i < num; i++) { //반복문 n+1회
sum += i //덧셈 n회
}
return sum //리턴 1회
}
T(n) = (1)+(n+1)+(n)+(n+1)+(n)+(1) = (4n+4) = O(n)
시간복잡도 표기
O(1) : 상수 시간
const function (num) {
console.log(num)
}
입력 크기(n)에 상관없이 일정한 연산을 수행하면 시간복잡도는 O(1)
O(logN) : 로그 시간
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)
}
}
}
출처: [Plus Ultra]
한번 처리할 때마다 검색해야 하는 데이터의 양이 절반씩 떨어지는 알고리즘
대표적인 예가 이진 탐색
O(n) : 선형 시간
for (let i = 0; i < n; i++) {
...
}
n번 반복문을 수행
O(n²) : 2차 시간
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
...
}
}
이중 for문처럼 n이 커질때 n²에 비례해서 증가하는 경우
O(2ⁿ) : 지수 시간
const function (num) {
if (num <= 1) {
return num
}
return function(num-2) + function(num-1)
}
대표적인 예시는 피보나치 수열
한번 함수를 호출할 때마다 두 번씩 재귀로 함수를 호출
알고리즘의 성능 간 그래프
공간복잡도
작업 수행 시 공간을 얼마나 추가로 사용하게 되는지를 봄
알고리즘에 사용되는 메모리의 양 = 공간복잡도
- 변수
- 자료 구조
- 함수 호출
- 할당
공간복잡도에 영향을 미치는 네 가지 요소
O(n)
function sample(arr, n) {
let s = 0 // 1
for (let i = 0; i < n; i++) { // 2
s += arr[i] // n
}
return s
}
O(1)
function sample(n) {
let val = 1; // 1
for(let i=0; i<n; i++) { // 2
val = val * i;
}
return val;
}
Author And Source
이 문제에 관하여(3 / 12 멘토링 체크포인트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@qjastar/3-12-멘토링-체크포인트저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)