프로그램에 입력되는 자료 N의 범위에 따라 연산 횟수가 많아질수록 좋지 못한 코드이고(입력 자료 대비 수행시간이 오래 걸림) 반대로 자료 N의 범위가 무엇이든 간에 연산 횟수가 일정한 연산 횟수에 수렴하거나 더 이상 증가하지 않는 경우 좋은 코드(수행시간이 적게 걸림)라고 할 수 있다.
알고리즘 시간 복잡도 계산 예제
예제 1) 리스트에 있는 모든 항들의 값을 더하는 프로그램
#########################
array= [1,2,3,4,5,6]
summary = 0
#########################
forxinarray:
summary += x
#########################
print(summary)
이의 소스코드에서 가운데 for문이 있는 구간에서는 자료의 갯수 N에 따라 그에 비례하여 덧셈 연산이 반복될 것이다.
이외의 부분에서는 프로그램이 한번 실행될 때 자료의 갯수에 상관없이 한번만 실행되는 상수시간의 연산시간이 소요될 것이다.
우리는 앞서 배웠듯이 극학의 개념을 적용하여 최고차항에 대한 연산 횟수르 고려하기 때문에 단지 for문에 의한 연산 횟수 의 시간복잡도 O(N)이라고 할 수 있다.
예제2) 2중 반복문
array =[1,2,3,4,5]
###########################
forxinarray:
foryinarray:
k = x*y
print(k)
해당 예제 역시 이중 for문에 의한 연산시간 만 고려하면 되기 때문에 O(N^2)의 시간복잡도를 갖는다.
만약 for문안의 연산이 상수시간정도 걸리는 연산들이 있다고 해도 결과적으로 N*N(1+2+...)이기때문에 이 역시 O(N^2)의 시간복잡도를 갖는다고 할 수 있다.
수행시간 실측 Tip
CPU는 대략 1초에 5000만번의 연산을 수행한다.
5억 번의 연산 횟수 기준, python의 경우 5~15초(코딩테스트에서 pypy를 지원한다면 수행시간이 단축될 수도 있지만 항상그런것은 아니다.) , C언어의 경우 1~3초 가량의 시간이 소요된다.
코딩테스트에서는 주어진 시간제한이 없다면 약 1~5초 정도라고 생각해야 한다.
시간 복잡도를 고려한 설계 매뉴얼은 대략 다음과 같다.
만약 문제에서 시간제한이 1초라고 했을 때
N의 범위가 500인 경우 O(N^3)으로 설계해야 한다.
N의 범위가 2,000인 경우 O(N^2)으로 설계해야 한다.
N의 범위가 100,000인 경우 O(NlogN)으로 설계해야 한다.
N의 범위가 10,000,000인 경우 O(N)으로 설계해야한다.
즉, N의 범위가 많을수록 일반적인 연산시간이 증가할 수 있기 때문에 알고리즘 성능시간을 줄일 수 있는 방향으로 설계해야 한다.