[자료구조] unordered_map과 hash map

윤정민·2023년 12월 6일
0

Data structure

목록 보기
3/3

1. std::unordered_map

  • HashTable로 구현된 자료구조
  • 탐색 시간이 O(1)로 상수시간복잡도를 가짐
  • 요소의 삽입/삭제가 빈번합 경우 사용될 수 있음

2. structure

unordered_map의 경우 일반적인 map과 달리 key값을 기준으로 정렬하지 않는다. 그렇다면 더 느린 시간복잡도를 가진다고 생각하겠지만 HashTable을 사용해 이를 해결했다.

[동작 구조]
1. 해시함수에 key값을 넣어 반환 값을 받는다.
2. 반환 값을 bucket의 index로 사용해 value를 알 수 있다.

3. hash collision

key값은 무한하지만 bucket의 사이즈는 유한하기 때문에 다른 key값이더라도 해시 함수는 같은 값을 반환할 수 있다. 이러한 문제를 어떻게 해결할까?

3.1. 체이닝

  • 해시 충돌이 발생한다면 인덱스에 추가로 이어서 저장하는 방법
  • 삽입 삭제가 쉬운 list로 구현하는 것이 효과적
  • 탐색시간이 증가

3.2. 개방 번지화

  • 해시 충돌이 발생하면 반환값을 버리고 다른 index에 value를 할당하는 방법
  • 다른 index를 할당하는 규칙이 존재해야 함
    • 선형 탐사: 고정된 폭으로 탐사하는 기법
      • 다음 인덱스를 확인
      • value가 특정 부분에 밀집되는 클러스터 현상이 발생하기 쉬움
      • 밀집된 경우 탐색 시간이 길어짐
    • 제곱 탐사: 이차식을 통해 인덱스를 구해 한 곳에 데이터가 집중되지 않도록 하는 기법
      • 같은 해시값이 나온다면 동일한 과정을 거치기 때문에 2차 클러스터가 발생가능
    • 이중 해싱: 또 다른 해시 함수를 사용해 증가폭을 구한 뒤 인덱스를 증가시켜 비어있는 곳을 탐색하는 기법
profile
그냥 하자

0개의 댓글