석이의 개발일지
시간 복잡도 본문
728x90
Big-O notation (빅오표기법)
O(n) 예시
for (let i = 0; i < n; i += 1 ) {
// ...
}
O(log n) 예시
for (let i = 0; i <= n; i *= 2 ) {
// ...
}
O(n log n) 예시
for (let i = 0; i < n; i += 1 ) {
for(let j = 1; j <= n; j*= 2) {
// ...
}
}
O(n²) 예시
for (let i = 0; i < n; i += 1 ) {
for(let j = 1; j < n; j+= 1) {
// ...
}
}
계수 법칙
- 상수 k가 0보다 클 때 f(n) = O(g(n)) 이면 kf(n) = O(g(n))이다.
n이 무한에 가까울수록 k의 크기는 의미가 없기 때문이다.
// 두 루프는 같은 O(n)으로 표기된다.
for(let i = 0; i < n; i += 1) {
// ...
}
for(let i = 0; i < n * 5; i += 1) {
// ...
}
합의 법칙
- f(n) = O(h(n))이고 g(n) = O(p(n))이면 f(n) + g(n) = O(h(n)) + O(p(n))이다.
빅오는 더해질 수 있다.
// 두 루프를 합쳐 O(n + m)으로 표기할 수 있다.
// 계수 법칙에 의해 5는 사라진다.
for(let i = 0; i < n; i += 1) {
// ...
}
for(let i = 0; i < m * 5; i += 1) {
// ...
}
곱의 법칙
- f(n) = O(h(n))이고 g(n) = O(p(n))이면 f(n) * g(n) = O(h(n)) * O(p(n))이다.
빅오는 곱해질 수 있다.
// 두 루프를 곱해 O(n^2)으로 표기할 수 있다.
// 계수 법칙에 의해 5는 사라진다.
for(let i = 0; i < n; i += 1){
for(let j = 0; j < n * 5; j += 1) {
// ...
}
}
다항 법칙
- f(n)이 k차 다항식이면 f(n)은 O(n^k)이다.
// 다음 루프는 O(n^3)으로 표기할 수 있다.
for(let i = 0; i < n * n * n; i += 1) {
// ...
}
2가지만 기억하면 된다.
1. 상수항은 무시
// 계수 법칙에 의해 계수는 무시된다.
// 그리하여 O(n + m)으로 표기된다.
for(let i = 0; i < n * 6; i += 1) {
// ...
}
for(let i = 0; i < m * 3; i += 1) {
// ...
}
2. 가장 큰 항 외엔 무시
// O(n^2 + n)이지만 작은 항은 무시하여
// O(n^2)으로만 표기해도 된다.
for(let i = 0; i < n; i += 1) {
// ...
}
for(let i = 0; i < n; i += 1) {
for(let j = 0; j < n; j += 1) {
// ...
}
}
성능 측정 방법
const start = new Date().getTime();
// ...
const end = new Date().getTime();
console.log(end - start);
console.log("Start");
const start = new Date().getTime();
const N = 1000000000;
let total = 0;
for(let i = 0; i < N; i += 1) {
total += i;
}
const end = new Date().getTime();
console.log(end - start);
console.log("Finish");
↓ Output ↓
Start
1114
Finish
LIST
'Algorithm' 카테고리의 다른 글
Lv2. 올바른 괄호 (2) | 2023.03.16 |
---|---|
Lv2. JadenCase 문자열 만들기 (0) | 2023.03.16 |
Lv.2 최댓값과 최솟값 (2) | 2023.03.15 |
자료구조 (0) | 2023.02.13 |
자바스크립트의 9가지 코드 트릭 (4) | 2023.02.12 |
Comments