Python - List, Set, Dict 자료형에 따른 시간 복잡도

작성일

2 분 소요

백준 1920번 수 찾기 문제를 풀면서 list 안에서 특정 값을 찾을 땐 시간 초과….
set 안에서 특정 값을 찾을 땐 통과!!

이런 상황을 겪고 나니 시간복잡도에 대한 생각이 더 필요하다고 느껴졌음

Complexity of Python Operations 를 보면 삽입(insert, pop), 제거(delete, remove), 탐색(check==, $\ne$), 포함 여부 확인(containment) 의 경우 List 자료형의 경우 모두 시간 복잡도 $O(N)$ 이고 Set, Dict 는 $O(1)$ 임을 확인할 수 있음

따라서 삽입, 제거, 탐색, 포함 여부 확인과 같은 연산이 필요한 알고리즘 문제에서 시간초과가 나는 경우 List 보다는 Set 이나 Dict 자료형을 사용해야 함을 기억하자!

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) mostly: ICS-46 covers details
Pop l.pop() O(1) same as l.pop(-1), popping at end
Clear l.clear() O(1) similar to l = []
Slice l[a:b] O(b-a) l[1:5]:O(l)/l[:]:O(len(l)-0)=O(N)
Extend l.extend(…) O(len(…)) depends only on len of extension
Construction list(…) O(len(…)) depends on length of … iterable
check ==, != l1 == l2 O(N)  
Insert l[a:b] = … O(N)  
Delete del l[i] O(N) depends on i; O(N) in worst case
Containment x in/not in l O(N) linearly searches list
Copy l.copy() O(N) Same as l[:] which is O(N)
Remove l.remove(…) O(N)  
Pop l.pop(i) O(N) O(N-i): l.pop(0):O(N) (see above)
Extreme value min(l)/max(l) O(N) linearly searches list for value
Reverse l.reverse() O(N)  
Iteration for v in l: O(N) Worst: no return/break in loop
Sort l.sort() O(N Log N) key/reverse mostly doesn’t change
Multiply k*l O(k N) 5l is O(N): len(l)l is O(N**2)

Set

Operation Example Big-O Notes
Length len(s) O(1)  
Add s.add(5) O(1)  
Containment x in/not in s O(1) compare to list/tuple - O(N)
Remove s.remove(..) O(1) compare to list/tuple - O(N)
Discard s.discard(..) O(1)  
Pop s.pop() O(1) popped value “randomly” selected
Clear s.clear() O(1) similar to s = set()
Construction set(…) O(len(…)) depends on length of … iterable
check ==, != s != t O(len(s)) same as len(t); False in O(1) if the lengths are different
<=/< s <= t O(len(s)) issubset
/>=/> s >= t O(len(t)) issuperset s <= t == t >= s
Union s $\mid$ t O(len(s)+len(t))  
Intersection s & t O(len(s)+len(t))  
Difference s - t O(len(s)+len(t))  
Symmetric Diff s ^ t O(len(s)+len(t))  
Iteration for v in s: O(N) Worst: no return/break in loop
Copy s.copy() O(N)  

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.get(k) O(1)  
Pop d.pop(k) O(1)  
Pop item d.popitem() O(1) popped item “randomly” selected
Clear d.clear() O(1) similar to s = {} or = dict()
View d.keys() O(1) same for d.values()
Construction dict(…) O(len(…)) depends # (key,value) 2-tuples
Iteration for k in d: O(N) all forms: keys, values, items

참고

댓글남기기