효율적으로 데이터를 관리하고 수정, 삭제, 탐색, 저장 할 수 있는 데이터 집합을 말합니다
시간 복잡도란 문제를 해결해 나가는 데 걸리는 시간과 입력의 함수 관계 를 가리킵니다
빅오표기법
알고리즘의 로직이 얼마나 오랜 시간이 걸리는지 나타내는 표기법
처리(연산)되는 속도가 더 빠르다는건 시간복잡도가 더 적다는 얘기입니다
시간복잡도를 줄일수록 성능이 향상됩니다
처리 시간으로 비교하는거는 측정할때마다 규칙적이지 않을 수 있기 때문에, 연산 개수로 비교하는 것입니다
// O(n)
// n의 입력값 만큼 loop 선회 하기때문에 선형 형태를 그린다
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i ++) {
total += i;
}
return total;
}
위의 코드와 동일한 결과를 반환하지만 아래의 코드가 더 빠르고, 더 가독성이 좋으며, 더 적은 메모리를 사용한다
// O(1)
// n값과 상관없이 항상 3가자의 연산이 이루어진다 * , + , /
function addUpTo(n) {
return n * (n + 1) / 2;
}
시간복잡도 Perfomance Tracker
https://rithmschool.github.io/function-timer-demo/
let instructor = {
firstName : "BORA",
inInstructor: true,
favoriteNumbers: [1,2,3,4]
}
// key를 이용한 접근 -> O(1)
console.log(instructor.firstName); // "BORA"
// key를 이용한 삽입 -> O(1)
instructor.lastName = "KIM"
// key를 이용한 삭제 -> O(1)
delete instructor.lastName;
// 특정 조건에 맞는 value 값을 찾기 위해서는 객체를 순회하며 탐색 -> O(n)
for(const key of instructor) {
if(instructor[key] === true) {
return key;
}
}
// 객체를 순회하여 key 또는 value 값을 배열로 반환 -> O(n)
Object.keys(instructor);
Object.values(instructor);
Object.entries(instructor);
// 키를 이용한 탐색 -> O(1)
instructor.hasOwnProperty('fisrtName');
공간 복잡도란 프로그램을 실행시켰을 때 필요로하는 자원 공간의 양을 말합니다
정적 변수로 선언된 것 이외에도 재귀함수로 인해 동적으로 공간이 필요한 경우도 포함합니다
function dobule(arr) {
let newArr = [];
for(let i = 0; i < arr.length; i++) {
newArr.push(2 * arr[i]);
}
return newArr;
}