hashcollisionopen-addressing

open addressing을 설명해 주세요

예상 시간
6
30초 답변

꼬리질문

조금 더 깊게 물어본다면

답변 뒤에 이어질 수 있는 질문들을 하나씩 열어볼 수 있어요.

Open addressing과 chaining의 차이는 무엇인가요?

부가 설명

Open addressing의 핵심은 “충돌 난 값을 table 밖으로 빼지 않는다”는 점입니다. 같은 배열 안에서 빈 자리를 찾아 들어가기 때문에 pointer 구조가 단순하고 cache locality가 좋을 수 있습니다. 대신 table이 많이 차면 빈 slot을 찾는 탐사 길이가 길어지고 성능이 급격히 나빠질 수 있습니다.

탐사 순서는 보통 다음처럼 표현합니다.

h(k, i) = (h1(k) + f(i)) mod m

여기서 i는 몇 번째 시도인지, m은 table 크기입니다.

linear probing:    f(i) = i
quadratic probing: f(i) = i^2 또는 c1*i + c2*i^2
double hashing:    f(i) = i * h2(k)

Linear probing은 단순하지만 값들이 연속 구간에 몰리는 primary clustering이 생기기 쉽습니다. Quadratic probing은 primary clustering을 줄이지만 같은 초기 hash를 가진 key들이 같은 경로를 따라가는 secondary clustering은 남습니다. Double hashing은 key마다 이동 간격을 다르게 만들어 clustering을 더 줄이는 편입니다.

한 줄 정리

Open addressing은 hash collision을 table 내부의 다른 slot 탐사로 해결하고, linear probing·quadratic probing·double hashing은 그 탐사 순서를 정하는 방법입니다.