Hash Map(해시 맵) 자료구조

2025-07-03


Hash Map (해시 맵)

Hash Map(해시 맵)은 키-값 쌍을 저장하는 자료구조로, 해시 함수를 이용해 데이터를 빠르게 조회할 수 있습니다.


동작 원리

  • 키를 해시 함수에 넣어 인덱스(버킷) 결정
  • 같은 인덱스에 여러 값이 들어오면 충돌(collision) 발생 → 체이닝, 오픈 어드레싱 등으로 해결
  • 평균적으로 O(1) 시간에 데이터 조회/삽입/삭제 가능

버킷(Bucket)이란?

버킷은 해시 맵에서 실제 데이터를 저장하는 공간입니다. 해시 함수가 키를 인덱스로 변환하면, 그 인덱스에 해당하는 버킷에 데이터가 저장됩니다.

예시:

  • 키 "apple" → 해시 함수 → 인덱스 3 → 버킷[3]에 저장
  • 키 "banana" → 해시 함수 → 인덱스 7 → 버킷[7]에 저장

해시 충돌 해결 방법

1. 체이닝(Chaining)

같은 버킷에 여러 데이터가 들어올 때, 연결 리스트(또는 다른 자료구조)로 연결하는 방법입니다.

버킷[3]: apple → orange → grape
버킷[7]: banana
  • 장점: 구현이 간단하고, 버킷이 가득 차도 계속 저장 가능
  • 단점: 특정 버킷에 데이터가 많이 몰리면 성능 저하

2. 오픈 어드레싱(Open Addressing)

같은 버킷에 데이터가 들어올 때, 다른 빈 버킷을 찾아서 저장하는 방법입니다.

주요 방식:

  • 선형 탐사(Linear Probing): 다음 버킷을 순차적으로 확인

  • 이차 탐사(Quadratic Probing): 제곱수만큼 건너뛰며 확인

  • 이중 해싱(Double Hashing): 두 번째 해시 함수로 다음 위치 결정

  • 장점: 메모리 효율적, 캐시 지역성 좋음

  • 단점: 삭제 시 복잡, 버킷이 가득 차면 저장 불가


장점과 단점

장점단점
빠른 조회/삽입/삭제해시 충돌 가능성
다양한 키 사용 가능순서 보장 X (언어마다 다름)
구현이 간단메모리 사용량 많을 수 있음

언어별 구현

  • Python: dict
  • JavaScript: Map, Object
  • Java: HashMap
  • C++: unordered_map

활용 예시

  • 빈도수 집계, 캐시, 데이터베이스 인덱스, 매핑 테이블 등

참고

  • 해시 함수의 품질이 성능에 큰 영향
  • 충돌 해결 방식에 따라 성능 차이 발생