map vs. unordered_map

map

  • 레드 블랙 트리 기반
    • 검색속도가 빠른 Binary Search Tree(BST) + Self-Balancing 기능을 추가
  • O(logN)을 보장하는 수준으로 Balancing
  • 키 값의 분포가 고르지 못할 경우 node rotation에 대한 비용이 계속 발생하기에 Insert / Delete 성능이 저하
  • 물론 최악의 경우에도 O(logN)의 성능은 보장

unordered_map

  • 해시 테이블 기반의 hash container
  • node 정렬할 필요가 없음
  • 주어진 테이블의 크기가 충분하다면 insert/delete/search의 성능을 보장

Key가 int인 경우

  • map은 캐시 미스로 인하여 데이터량이 많아질 경우 소요 시간이 증가
  • unordered_map은 O(1)의 시간 복잡도 유지

Key가 문자열(const char*)인 경우

  • map은 insert 할 시, 문자열 전체를 hashing 하지 않고 비교 함수를 통해 정렬
    • 문자열 비교 함수 성능 > 문자열 전체 hashing
    • 문자열 비교 함수 성능
      • 앞 글자부터 한 글자씩 차례로 비교하여 크고 작음을 분별
      • 문자열 길이에 크게 퍼포먼스 영향을 받지 않음
      • key 문자열의 접두사가 같거나 유사하면 비교 함수의 성능은 저하됨
      • key 문자열의 분포가 고르면 map의 성능이 우수
    • 문자열 전체 hashing
      • 문자열 길이가 길수록 key hashing 성능(unordered_map)은 저하

결론

  1. 데이터가 많은 경우에는 unordered_map 이 map 보다 우수한 퍼포먼스
  2. 문자열을 키로 사용하는 경우 문자열이 길어질수록 성능은 map > unordered_map
  3. 유사도가 높은 문자열 집합을 키로 사용하는 경우에는 map 의 성능이 저하

적은 데이터의 경우 성능이 unordered_map < map인 이유?

  • hash function 연산 비용 + hash table 탐색 시간 소요
  • ordered_map은 key 자체로 탐색을 하기 때문에 상대적으로 빠름
  • 데이터가 많아질수록 hash 탐색이 유리해진다고 보면 됨

출처

Categories: ,

Updated: