시간 복잡도와 공간 복잡도

작성일

알고리즘 평가할 때 시간 복잡도와 공간 복잡도를 사용함

  • 시간 복잡도: 알고리즘의 수행시간을 평가
  • 공간 복잡도: 알고리즘 수행에 필요한 메모리 양을 평가


시간 복잡도

시간 복잡도는 알고리즘의 수행시간을 나타냄.

시간 복잡도를 낮출 수 있다면 프로그램에 큰 성능 향상을 기대할 수 있음


O(1) - 상수 시간

입력 크기(N)에 상관없이 일정한 연산을 수행


O(logN) - 로그 시간

입력 크기(N)가 커질 때 연산 횟수가 logN에 비례해서 증가

for (i=1; i<=n; i*2) {}


O(n) - 선형 시간

입력 크기(n)가 커질 때 연산 횟수가 n에 비례해서 증가하면 시간 복잡도는 O(n).

  • 연산횟수가 선형적으로 증가하는 형태
for (i=0; i<n; i++) {}


O(N^2) - 2차 시간

입력 크기(n)가 커질 때 연산 횟수가 n^2에 비례해서 증가

예) 중첩 for문…


O(2^N) - 지수 시간

입력 크기가 커질 때 연산수가 2^N에 비례해서 증가

예) 피보나치 수열…


Untitled


파이썬 주요 함수, 메소드의 시간 복잡도

list

Operation Example Big-O Notes
Index l[i] O(1)  
Store l[i] = 0 O(1)  
Length len(l) O(1)  
Append l.append(5) O(1)  
Pop l.pop() O(1) l.pop(-1) 과 동일
Clear l.clear() O(1) l = [] 과 유사
Slice l[a:b] O(b-a) l[:] : O(len(l)-0) = O(N)
Extend l.extend(…) O(len(…)) 확장 길이에 따라
Construction list(…) O(len(…)) 요소 길이에 따라
check ==, ≠ l1 == l2 O(N) 비교
Insert l.insert(i, v) O(N) i 위치에 v를 추가
Delete del l[i] O(N)  
Remove l.remove(…) O(N)  
Containment x in/not in l O(N) 검색
Copy l.copy() O(N) l[:] 과 동일 - O(N)
Pop l.pop(i) O(N) l.pop(0):O(N)
Extreme value min(l)/max(l) O(N) 검색
Reverse l.reverse() O(N) 그대로 반대로
Interation for v in l: O(N)  
Sort l.sort() O(N Log N)  
Multiply k*l O(k N) [1,2,3] * 3 » O(N**2)


Dict

Operation Example Big-O Notes
Index d[k] O(1)  
Store d[k] = v O(1)  
Length len(d) O(1)  
Delete del d[k] O(1)  
get/setdefault d.method O(1)  
Pop d.pop(k) O(1)  
Pop item d.popitem() O(1)  
Clear d.clear() O(1) s = {} or = dict() 유사
View d.keys() O(1) d.values() 동일
Construction dict(…) O(len(…))  
Iteration for k in d: O(N)  


공간 복잡도

공간 복잡도는 알고리즘에서 사용하는 메모리 양을 나타냄.

공간 복잡도는 보조공간과 입력 공간을 합친 포괄적인 개념. 보조 공간은 알고리즘이 실행되는 동안 사용하는 임시 공간