[알고리즘] 해시 테이블(Hash Table)

Jenny·2023년 5월 31일
0

Algorithm

목록 보기
2/2
post-thumbnail

해시테이블

  • (Key, Value)로 데이터를 저장하는 자료구조 중 하나
  • 내부적으로 배열(버킷)을 사용해서 데이터를 저장하므로 빠르게 데이터를 검색할 수 있음
  • 각각의 Key 값에 해시함수를 적용해 배열의 고유한 index를 생성하고, 이 index를 활용해 값을 저장하거나 검색하게 됨. 여기서 실제 값이 저장되는 장소를 버킷 또는 슬롯이라고 함

예시


이미지출처
(Key, Value)가 ("John Smith", "521-1234")인 데이터를 크기가 16인 해시 테이블에 저장한다고 가정했을 때 탐색 과정
1) index = hash_function("John Smith") % 16 연산을 통해 index 값을 계산한다.
2) array[index] = "521-1234" 로 전화번호를 저장하게 된다.
👉 이러한 구조로 데이터를 저장하면 Key값으로 데이터를 찾을 때 해시 함수를 1번만 수행하면 되므로 매우 빠르게 데이터를 저장/삭제/조회할 수 있음

시간 복잡도

해시테이블의 평균 시간복잡도는 O(1)이다.하지만 데이터의 충돌이 발생한 경우 Chaining에 연결된 리스트들까지 검색을 해야 하므로 O(N)까지 시간복잡도가 증가할 수 있다.

대표적인 해시 함수

1) Division Method

나눗셈을 이용하는 방법으로 입력값을 테이블의 크기로 나누어 계산한다.( 주소 = 입력값 % 테이블의 크기) 테이블의 크기를 소수로 정하고 2의 제곱수와 먼 값을 사용해야 효과가 좋다고 알려져 있음

2) Digit Folding

각 Key의 문자열을 ASCII 코드로 바꾸고 값을 합한 데이터를 테이블 내의 주소로 사용하는 방법

3) Multiplication Method

숫자로 된 Key값 K와 0과 1사이의 실수 A, 보통 2의 제곱수인 m을 사용하여 다음과 같은 계산을 해준다. h(k)=(kAmod1) × m

4) Univeral Hashing

다수의 해시함수를 만들어 집합 H에 넣어두고, 무작위로 해시함수를 선택해 해시값을 만드는 기법

해시(Hash)값이 충돌하는 경우

대표적으로 다음과 같은 해결 방법이 있음

1) 분리 연결법(Separate Chaining)


추가 메모리를 사용하여 다음 데이터의 주소를 저장함
위의 그림과 같이 동일한 버킷으로 접근을 한다면 데이터들을 연결을 해서 관리해주고 있다.

  • 장점
    해시 테이블의 확장이 필요없고 간단하게 구현이 가능하며, 손쉽게 삭제할 수 있다는 장점이 있음

  • 단점
    데이터의 수가 많아지면 동일한 버킷에 chaining되는 데이터가 많아지며 그에 따라 캐시의 효율성이 감소함

2) 개방 주소법(Open Addressing)

: 추가적인 메모리를 사용하는 Chaining 방식과 다르게 비어있는 해시 테이블의 공간을 활용하는 방법이다. Open Addressing을 구현하기 위한 대표적인 방법으로는 3가지 방식이 존재함

Linear Probing

현재의 버킷 index로부터 고정폭 만큼씩 이동하여 차례대로 검색해 비어 있는 버킷에 데이터를 저장한다.

Quadratic Probing

해시의 저장순서 폭을 제곱으로 저장하는 방식이다. 예를 들어 처음 충돌이 발생한 경우에는 1만큼 이동하고 그 다음 계속 충돌이 발생하면 2^2, 3^2 칸씩 옮기는 방식이다.

Double Hashing Probing

해시된 값을 한번 더 해싱하여 해시의 규칙성을 없애버리는 방식이다. 해시된 값을 한번 더 해싱하여 새로운 주소를 할당하기 때문에 다른 방법들보다 많은 연산을 하게 된다

참고자료
https://dayzen1258.tistory.com/entry/%ED%95%B4%EC%8B%9C%ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%B4%EB%9E%80
https://mangkyu.tistory.com/102

profile
Developer로의 여정

0개의 댓글