기본
- 정의: key 연산 적용 --> Key값 위치 찾아내는 것
- 용어
- hash table: 원소 저장되는 공간, 연속적인 공간(배열의 형태)
- 버킷: 테이블 자체를 버킷이라고 하기도 함
- 슬롯: 하나의 버킷에 여러개 슬롯 존재 가능
- 해시: key 값 mapping 후 값을 hash라고 함
- collision: 서로 다른 key값이 동일 bucket 주소로 mapping
- overflow: bucket에 슬롯보다 더 많은 원소가 저장되려고 할 때
- 모든 콜리전이 오버플로우는 아님 --> 슬롯이 여러개 일 수도 있음
- issue
- hash function
- overflow handlong method
hash function
- 요건
- easy to compute
- 컬리전 최소화
- 종류
- mid square
- key값 제곱 후 중간 일정 bit 선택 --> 기본적으로 key값 이진 비트로 생각
- Folding
- key 값의 2진수 string 몇개 Part로 나눔 --> 겹쳐서 덧셈
- Division
- %(나머지 연산), f(k) = k%m --> m은 table size
- m값으로는 2의 제곱수는 좋지 않음 --> 규칙이 있는 경우 분산이 되지 않을 수 있음
- digit analysis
- key값 임의의 진수로 전환
- ex) 21100248 --> 앞 3개, 뒤 3개만 선택
- key값의 형태를 사전에 알 수 있는 경우 사용
hash overflow handling
- 종류
- linear probing
- overflow 발생 시 --> closest unfilled bucket에 넣음
- 단점
- 삭제된 공간 --> search 오류
- 초기 empty 와 deleted 공간 구분
- clustering 문제
- clustering --> 빈 공간을 찾는데 오래 걸림
- quadratic probing(제곱)
- overflow --> (f(k))%m, (f(k)+i^2)%m, (f(k)-i^2)%m ...(i=1, 2, 3 ...)
- 단점
- 줄긴 하였지만 여전히 clustering 문제 존재
- rehashing
- overflow --> 매번 다름 함수 적용, f1(K), f2(k), f3(k) ...
- 단점
- table을 효율적으로 사용할 적절한 함수 필요
- chaining
- 각 bucket --> Linked list로 구성
- 최근 것이 앞으로 오도록 구성 --> 일반적으로 최근 것을 먼저 찾음!
- 장점
- 서로 다른 hash 끼리 영향 없음
추가
- loading density
- a=n/(s*b) --> Sb는 전체 용량
- n: 저장된 원소 수
- s: bucket 당 slot 수
- b: bucket 수
- loading density 클수록 --> 공간 활용도 높아지나, collision 발생 빈도 증가
- hash table size
- too large --> 활용도 낮음
- too small --> 성능 저하(collision 증가)
- hash 단점
- sorted order로 traverse 기능 어려움
- ex) key 값 순서로 조회
- hash의 순서가 key값의 순서와 관계가 없을 수 있음