Open Addressing에 의한 충돌 해결
- 모든 키를 해쉬 테이블 자체에 저장
- 테이블의 각 칸(slot)에는 1개의 키만 저장
ㄴ 충돌이 생기면 다른 slot에 저장해야 한다.
- 충돌 해결 기법
: linear probing (기본적인 해결책)
: Quadratic probing
: Double hashing
Linear Probing
- probing은 먼저 해싱을 해서 그 칸이 비어 있으면 저장하고,
이미 다른 키에 의해 차 있을때 순서대로 검사를 해서 빈 슬롯에 저장하는 기법이다.
h(k), h(k)+1, h(k)+2,... 순서로 검사하여 처음으로 빈 슬롯에 저장
테이블의 끝에 도달하면 다시 처음으로 circular 하게 돌아감
찾을 때도 자리 가서 보고 없으면 다시 순서대로 검사를 해야 한다.
이 Linear Probing의 단점은 clustering인데, 키들이 연속해서 뭉쳐져 있는 현상을 말한다.
그러면 cluster의 끝에 더덕더덕 붙을 확률이 커져서 cluster가 눈덩이처럼 길게 늘어나는 현상이 생길 수 있다.
그러면 cluster에 길이에 비례하여 속도가 저하되고,
원래 있어야 할 위치보다 멀리 저장되기 때문에 속도도 저하되고 cluster가 점점 커져서 더 느려지고 하는 현상이 발생한다.
primary cluster : 키에 의해서 채워진 연속된 슬롯들을 의미
Quadratic probing
: 충돌 발생시 h(k), h(k)+1^2, h(k)+2^2 + h(k)+3^2 ... 순서로 시도한다.
- 리니어와 비슷하나 probing 하는 순서를 바꿔본 것이다.
: ai^2 + b^i + c 같이 검색 경향을 만들 수 있다고 한다... (잘 모름)
Double hashing
: 서로 다른 두 해쉬 함수 h1과 h2를 이용하여
h(k,i) = (h1(k)+i*h2(k)) mod m
댓글
댓글 쓰기