점근 표기법(asymptotic notation)
은 어떤 함수의 증가 양상을 다른 함수와의 비교로 표현하는 수론과 해석학의 방법이다. 알고리즘의 복잡도를 단순화할 때나 무한급수의 뒷부분을 간소화할 때 쓰인다.
출처 - 위키백과
점근 표기법은 시간복잡도를 근사치로 표현한 것과 같다. 그리고 시간복잡도는 크게 3가지의 종류가 있다.
- 빅-오(Big O : Ο) : 최악의 경우(Worst Case)의 시간 복잡도
- 빅-오메가(Big Omega : Ω) : 최선의 경우(Best Case)의 시간 복잡도
- 빅-세타(Big Theta : Θ) : 평균적인 경우(Average Case)의 시간 복잡도
시간 복잡도를 계산할 때 가장 좋은 경우를 생각해야하니 빅 오메가를 사용하는 것이 좋다고 착각할 수 있다. 하지만 보통은 빅-오 표기법을 사용하는데 알고리즘이 가장 최악의 경우에 어느 정도의 성능이 나오는지를 측정하는 것이 더 정확하기 때문이다.
언제 어느 상황에서 최고의 상황일지 최악의 상황일지 모른다. 그래서 최악일 때 측정한 성능이 최고라고 생각할 수 있다. 예를 들어보겠다.
두 가지의 알고리즘이 있는데 A 알고리즘
은 최고의 상황일 때 10의 수행시간이 걸리지만 최악일 때 100의 수행시간이 걸린다. 여기서 최고의 경우일 때가 빅 오메가이고, 최악의 경우가 빅 오이다. 그렇다면 최악의 경우일 때 걸린 수행 시간이 이 알고리즘의 수행 시간의 상한선이다.
결론은 빅오 표기법은 주어진(최악) 경우의 수행 시간의 상한을 나타낸다.
O(1) < O(log n) < O(n) < O(n * log n) < O(n²) < O(n³) < O(2^n) < O(n!)
const arr = [1,2,3];
function test(arr) {
console.log(arr[0]);
}
test(arr);
오름차순으로 정렬되어 있는 배열
에서만 사용할 수 있다.function solution(element, arr) {
let firstIndex = 0;
let lastIndex = arr.length - 1;
while(firstIndex <= lastIndex) {
let centerIndex = Math.floor((firstIndex + lastIndex) / 2);
if (element === arr[centerIndex]) {
return centerIndex;
}
else if (element < arr[centerIndex]) {
lastIndex = centerIndex - 1;
}
else {
firstIndex = centerIndex + 1;
}
}
return false;
}
console.log(solution(2,[1,2,3,4,5,6,7]))
const arr = [1,2,3];
function test(arr) {
let sum = 0;
for(let i=0; i<arr.length; i++) {
sum += arr[i];
}
return sum;
}
test(arr);
const arr = [1,2,3];
function test(arr) {
for(let i = 0; i < arr.length; i++) {
for(let j = 0; j < arr.length; j++) {
console.log(arr[i],arr[j]);
}
}
}
test(arr);