SW 전공

SW 전공 이론 학습

이론 목록으로 돌아가기

해시 테이블과 충돌 처리

해시 함수, 적재율, 체이닝과 개방주소법을 통해 평균 O(1) 탐색 원리를 이해한다.

예상 읽기 5

1. 해시 테이블

해시 테이블은 키를 해시 함수에 넣어 얻은 인덱스에 데이터를 저장한다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
index = h(key)

이상적인 경우 삽입·탐색·삭제의 평균 시간은 O(1)이다. 하지만 서로 다른 키가 같은 인덱스를 만들면 충돌(collision)이 발생한다.

좋은 해시 함수는 다음 성질을 가진다.

  • 계산이 빠르다.
  • 키를 테이블 전체에 고르게 분산한다.
  • 입력의 작은 차이가 결과에 충분히 반영된다.

2. 적재율

적재율 α는 저장 원소 수 n을 버킷 수 m으로 나눈 값이다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
α = n / m

적재율이 높아질수록 충돌 가능성과 탐색 시간이 증가한다. 임계값을 넘으면 더 큰 테이블을 만들고 모든 키를 다시 배치하는 재해싱(rehashing)을 수행할 수 있다.

3. 충돌 해결 방법

체이닝

각 버킷이 연결 리스트 등 별도 구조를 가리키도록 한다. 같은 해시값의 원소를 한 버킷의 체인에 저장한다.

  • 테이블보다 많은 원소도 저장 가능하다.
  • 링크 공간이 추가로 필요하다.
  • 특정 버킷에 원소가 몰리면 탐색이 느려진다.

개방주소법

모든 원소를 해시 테이블 배열 안에 저장하고 충돌 시 다른 빈 칸을 찾는다.

  • 선형 조사: h(k), h(k)+1, h(k)+2, ...
  • 이차 조사: 제곱 간격으로 이동한다.
  • 이중 해싱: 두 번째 해시 함수로 이동 간격을 정한다.

선형 조사는 구현이 단순하지만 연속된 칸에 원소가 몰리는 1차 군집화가 발생할 수 있다. 삭제 시 단순히 빈 칸으로 만들면 탐색 연결이 끊길 수 있으므로 삭제 표시(tombstone)를 사용하는 구현이 많다.

4. 예시

테이블 크기가 7이고 h(k)=k mod 7일 때 키 10, 17, 24는 모두 인덱스 3을 만든다.

  • 체이닝: 3번 버킷의 연결 리스트에 세 키를 저장한다.
  • 선형 조사: 10은 3, 17은 4, 24는 5에 저장할 수 있다.

5. 복잡도와 사용 조건

연산평균최악
탐색·삽입·삭제O(1)O(n)

최악의 경우는 모든 키가 같은 버킷으로 몰리거나 긴 조사 구간이 생기는 경우이다. 해시 테이블은 빠른 정확 일치 탐색에 적합하지만 정렬 순서나 범위 탐색에는 일반적으로 적합하지 않다.

6. 해시 함수와 테이블 크기

정수 키에는 나눗셈법 h(k)=k mod m을 자주 사용한다. m을 2의 거듭제곱으로만 두면 키의 하위 비트 분포에 지나치게 의존할 수 있어, 문제 조건에 따라 소수 크기를 쓰기도 한다. 문자열은 각 문자를 누적하는 다항 해시를 사용할 수 있다.

PYTHON코드 영역 안에서 좌우로 이동할 수 있습니다.
def poly_hash(s, m, base=31):
    h = 0
    for ch in s:
        h = (h * base + ord(ch)) % m
    return h

암호학적 해시와 자료구조용 해시는 목적이 다르다. 자료구조용은 빠른 분산이 핵심이고, 암호학적 해시는 역상·충돌 공격 저항 같은 보안 성질이 추가로 필요하다.

7. 개방주소법 조사식

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
선형 조사: h_i(k) = (h(k) + i) mod m
이차 조사: h_i(k) = (h(k) + c1·i + c2·i²) mod m
이중 해싱: h_i(k) = (h1(k) + i·h2(k)) mod m

이중 해싱에서 h2(k)와 테이블 크기 m이 서로소이면 모든 칸을 순회할 가능성을 확보할 수 있다.

8. 삽입 추적 예제

크기 11, h(k)=k mod 11, 선형 조사로 22, 1, 13, 11, 24를 삽입한다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
22 → 0
1  → 1
13 → 2  (13 mod 11=2)
11 → 3  (0,1,2 충돌)
24 → 4  (2,3 충돌)

연속된 군집이 길어질수록 새 키가 군집 끝에 붙는 1차 군집화가 심해진다.

9. 삭제와 탐색 상태

개방주소법의 슬롯은 적어도 세 상태를 구분한다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
EMPTY: 한 번도 사용하지 않음 → 탐색 종료 가능
OCCUPIED: 키가 있음
DELETED: 과거 사용 후 삭제 → 탐색은 계속, 삽입에는 재사용 가능

DELETEDEMPTY로 바꾸면 충돌로 뒤에 저장된 키를 찾지 못할 수 있다. tombstone이 너무 많아져도 성능이 떨어지므로 재해싱으로 정리한다.

10. 체이닝 성능 해석

균등 해싱을 가정하면 체인의 평균 길이는 적재율 α=n/m 정도이다. 성공·실패 탐색 비용은 대략 O(1+α)로 해석한다. 개방주소법은 α<1이어야 하며 α가 1에 가까워질수록 조사 길이가 급격히 늘어난다.

11. 사용 판단

  • 정확 일치 조회: 해시가 강함
  • 정렬 순회·범위 검색: 균형 트리나 정렬 배열이 유리
  • 최악 시간 보장이 중요한 실시간 경로: 해시 충돌의 최악 O(n)을 고려
  • 키 순서가 필요하지 않고 삽입·조회가 매우 빈번: 해시가 적합

최종 확인 문제

  1. 크기 10인 개방주소 해시 테이블에 원소 7개가 있을 때 적재율을 구하시오.
  2. 크기 7, h(k)=k mod 7, 선형 조사로 10, 17, 24, 31을 삽입한 위치를 쓰시오.
  3. 개방주소법에서 삭제 슬롯을 EMPTY가 아닌 DELETED로 표시하는 이유는 무엇인가?
  4. 이중 해싱의 두 번째 해시값과 테이블 크기가 서로소인 것이 유리한 이유를 설명하시오.
  5. 자료구조용 해시와 암호학적 해시의 목적 차이를 한 가지 쓰시오.