해시 테이블?
해시 테이블의 구성요소
- 해시 테이블은 키(key), 해시 함수(Hash function), 해시(Hash), 값(value), 저장소(Bucket, Slot)로 이루어진다.
- 해시함수: 데이터의 효율적 관리를 목적으로 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑(mapping)하는 함수이다. 다양한 길이의 key를 일정 길이를 갖는 hash 로 변경한다. 따라서 저장소의 효율적 운영이 가능하게 할 수 있다.
- 키: 매핑 전 원래의 데이터 값이자 해시 함수의 input 값. 고유 값이며 다양한 길이의 값이 될 수 있다. 해시함수로 값을 바꾸어 저장이 되어야 공간의 효율적 운영이 가능하다.
- 해시 값: 매핑 후 데이터의 값. 해시 함수의 output. 저장소(Bucket)에서 값(value)과 매칭돼 저장된다.
- 값(Value): 저장소(Bucket)에 최종 저장되는 값. 키와 매칭돼 저장,삭제,검색,접근이 가능하다.
- 해싱: 매핑하는 전체 과정
해시 함수의 알고리즘
- Division Method(나눗셈 법)
입력 값을 테이블의 크기로 나누고, 그 '나머지'를 테이블 주소로 활용
주소=입력 값 % 테이블 크기 (테이블 크기 n을 소수로 정하는 것이 좋음)
f(k)=(k%p)%m (p: prime number, m:해시 테이블의 크기)
- Digit Folding (자릿 수 접기)
숫자의 각 자릿수를 더해 해시 값을 만드는 방법
문자열을 키로 사용하는 해시 테이블에 유용하게 사용된다. 문자열의 각 요소를 아스키 코드 번호로 바꾸고, 이 값을 각각 더하여 주소로 변환해 사용한다.
이외에도 다양한 종류의 해시 함수의 알고리즘이 존재.
좋은 해시 함수의 조건
- less collision
- fast computation
해시 함수의 문제점
- 해시 충돌 (Hash Collision): 서로 다른 입력 값에 대해 동일한 해시 값을 반환하는 것. 즉 해시 테이블 내의 동일한 주소를 반환한다.
- 클러스터(Cluster): 일부 지역 주소들을 집중적으로 반환하는 결과, 데이터들이 한 곳에 모이게 되는 문제가 발생한다. 클러스터를 피하게 저장소를 운영하는 것이 이상적이다.
해시 충돌의 해결법 (Collision resolution)
-
Open Hashing(개방 해싱): 주소 밖에 새로운 공간을 할당해 문제를 해결
-Chaining(체이닝): 개방해싱+폐쇄해싱 특징을 동시에 갖는다. 충돌이 발생하면 각 데이터를 해당 주소의 링크드 리스트에 삽입하여 문제 해결.
-
Closed Hashing(폐쇄 해싱): 처음 주어진 해시테이블 공간 안에서 문제 해결
-Chaining
-Open Addressing(개방 주소법): 충돌이 일어나면 해시 테이블 내 새로운 주소를 탐사한다. 탐사 후, 충돌된 데이터를 입력. chaining과 대비되는 방법
<open addressing 종류>
(1) Linear Probing(선형 탐사): 저장소에 이미 데이터가 저장된 경우, 현재 주소에서 고정폭으로 다음 빈 주소로 이동.
(2) Quadratic Probing(제곱 탐사): 선형탐사보다 이동폭이 제곱수로 늘어남.
(3) Double Hashing(이중 해싱): 클러스터 방지 위해 2개 해시 함수 준비. 하나는 최초의 주소 위해, 다른 하나는 충돌이 일어날 경우의 주소.
(4) Rehashing(재해싱): 해시 테이블 크기 늘리고, 그 크기에 맞추어 테이블 내 모든 데이터를 다시 해싱.
해시함수 명령어
- key 값이 저장소에 있으면 value를 update
- key 값이 저장소에 없으면 (key,value)를 insert
-> 좋은 해시 함수를 쓴다면, set, remove, search는 chaining 방식이든, open addressing 방식이든 O(1)의 시간복잡도를 수행할 수 있다.
Reference
https://velog.io/@cyranocoding/Hash-Hashing-Hash-Table%ED%95%B4%EC%8B%9C-%ED%95%B4%EC%8B%B1-%ED%95%B4%EC%8B%9C%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4-6ijyonph6o
https://ratsgo.github.io/data%20structure&algorithm/2017/10/25/hash/
https://luyin.tistory.com/191