[용어정리] 시간복잡도 (Time Complexity)

시간복잡도 (Time Complexity)

대표적인 시간 복잡도 및 시간 복잡도의 의미

알고리즘 문제에는 시간제한이 있으며, 실제 프로그래밍 시에도 오래 걸리는 프로그램은 퀄리티가 떨어지므로 시간복잡도 즉, 수행 시간을 추정해보는 과정은 중요하다.

[ 대표적인 시간 복잡도 / 시간 복잡도의 의미(풀이 유형) ]

> 알고리즘 문제에는 시간제한이 있으며, 실제 프로그래밍 시에도 오래 걸리는 프로그램은 퀄리티(제품성)가 떨어지므로

시간 복잡도 즉, 수행 시간을 추정해보는 과정은 중요하다.

> 다음의 대표적인 시간 복잡도를 알아보며, 대표적인 문제상황과 그 예상 수행 시간을 추정해볼 수 있다.

> 다음에서 N은 입력 데이터를 일반화한 값으로, N=1억(10^8)이면, 대략 수행 시간은 1초가 걸린다.

> 즉, 문제에서 주어진 가장 큰 입력 범위를 N에 넣었을 때 1억 정도가 나온다면, 그 알고리즘은 유효하다.

> 시간 복잡도 : N에 넣을 수 있는 최대 유효값(결과가 1억 근사치로 나오는 값) // 해당 시간 복잡도의 의미(풀이 유형)

- O(1) : SKIP // 단순 계산(a+b와 같은 연산, 배열에 접근하는 연산)

- O(lgN) : SKIP // N 개를 절반으로 계속해서 나눔

- O(NlgN) : 5백만 //

- O(N) : 1억 // 1중 for 문

- O(N^2) : 1만 // 2중 for 문

- O(N^3) : 500 // 3중 for 문

- O(2^N) : 20 // 크기가 N인 집합의 부분 집합

- O(N!) : 10 // 크기가 N인 수열

* ‘//’ 뒤에 적힌 시간 복잡도의 의미는 대부분 저 시간 복잡도에 해당하는 ‘대부분’의 경우(풀이 유형)를 의미하며, ‘항상’ 유효하다는 의미는 아니다.

* [ 시간 복잡도의 의미(풀이 유형)를 알아두는 것은 중요한 이유 ]

\0. 알고리즘을 구현하기 전,

\1. 어떻게 구현해야겠다를 결정한 뒤

\2. 시간 복잡도를 계산하여 생각한 알고리즘이 제한 시간 안에 처리 가능한지 확인

\3. 프로그래밍하는 것이 중요하기 때문이다. // 소중한 개발 시간을 낭비하지 않기 위해

[ 시간 복잡도 계산 방법(의 유형) ]

> Big O Notation에서 상수는 버린다.

> 두 가지 항이 있을 때, 변수가 같으면 큰 것만 빼고 다 버린다.

> 두 가지 항이 있는데 변수가 다르면 놔둔다.

Ex. O(N*M)