[자료구조] Hash Table

Yodi.Song·2021년 1월 4일
0

해시 테이블

해시 테이블은 Key에 Value를 저장하는 자료구조

구조

해시 테이블은 key, hash 함수, 해시, value, 저장소(bucket, slot) 으로 구성된다.

key는 hash 함수를 통해 hash로 변경되며 hash는 값과 매칭되어 저장소에 저장된다.

  • key: 고유한 값, hash 함수의 input, 다양한 길이 가능
  • hash 함수: key를 hash로 바꿔주는 역할. 다양한 길이의 key를 일정 길이를 가지는 hash로 변경해서 저장한다.
    • hash 충돌: 서로 다른 key가 같은 hash를 가질 경우
  • Hash: hash 함수의 결과물. 저장소에서 주소 역할을 한다.
  • Value: 저장소에 최종적으로 저장되는 값

시간 복잡도

  • 삽입
    • 일반적인 경우: O(1)
  • 삭제
    • 일반적인 경우: O(1)
    • 최악의 경우: O(n)
  • 검색
    • 일반적인 경우: O(1)
    • 최악의 경우: O(n)

해시 충돌

무한한 값(Key)을 유한한 값(Hash)로 표현한다면 반드시 일어날 수 밖에 없다.

n+1 이상의 값을 n개의 공간에 저장하려할 때, 발생하는 문제

해시 충돌 해결방법

  • Chaining
    • 저장소(bucket)에 연결 리스트로 동일한 hash의 값들을 이어 붙이는 방식
    • 데이터의 주소값이 바뀌지 않음 (Closed Addressing)
    • 장점
      • 한정된 저장소를 효율적으로 사용할 수 있다
      • 해시 함수의 중요성이 상대적으로 적다
      • 성능 저하가 Linear하게 발생한다. 테이블이 2배 확장되면, 성능저하도 2배
        • 저장할 데이터가 많을 때 유리
      • 연결리스트 사용과 유사하기때문에 복잡한 계산식 필요 없다.
    • 단점
      • 외부 저장 공간을 사용한다
      • 외부 저장 공간을 추가로 작업해야한다
      • 연결리스트와 단점을 공유한다. 삽입, 삭제시 오버헤드 존재(구현하는데 드는 비용)
  • Open Addressing
    • 해시 충돌이 일어나면 다른 버켓에 데이터를 삽입하는 방식
      • 선형 탐색: 해시충돌 시 다음 버켓, 혹은 몇 개를 건너뛰어 데이터를 삽입한다.
      • 제곱 탐색: 해시충돌 시 제곱만큼 건너뛴 버켓에 데이터를 삽입(1,4,9,16..)
      • 이중 해시: 해시충돌 시 다른 해시함수를 한 번 더 적용한 결과를 이용함.
    • 장점
      • 외부 저장공간 없이 해시테이블 안에서 데이터 저장 및 처리 가능
      • 외부 저장공간에서의 추가적인 작업이 없다
    • 단점
      • 해시함수의 성능에 전체 해시테이블의 성능이 결정된다.
      • 데이터의 길이가 늘어나면 그에 맞는 저장소를 마련해야한다.
  • Chaining과 Linear Probing(선형탐색) 성능 비교
  • 저장할 데이터 적을 때: Open Addressing 사용
  • 저장할 데이터 많을 때: Chaining 사용

그 외에도 같은 Hash를 공유하는 경우 균형 이진트리를 사용해서 O(logn)으로 하는 등의 방식을 사용할 수 있다.

0개의 댓글