해시 테이블

1 개요

hash_collision

2 해시

2.1 해시 함수

2.1.1 설명

ABC     -해시 함수-> A1
1324BC  -해시 함수-> CB
AF32B   -해시 함수-> D5

2.1.2 좋은 해시 함수들의 특징

2.1.3 사용례

2.1.4 나눗셈 방식(Modulo-Division Method)

2.1.4.1 $h(x)$
2.1.4.2 $x$
\[P(x) = s[0]\times x^{n-1} + s[1]\times x^{n-2} + \dotsc + s[n-1] = \sum_{i=0}^{n-1}s[i]\times x^{n-1-i}\]
unsigned hash(char *s){
    unsigned hashval;

    for (hashval = 0; *s != '\0'; s++)
        hashval = *s + 31 * hashval;

    return hashval % HASHSIZE;
}
hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());
2.1.4.3 $m$

2.2 해싱(Hashing)

2.2.1 설명

2.2.2 사용례

3 충돌

hash_collision

3.1 생일 문제

3.1.1 설명

Birthday_Paradox

여러 사람이 모였을 때 생일이 같은 2명이 존재할 확률은, 23명만 모여도 50%를 넘고, 57명 모이면 99%를 넘는다

3.1.2 실험 파이썬 코드

import random

TRIALS = 100000
same_birthday = 0.0

for _ in range(TRIALS):
    birthdays = []
    for i in range(23):
        birthday = random.randint(1, 365)
        if birthday in birthdays:
            same_birthday += 1
            break
        birthdays.append(birthday)

print(f'{same_birthday / TRIALS * 100}%')  # 50.88399999999999%

3.2 비둘기집 원리(또는 서랍 원리)

3.2.1 설명

n개 아이템을 m개 컨테이너에 넣을 때, n > m이라면 적어도 하나의 컨테이너에는 반드시 2개 이상의 아이템이 들어있다

3.3 로드 팩터

3.3.1 설명

해시 테이블에 저장된 데이터 개수 n을 버킷의 개수 k로 나눈 것

\[\text{load factor} = \frac{\text{저장된 데이터 개수}}{\text{버킷의 개수}} = \frac{n}{k}\]

3.4 처리 방식

3.4.1 개별 체이닝

3.4.1.1 설명
3.4.1.2 예제

separate_chaining

  1. 테이블 초기화
  2. 50 입력
  3. 700과 76 입력
  4. 85 입력 시 50과 충돌 발생 $\to$ 체인 추가
  5. 92 입력 시 50과 충돌 발생 $\to$ 체인 추가
  6. 73과 101 입력, 101에서 충돌 발생 $\to$ 체인 추가

3.4.2 오픈 어드레싱

3.4.2.1 설명
3.4.2.2 예제

open_addressing

  1. 테이블 초기화
  2. 50 입력
  3. 700과 76 입력
  4. 85 입력 시 50과 충돌 발생 $\to$ 다음 빈 슬롯에 입력
  5. 92 입력 시 50과 충돌 발생 $\to$ 다음 빈 슬롯에 입력
  6. 73과 101 입력

4 언어별 해시 테이블 구현 방식