← 질문 목록
#14깊이 0
해시 테이블의 평균 O(1)이 무너지는 경우는?
키가 한 버킷으로 몰릴 때다. 평균 O(1)은 해시가 고르게 흩어진다는 전제 위의 값이다. 그 전제가 깨지면 최악 O(n)으로 간다. 완화는 충돌한 것을 어떻게 담느냐와 언제 늘리느냐 두 갈래다.
| 갈래 | 하는 일 | 최악을 어디까지 |
|---|---|---|
| 담는 방식 | 한 버킷이 길어지면 연결 리스트를 트리로 | O(n) → O(log n) |
| 늘리는 시점 | load factor를 넘으면 버킷을 두 배로 | 애초에 안 몰리게 |
자바 HashMap은 둘을 함께 쓴다. 앞쪽은 이미 몰린 뒤의 방어고, 뒤쪽은 몰리기 전의 예방이다.
몰리는 이유는 둘이다. 해시 함수가 나빠서 자연히 겹치거나, 누군가 일부러 겹치게 만들거나. 뒤쪽이 해시 충돌 공격인데, 사용자 입력이 그대로 키가 되는 자리에서는 실제 공격 벡터가 된다.
늘리는 것 자체에도 값이 있다. 리사이즈는 모든 키를 다시 배치하므로 그 한 번이 무겁다. 분할 상환하면 평균은 O(1)이지만 평균이 지연을 보장하지는 않는다 — 응답 시간이 중요한 경로에서는 이 한 번이 튀는 지점으로 나타난다.
나머지 연산 대신 비트 마스크를 쓸 수 있어서다. 대신 하위 비트만 보게 되므로 해시를 한 번 더 섞어야 한다.
추천 꼬리질문
관련 질문
- 해시 충돌 발생 시 해결 방법은 무엇인가?자료구조 · 알고리즘해시 테이블의 평균 O(1)이 무너지는 핵심 원인이 해시 충돌이므로 두 개념은 직결된다.
- 해시 충돌을 해결하는 두 방식의 차이는 무엇인가?자료구조 · 알고리즘해시 테이블의 시간 복잡도가 무너지는 이유는 해시 충돌이 빈번하게 발생하기 때문이므로, 충돌 해결 방식에 대한 이해가 선행되어야 한다.
- 해시 충돌이 생기면 어떤 방법으로 푸는가?자료구조 · 알고리즘해시 충돌 발생 시의 해결 방법은 해시 테이블의 연산 효율성이 저하되는 상황을 다루기 위한 필수 개념이다.
- 해시 충돌이 발생했을 때의 해결책은 무엇인가?자료구조 · 알고리즘해시 테이블의 시간 복잡도가 무너지는 이유는 해시 충돌이 빈번하게 발생하기 때문이다.
- HashMap은 해시 충돌을 어떤 방식으로 처리하는가?언어 · 런타임