코딩테스트를 준비하는건 문제를 풀면 된다.
문제를 풀기위한 지식을 습득하는건 강의를 들으면 된다.
드가자~
우리는 일단 속도에 중점을 둬 보자.
//Add1.js
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
const t1 = performance.now();
addUpTo(1000000000);
const t2 = performance.now();
console.log(`시간 경과 : ${(t2 - t1) / 1000}초`);
//...시간 경과 : 0.9190668249949813초
//Add2.js
function addUpTo(n) {
return (n * (n + 1)) / 2;
}
const t1 = performance.now();
addUpTo(1000000000);
const t2 = performance.now();
console.log(`시간 경과 : ${(t2 - t1) / 1000}초`);
//...시간 경과 : 0.00002681799978017807초
Add1과 Add2의 결과는 같다. 1부터 n까지의 합을 구하는 것. 하지만 속도차이는 어마무시하다. 이렇게 수동으로 속도를 비교할수도있지만, 같이 논의하기 어렵고 불확실하다.
1. 다른 기기끼리 시간측정 방식이 다름.
2. 같은 기계라도 시간의 오차가생김.
3. 빠른 알고리즘에선 아주 짧은시간안에 처리됨. 차이를 확인하기 어려움.
곱하기 덧셈 나누기
N을 N번 더하고...total에 i를 더하고..어쩌고..5n+2번?
function sum(arr){
let total = 0;
for(let i = 0; i < arr.length; i++){
total += arr[i];
}
return total;
}
sum의 공간복잡도는 O(1).
=> 입력의 크기와 관계없이 let total = 0
과 let i = 0
function double(arr){
let newArr = [];
for(let i = 0; i < arr.length; i++){
newArr.push(2*arr[i]);
}
return newArr;
}
double의 공간복잡도는 O(n).
=> 내부에서 배열을 생성해서 리턴함.
entries, keys, values
는 탐색이기에 O(n). hasOwnProperty
는 key값으로 찾는것이기에 O(1)링크드 리스트
나 더블 링크드리스크
같은 자료구조도 정렬이 되며 배열보다 더 빠를때가 있음push, pop
은 끝에서 일어나기에 O(1). shift, unshift, concat, slice, splice, foreach/map/filter/reduce...etc
는 O(n). sort
가 특이하게 O(n*log n).key나 index를 기준으로 접근하면 상수시간이라는 공통점이 있구나!