컴퓨터 과학에서 빅오는 입력값이 커질 때 알고리즘의 실행 시간(시간 복잡도)과 함께 공간 요구사항(공간 복잡도)이 어떻게 증가하는지를 분류하는 데 사용되며, 알고리즘의 효율성을 분석하는 데에도 매우 유용하게 활용된다.
빅오 (O, big-O)란 입력값이 무한대로 향할 때 함수의 상한을 설명하는 수학적 표기 방법이다.
먼저 빅오는 점근적 실행 시간을 표기할 때 가장 널리 쓰이는 수학적 표기법 중 하나다. 점근적 실행 시간이란 입력값 n이 커질 때 즉 입력값이 무한대를 향할 때 lim 함수의 실행 시간의 추이를 의미한다.
점근적 실행시간은 달리 말하면 시간 복잡도라 할 수 있다. 시간 복잡도의 사전적 정의는 어떤 알고리즘을 수행하는 데 걸리는 시간을 설명하는 계산 복잡도를 의미하며, 계산 복잡도를 표기하는 대표적인 방법이 바로 빅오다. 빅오로 시간복잡도를 표현할 때는 최고차양만을 표기하며, 상수항을 무시한다.
예를 들어 입력값 n에 대해 4n^2+3n+4번 만큼 계산하는 함수가 있다면 이 함수의 시간 복잡도는 최고차항인 4n^2만을 고려한다.
· O(1) :입력값이 아무리 커도 실행 시간을 일정하다. 최고의 알고리즘이라고 할 수 있다. 또한 상수 시간에 실행된다 해도 상수값이 상상을 넘어설 정도로 크다면 사실상 일정한 시간의 의미가 없다.
· O(log n) :여기서부터 실행 시간은 입력값에 영향을 받는다. 그러나 로그는 매우 큰 입력값에도 크게 영향을받지 않는 편으로 웬만한 n의 크기에 대해서도 매우 견고하다.
· O(n) :입력값만큼 실행 시간에 영향을 받으며, 알고리즘을 수행하는 데 걸리는 시간은 입력값에 비례한다. 이러한 알고리즘을 선형 시간 알고리즘이라고 한다.
· O(nlogn) :병합 정렬을 비롯한 대부분의 효율 좋은 정렬 알고리즘이 이에 해당한다. 적어도 모든 수에 대해 한 번 이상은 비교해야 하는 비교 기반 정렬 알고리즘은 아무리 좋은 알고리즘도 O(nlogn)보다 빠를 수 없다.
· O(n^2) :버블 정렬 같은 비효율적인 정렬 알고리즘이 이에 해당한다.
· O(2^n) :피보나치 수를 재귀로 계산하는 알고리즘이 이에 해당한다. 간혹 n^2과 혼동하는 경우가 있는데 처음에는 비슷해 보이지만 2^n이 훨씬 더 크다.
· O(n!) :가장 느린 알고리즘으로, 입력값이 조금만 커져도 웬만한 다항 시간 내에는 계산이 어렵다.
지금까지 시간복잡도를 표현하는 빅오에 대해서 알아봤다. 빅오는 시간 복잡도 외에도 공간 복잡도를 표현하는 데에도 널리 쓰인다. 또한 알고리즘은 흔히 '시간과 공간 트레이드오프 관계' 라고 불린다. 이 말은 실행 시간이 빠른 알고리즘은 공간을 많이 사용하고, 공간을 적게 차지하는 알고리즘은 실행시간이 느리다는 얘기이다.
빅오는 상한을 의미한다. 이외에도 하한을 나타내는 빅오메가, 평균을 의미하는 빅세타가 있는데, 학계와 달리 업계에서는 빅세타와 빅오를 하나로 합쳐서 단순화해서 표현하려는 경향이 있다.
이번에는 파이썬이 어떤 자료형을 제공하는지, 이를 자료형에는 어떠한 특징이 있는지 알아보자.
모든 자료형을 일일이 언급하기엔 너무 많기 때문에 여기서는 주요 자료형을 중심으로 몇 가지만 살펴본다.