Hashing
Hash Table
- 해쉬 테이블은 dynamic set을 구현하는 효과적인 방법들 중 하나이다.
적절한 가정을 한 후에는 평균적인 탐색, 삽입, 삭제 시간에 O(1)만이 소요된다.
최악의 경우 시간 복잡도는 대부분의 경우 Θ(n)이 된다.
- 해쉬 함수 (hash function) h를 이용해 키 k를 T[h(k)]에 저장하게 된다.
h : U -> {0, 1, ..., m - 1} // 이 때 m은 테이블의 크기, U는 가능한 모든 키들의 집합이다.
이 과정은 보통 키 k가 h(k)로 해싱되었다라고 말하게 된다.
해쉬 함수의 예
- 모든 키들을 자연수라고 가정한다. (어떤 데이터들일지라도 자연수로 해석이 가능하다.)
- Ex : 문자열
ASCII 코드 : C = 67, L = 76 등
- 해쉬 함수의 예
h(k) = k % m (key를 하나의 자연수로 해석한 후 테이블의 크기 m으로 나눈 나머지)
문자열 CLRS라 할 경우
(67 * $128^3$) + (76 * $128^2$) + (82 * $128^1$) + (83 * $128^0$) = 141,764,947 (자연수)
항상 값은 0 ~ m - 1 사이의 정수가 된다.
x = 1024, m = 100이면 24번 인덱스에 1024를 저장하게 된다.
충돌 (Collision)
- 두 개 이상의 키가 동일한 위치로 해싱되는 경우를 말한다.
- 서로 다른 두 키 $k_1$과 $k_2$에 대해서 h($k_1$) = h($k_2$)인 상황이다.
- 일반적으로는 | U | >> m이기 때문에 항상 충돌은 발생 가능하다. (즉, 단사 함수가 아니다.)
- 만약 | K | >> m이여도 역시 충돌 발생 가능성이 존재한다. (K = 실제로 저장된 키들의 집합)
- 충돌이 발생했을 때는 대처 방법이 필요해진다.
- 충돌 해결 방법의 대표적인 두 가지 : Chaining / Open Addressing
Chaining을 이용한 충돌 해결
- 동일한 장소로 해싱된 모든 키들을 하나의 연결 리스트 (Linked List)로 저장한다.
- 키의 삽입 (Inertion)
키 k를 리스트 T[h(k)]의 맨 앞에 삽입 => 시간 복잡도 O(1)
중복된 키가 들어올 수 있고 중복 저장이 허용되지 않는다면 삽입시 리스트를 검색해야 한다. 그에 따라 시간 복잡도는 리스트의 길이에 비례하게 된다.
- 키의 검색 (Search)
리스트 T[h(k)]에서 순차 검색을 시행한다.
시간 복잡도는 키가 저장된 리스트의 길이에 비례하게 된다.
- 키의 삭제 (Deletion)
리스트 T[h(k)]로부터 키를 검색한 후 삭제한다.
키를 검색해 찾은 후에는 O(1)시간만을 소요해 삭제가 가능하다.
- 최악의 경우는 모든 키가 하나의 슬롯으로 해싱되는 경우에 발생하게 된다.
이 경우 길이가 n인 하나의 연결리스트가 만들어진다.
최악의 경우 탐색시간은 Θ(n) + 해쉬함수의 계산시간이 된다.
- 평균의 시간 복잡도는 키들이 여러 슬롯들에 얼마나 잘 분배되냐에 따라 결정된다.
SUHA (Simple Uniform Hashing Assumption)
- 각각의 키가 모든 슬롯들에 균등한 확률을 통해 (equally likely) 독립적으로 (independently) 해싱된다 가정한다.
성능을 분석하기 위해 주로 하는 가정법이다.
hash함수는 deterministic하기 때문에(무작위가 아니기 때문에) 현실에는 적용이 불가능하다.
- Load factor α = n / m
n : 테이블에 저장될 키의 개수
m : 해쉬 테이블의 크기, 즉 연결리스트의 개수
α : 각 슬롯에 저장된 키의 평균 개수
- 연결리스트 T[j]의 길이를 $n_j$라고 하면 E[$n_j$] = α
- 만일 n = O(m)이라면 평균 검색 시간은 O(1)이 된다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
해싱 (Hashing) (3) (0) | 2019.06.09 |
---|---|
해싱 (Hashing) (2) (0) | 2019.06.09 |
Red Black Tree (2) (0) | 2019.06.05 |
Red Black Tree (1) (0) | 2019.06.02 |
이진 검색 트리 (3) (0) | 2019.05.31 |