Set / Map

  • Set : 값을 저장할 수 있는 컨테이너
  • Map : 키, 값을 저장할 수 있는 컨테이너

Red-Black Tree를 사용해 키의 순서를 유지

탐색속도 : O(logN)

언제 사용하는 가?(Set기준이지만 Map도 비슷하다고 생각)

  • 정렬된 데이터가 필요할 때
  • (정렬된 순서로) 데이터를 출력/접근을 해야할 때
  • element의 앞/뒤(pre/next or prodecessor/successor)가 필요할 때
  • 정렬된 셋으로부터 element에 binary_search(), lower_bound() and upper_bound()같은 함수들을 사용해야할 때
    • 이 함수들은 unordered_set()을 지원하지 않음
  • BST가 Hash table보다 더 좋을 때
    • hashing보다 BST가 커스터마이징이 쉽다.
      • hashing을 일반적으로 프로그래밍 언어에서 제공하는 라이브러리에 의존한다.
    • BST는 모든 operation이 O(log(n))시간내에 작동하도록 보장된다. 그러나 Hashing의 경우, O(1)은 평균 시간이며, 특히 테이블 크기가 조정될 때 일부 특정 작업을 비용이 많이 들 수 있다.

 

unordered Set / Map

hash table을 사용해 키의 순서를 유지하지 않는다.

키의 순서를 유지할 필요가 없기 때문에 탐색 속도등에 유리한 점을 가진다.

삽입된 순서가 아닌 랜덤순으로 데이터가 저장된다.

탐색속도 : O(1)

언제 사용하는 가?(Set기준이지만 Map도 비슷하다고 생각)

  • 정렬되지않고 구분된 요소들을 유지할 때
  • 순회 없이 하나의 요소에 대한 접근이 필요할 때

 

 

Key의 종류에 따른 탐색속도 비교(Map 기준)

환경 :  Intel i7-3550 3.3GHz, Windows 7 SP1, VC++ 10 SP1

x 축 : 데이터 크기 N

y 축 : 탐색 1회에 걸린 시간(µs)

int형 key const char*형 key
- hash함수로 sdbm hash 함수 사용
map : O(logN)
unordered_map : O(1), N이 32부터 유리
unordered_map(bypass) : unordered_map에 비해 2배 빠름, N이 6부터 유리
  • hash 단계에 시간을 소모하지 않음
M(문자열 길이)의 크기가 커질수록 map과 unordered_map의 성능이 교차하는 점이 같이 커진다.
-> M이 커질수록 map이 유리한 N의 범위가 커진다.
  • M=4일때, ratio가 1이 되는 지점은 N=128~256 지점
  • M=16일때, ratio가 1이 되는 지점은 N=512~1024 지점
시간복잡도(N은 elemenet 개수)
  • map : O(logN^2) + O(M)
  • unordered_map : O(M) + O(M)
=> map은 M의 길이에 덜 반응하고 unordered_map은 M의 길이에 민감하기 때문에 M이 커짐에 따라 map보다 unordered_map의 속도 저하가 커질 수 있다.

차이 정리

                |     set             | unordered_set
---------------------------------------------------------
Ordering        | increasing  order   | no ordering
                | (by default)        |

Implementation  | Self balancing BST  | Hash Table
                | like Red-Black Tree |  

search time     | log(n)              | O(1) -> Average 
                |                     | O(n) -> Worst Case

Insertion time  | log(n) + Rebalance  | Same as search
                      
Deletion time   | log(n) + Rebalance  | Same as search

 

참조 사이트

+ Recent posts