Post

[알고리즘] 탐색2 - 해시 테이블

해시 테이블

  • 각 위치(슬롯)마다 주소가 부여되어 있는 저장공간으로 기본적으로 배열의 형태로 볼 수 있다.
  • 해싱 : 탐색 키 값을 활용하여 해시 테이블의 주소를 계산하는 방법

해시 함수

  • 키 값을 테이블의 주소로 변환하는 함수
  • 서로 다른 키 값이 해시 테이블의 같은 주소로 변환되는 충돌이 적게 발생되도록 해야 한다.

정수를 위한 해시 함수

입력 데이터가 정수인 경우에 적합

  • 제산 잔여법
    • h(K) = K mod M (K: 키 값, M: 해시 테이블의 크기)
    • M의 값은 2의 거듭제곱과 상당한 차이가 있는 소수로 선택하는 것이 바람직하다.
  • 비닝
    • 키의 집합 U를 M등분하여 각 등분을 각 슬롯으로 해시하는 방법
    • 만약 키 값의 범위가 0~999까지의 정수이고 해시 테이블의 크기가 10이면 키 값을 1000/10=100 개씩 나눠서 각 슬롯에 해시한다.
  • 중간 제곱법
    • 주어진 키값을 제곱하여 제곱한 결과에서 하위 m을 버리고, M에 해당하는 하위 r비트를 취한다.

문자열을 위한 해시 함수

입력 데이터가 문자열인 경우에 적합

  • 비닝
    • 키의 집합 U를 M등분하여 각 등분을 각 슬롯으로 해시하는 방법
    • 문자열의 앞쪽 일부를 해시 결과로 사용한다.
    • 문자열의 앞쪽의 분포가 고르지 못하면 결과가 슬롯에 고르게 분포되지 못함
  • 단순 합
    • 각 문자의 코드값을 합한 후 제산 잔여법 적용
    • 짧은 문자열에는 비효과적
    • 문자의 출현 순서는 고려되지 않음(h(‘ABC’) = h(‘BCA’))
  • 가중 합
    • 각 문자의 코드값에 자리에 따른 가중치를 곱한 값을 합한 후 제산 잔여법을 적용
    • 문자의 출현 순서를 고려한다. (h(‘ABC’) != h(‘BCA’))

충돌 해결 방법

충돌 : 서로 다른 키 값 x,y에 대하여 h(x)=h(y)인 경우

개방 해싱 (연쇄법)

  • 충돌된 데이터를 테이블 밖의 별도 장소에 저장/관리, 연결 리스트 사용
  • 해싱 테이블의 각 슬롯을 연결 리스트의 헤더로 사용
  • 해시 테이블과 연결 리스트가 주기억장치 내에서 유지될 때 적합

폐쇄 해싱 (개방 주소법)

  • 해시 테이블의 다른 슬롯에 충돌된 데이터를 저장/관리
  • 종류 : 버킷 해싱, 선형 탐사, 이차 탐사, 이중 해싱
  • 버킷 해싱 : 해시 테이블 슬롯을 버킷으로 묶어 버킷 단위로 해싱하고 버킷이 꽉 찼다면 데이터는 해시 테이블 끝의 오버플로 버킷에 저장된다.
  • 선형 탐사 : 홈 위치가 사용 중이라면 빈 슬롯을 찾을 때까지 해시 테이블의 바로 다음 슬롯으로 순차적으로 이동. 만약 해시 테이블의 끝에 도달하면 다음 탐사 순서는 해시 테이블의 시작 위치이다.
    • 모든 슬롯이 새로운 데이터가 삽입될 후보가 됨
    • 1차 클러스터링이 발생하는 문제가 있다.
  • 이차 탐사 : 탐사 순서의 계산에 이차식을 이용
    • 충돌이 발생하는 횟수의 제곱 형태로 탐사 순서를 결정
    • 서로 다른 홈 위치를 갖는 두 키는 서로 다른 탐사 순서를 가짐
    • 모든 슬롯이 탐사 순서에 사용되지 않음
    • 2차 클러스터링이 발생하는 문제가 있다.
  • 이중 해싱 : 탐사 순서를 원래의 키값을 이용하여 해싱
    • 1차,2차 클러스터링 문제해결
    • 서로 다른 두 키의 홈 위치가 동일해도 서로 다른 탐사 순서를 가짐
    • 좋은 이중 해싱을 구하려면 탐사 순서에 있는 모든 상수가 해시 테이블의 크기 M과 서로 소가 되어야 함

삭제 연산

  • 데이터의 삭제가 차후의 탐색을 방해하지 않아야 한다.
  • 삭제로 생긴 빈 슬롯은 나중에 삽입 과정에서 사용되어야 한다.

비석

  • 삭제된 데이터의 위치에 ‘비석’이라는 특별한 표시를 하는 방법
    • 탐색 : 탐색하는 동안 비석을 만나면 탐색을 계속 진행
    • 삽입 : 비석이 표시된 위치를 빈 위치로 간주하여 새 데이터 삽입
  • 비석의 개수가 증가할수록 평균 탐색 거리가 증가한다.
This post is licensed under CC BY 4.0 by the author.