빅오 표기법(Big O Notation)이 란?
알고리즘의 성능 측정은 어떻게 할까?
간단한 풀이 시간 측정
위와 같은 식이 있다고 해봅시다. 위 식에 대한 성능은 어떻게 측정할까요?
듣자마자 아마 머릿속에 물음표를 띄웠을 것이라고 생각됩니다!
"아니! 앞뒤 맥락 없이 성능이라고 말하면 어떻게 알아요?"
맞습니다. 보통 성능이라고 하면, 무언가를 측정한다는 것이고, 측정이라 함은 무릇 기준이 있어야합니다.
기준도 없이 다짜고짜 성능이라고 말하니, 엥? 하는 반응이 오는게 당연합니다.
그러면 푸는데까지 얼마나 걸렸나요? 라고 물어보면 답을 할 수 있을까요?
당연히 가능합니다!
문제를 풀기 시작할때 스탑와치를 켜고, 풀자마자 정지 버튼을 누르면 측정할 수 있으니까요!
이 때에는 시계를 눌렀다가, 다시 누르기까지 걸린 시간이 곧 측정의 기준이 될 것입니다.
코드에 대한 간단한 풀이 시간 측정
현실에서 스탑와치 를 눌렀다가, 다시 누르는 데 걸리는 시간을 통해 풀이 시간을 측정할 수 있다면, 컴퓨터에서는 어떨까요?
먼저, 위 식을 컴퓨터에서 표현해봅시다. 어떻게 표현할 수 있을까요?
let sum = 0;
for (let i = 1; i <= 10; i++) {
sum += i;
}
위와 같이 표현할 수 있지 않을까요?
그러면 다시한번 물어볼게요. 위 코드를 통해 1부터 10까지 더하는데 얼마나 걸렸나요?
어떻게 구할 수 있을까요?
이미 앞선 방법에서 스탑와치를 사용하는 것을 언급을 했기 때문에 아마 같은 방식으로 시도하려할 수도 있으리라 생각됩니다.
하지만, 다들 알잖아요? 컴퓨터의 계산속도는 무척이나 빠른거.
버튼을 누를 틈도 없이 계산이 될 것입니다!
그러면 얼마나 걸렸는지 어떻게 알 수 있을까요?
for
문이 실행되는 순간의 시간을 측정하고, 끝나는 직후의 시간을 측정한 뒤,
(실행이 끝난 시간) - (실행을 시킨 순간의 시간)
위와 같이 측정하면 될까요?
조금 당황스럽겠지만 정답입니다..! 이렇게 하면 컴퓨터가 문제를 푸는데 걸린 시간을 측정할 수 있습니다.
두 컴퓨터에서의 풀이 시간 측정
한가지만 더 생각해봅시다.
A컴퓨터에서 위 코드를 돌렸을때와 B컴퓨터에서 위 코드를 돌렸을 때 과연 시간이 같을까요?
아마 A컴퓨터와 B컴퓨터의 성능 차이가 있다고 하면 시간이 다르게 나올것입니다!
좋은 컴퓨터에서 당연히 더 빠르게 계산이 되겠죠.
이는 다시 말하면, 위 코드를 처리하는 속도를 가지고 두 컴퓨터의 성능을 비교할 수 있다는 말이며, 컴퓨터에 따라서 프로그램의 시간 측정이 달라진다는 말이기도 합니다.
단순 시간 측정의 문제점
문제를 푸는데 걸리는 시간을 왜 측정할까요?
여러 이유가 있겠지만, 그 목적 중 하나는 분석을 하거나 비교를 위해서 일 것입니다.
위에서 하나의 코드로 두 컴퓨터의 성능을 파악할 수 있었던 것처럼요.
그러면 하나의 컴퓨터에서 동작하는 코드에 대한 성능 비교는 어떻게 할 수 있을까요?
물론, 두 코드의 동작 시간을 측정해서 구할 수도 있을 것입니다.
그렇지만 이는 앞서서 말했듯이 컴퓨터의 성능에 따라서 달라지는 문제가 있습니다.
그리고 분석을 위해서는 항상 코드를 실행시켜봐야한다는 문제점이 있죠.
그래서, 똑똑한 컴퓨터 공학자들이 "코드를 실행하지 않고도 성능을 비교하는 방법은 없을까?" "컴퓨터 성능과 상관없이 코드의 성능을 파악할 수는 없을까?" 고민을 하기 시작했습니다.
그렇게 탄생한게 바로 빅오 표기법(Big O Notation)
입니다.
빅오 표기법(Big O Notation)
빅오 표기법. 과연 무엇일까요?
빅오 표기법은 보통 코드의 성능을 측정하기 위해서 쓰이는 새로운 계산 공식이자 방법입니다.
기억하세요. 계산 방법
이라는 것을요. 단순히 사칙연산이 아니라 조금 특별한 규칙을 갖는 계산 방법입니다.