- Example
1 부터 특정한 값N
사이에 있는 모든 숫자들을 더하는 function을 작성해보자 (n = 6
이면 1 + 2 + 3 + 4 + 5 + 6 = 21)
가장 쉽게 접근할 수 있는 방법은 반복문을 사용해 1 부터 n까지 더해 리턴하는 방식
function addUpto(n) {
let total = 0;
for(let i = 1; i <= n; i++){
total += i;
}
return total;
}
다른 방법은? 수학 공식을 활용하자
위 두 식을 더하면?
function addUptoByFormula(n) {
return n * (n + 1) / 2;
}
위 두 코드 중 어떤 게 더 나을까?
코드 실행 속도 평가
속도를 평가하는 가장 쉬운 방법은 내장 타이밍 함수(performance.now()
)를 이용하는 것
function addUpto(n) {
let total = 0;
for(let i = 1; i <= n; i++){
total += i;
}
return total;
}
let t1 = performance.now();
addUpto(1000000000);
let t2 = performance.now();
console.log(`경과시간: ${(t2 - t1) / 1000}초`);
function addUptoByFormula(n) {
return n * (n + 1) / 2;
}
let t3 = performance.now();
addUptoByFormula(1000000000);
let t4 = performance.now();
console.log(`경과시간: ${(t4 - t3) / 1000}초`);
결과
문제점
시간을 측정하지 않고 코드의 속도를 비교할 수 있을까? → Big O 표기법!
컴퓨터가 처리해야하는 연산 개수를 세면 됨
ex) A 알고리즘은 처리해야하는 연산 개수가 5개, B 알고리즘은 처리해야하는 연산 개수가 7개
연산 개수 측정
function addUptoByFormula(n) {
return n * (n + 1) / 2;
}
function addUpto(n) {
let total = 0;
for(let i = 1; i <= n; i++){
total += i;
}
return total;
}
i++
연산도 n번 실행됨total = 0
에도 1번의 할당 연산이 일어나고, i ≤ n
n 번의 비교연산과, i = 1
에도 1번의 할당 연산이 일어남addUpto(n)
함수는 의 복잡도를 가짐, addUptoFormula(n)
함수는 n이 커질 수록 실행시간이 선형적으로 증가하는 의 복잡도를 가짐function countUpAndDown(n) {
for(let i = 0; i <= n i++) {
console.log(i);
}
for(let j = n - 1; i >= 0; j--) {
console.log(j);
}
}
function printAllPairs(n) {
for(var i = 0; i < n; i++) {
for(var j = 0; j < n; j++) {
console.log(i, j);
}
}
}