산술적인 연산을 이용하여 키가 있는 위치를 계산하여 찾는 계산 검색 방식
키 값을 원소 위치로 변환하는 함수
해시 함수에 의해 계산된 주소 위치에 항목을 저장한 표
다른 키 값을 가지지만 해시 함수에 의해 같은 버킷에 저장된 키 값, 효율의 이유로
키 값이 다른데 해시 함수에 의해 주어진 버킷 주소가 같은 경우
포화 버킷 상태에서 또 그 버킷을 지정 받은 키 값이 있어 충돌이 발생하면 오버플로우가 된다.
실제 사용중인 키 값의 개수/ 사용 가능한 키 값의 개수
실제 사용중인 키 값의 개수/ 해시 테이블에 저장 가능한 전체 키 값의 개수(버킷 * 슬롯)
키 값을 제곱한 결과에 중간에 있는 적당한 비트를 주소로 사용한다. 제곱 결과에서 주소로 사용하는 비트 수는 해시 테이블의 버킷 개수에 따라 결정된다.
나머지 연산자 mod를 사용한 방법으로 키 값을 해시 테이블의 버킷 크기로 나눈 나머지를 주소로 사용. 적당한 크기의 소수로 나눈다
곱하기 연산을 사용한 방법. 키 값 k와 정해진 실수 a를 곱한 결과에서 소수점 이하 부부만을 테이블 크기와 곱하여 그 정수 값을 주소로 사용
키와 비트 수가 해시 테이블 인덱스의 비트 수 보다 클 때 사용한다. 키 값을 해시테이블 인덱스의 비트 수와 같은 크기로 분할한 후 분할된 부분을 모두 더해 해시 주소를 만든다.
12312312에 대해서
키 값을 이루는 각 자릿수의 분포를 분석하여 해시 주소로 사용한다. 각 키 값을 적절히 선택한 진수로 변환한 후에 각 자릿수의 분포를 분석하여 가장 편중된 분산을 가진 자릿수는 생략하고 가장 고르게 분포된 자릿수부터 해시 테이블 주소의 자릿수만큼 차례로 뽑아서 만든 수를 역순으로 바꿔 주소로 사용한다.
키 값이 10진수가 아닌 다른 진수일 때 10진수로 변환하고, 해시 테이블 주소로 필요한 자릿수만큼만 하위 자리의 수를 사용한다.
해시 테이블의 크기가 2^k일 때, 키 값을 이진 비트로 놓고 임의의 위치에 있는 비트들을 추출하여 주소로 사용한다. 충돌 발생 가능성이 많으므로 테이블 일부에 주소가 편중되지 않도록 키 값의 비트를 미리 분석하여 사용해야 한다.
open hashing(chainging): 주소 밖에 새로운 공간을 할당하여 문제 해결
closed hashing(open addressing): 처음에 주어진 테이블 내에서만 접근
체이닝: 해시 테이블의 구조를 변경하여 각 버킷에 하나 이상의 키 값을 저장할 수 있도록 하는 방법. 버킷에 슬롯을 동적으로 삽입하고 삭제하기 위해 연결 리스트를 사용한다. 각 버킷에 대한 헤드 노드는 1차원 배열이고, 슬롯은 헤드 노드에 연결리스트 형태로 이어진다. 버킷 내에서는 원하는 슬롯을 검색하려면 버킷의 연결 리스트를 선형 검색한다.
선형 개방 주소법: 선형 탐색(linear probing)이라고도 한다. 선형개방 주소법에서 해시 함수로 구한 버킷에 빈 슬롯이 없어서 오버 플로가 발생하면 그 다음 버킷에 빈 슬롯이 있는지 조사한다. 있으면 저장 없으면 그 다음(정해진 상수 만큼 떨어진) 버킷 조사, 특정 위치에 군집화되는 문제가 발생할 수 있다.
quadratic probing : linear probing과 비슷 하지만 정해진 상수의 제곱만큼 떨어진 버킷 조사
double hashing: 하나는 해시 테이블에 접근할 때, 하나는 충돌시 이동할 때 사용
rehasing: 부하율이 1에서 너무 멀어지면 해시함수를 수정하여 부하율이 1에 가까운 값이 되도록 만드는 것
부하율(load factor)= 전체 키 개수/ 해시 테이블 크기