Link Search Menu Expand Document
List, Set, Dict 자료형에 따른 시간 복잡도(Big-O)
Table of contents
  1. List
  2. Set
  3. Dict
  4. Ref.

백준 1920번 문제를 풀다가 거의 똑같은 코드임에도 불구하고, 자료형에 따라 결과가 달라진다는 사실을 알고 자료형에 따른 시간 복잡도를 알아봐야겠다는 생각이 들었다. (백준 1920번 문제에서 list를 탐색했을 때는 시간 초과였지만, list에서 set 자료형으로 형변환 후 탐색했을 때는 통과했다.)

파이썬의 주요 함수와 메서드의 시간 복잡도를 정리한 페이지를 찾아서 확인해본 결과, 삽입(insert, pop), 제거(delete, remove), 탐색(check ==, ≠), 포함 여부 확인(containment)의 경우 List 자료형에서는 모두 시간 복잡도 $O(N)$을 가지고 있고, Set과 Dict는 모두 $O(1)$의 시간 복잡도를 갖고 있다는 것을 확인할 수 있다.

따라서 삽입, 제거, 탐색, 포함 여부 확인과 같은 연산이 자주 필요하다면 List 자료형보다 Set이나 Dict 자료형을 사용하는 것이 시간 복잡도 측면에서 더 좋을 것이다.

List

OperationExampleBig-ONotes
Indexl[i]O(1) 
Storel[i] = 0O(1) 
Lengthlen(l)O(1) 
Appendl.append(5)O(1)mostly: ICS-46 covers details
Popl.pop()O(1)same as l.pop(-1), popping at end
Clearl.clear()O(1)similar to l = []
Slicel[a:b]O(b-a)l[1:5]:O(l)/l[:]:O(len(l)-0)=O(N)
Extendl.extend(…)O(len(…))depends only on len of extension
Constructionlist(…)O(len(…))depends on length of … iterable
check ==, !=l1 == l2O(N) 
Insertl[a:b] = …O(N) 
Deletedel l[i]O(N)depends on i; O(N) in worst case
Containmentx in/not in lO(N)linearly searches list
Copyl.copy()O(N)Same as l[:] which is O(N)
Removel.remove(…)O(N) 
Popl.pop(i)O(N)O(N-i): l.pop(0):O(N) (see above)
Extreme valuemin(l)/max(l)O(N)linearly searches list for value
Reversel.reverse()O(N) 
Iterationfor v in l:O(N)Worst: no return/break in loop
Sortl.sort()O(N Log N)key/reverse mostly doesn’t change
Multiplyk*lO(k N)5l is O(N): len(l)l is O(N**2)

Set

OperationExampleBig-ONotes
Lengthlen(s)O(1) 
Adds.add(5)O(1) 
Containmentx in/not in sO(1)compare to list/tuple - O(N)
Removes.remove(..)O(1)compare to list/tuple - O(N)
Discards.discard(..)O(1) 
Pops.pop()O(1)popped value “randomly” selected
Clears.clear()O(1)similar to s = set()
Constructionset(…)O(len(…))depends on length of … iterable
check ==, !=s != tO(len(s))same as len(t); False in O(1) if the lengths are different
<=/<s <= tO(len(s))issubset
/>=/>s >= tO(len(t))issuperset s <= t == t >= s
UnionstO(len(s)+len(t))
Intersections & tO(len(s)+len(t)) 
Differences - tO(len(s)+len(t)) 
Symmetric Diffs ^ tO(len(s)+len(t)) 
Iterationfor v in s:O(N)Worst: no return/break in loop
Copys.copy()O(N) 

Dict

OperationExampleBig-ONotes
Indexd[k]O(1) 
Stored[k] = vO(1) 
Lengthlen(d)O(1) 
Deletedel d[k]O(1) 
get/setdefaultd.get(k)O(1) 
Popd.pop(k)O(1) 
Pop itemd.popitem()O(1)popped item “randomly” selected
Cleard.clear()O(1)similar to s = {} or = dict()
Viewd.keys()O(1)same for d.values()
Constructiondict(…)O(len(…))depends # (key,value) 2-tuples
Iterationfor k in d:O(N)all forms: keys, values, items

Ref.


Page last modified: Feb 9 2021 at 12:02 PM.