해싱(Hashing)
해싱이란?
- 해시 함수와 해시 테이블을 이용하여 데이터를 빠르게 저장하고 탐색하는 방법
- 데이터를 해시 테이블이라는 배열에 저장하고
- 데이터의 키 값으로 해시 함수를 통하여 테이블의 주소를 반환하여 원하는 데이터를 찾는 방식
해시 테이블
- 값의 연산에 의해 직접 접근 가능한 구조
해시 함수
- 해시 테이블에서 기 값을 주소로 변환하는데 사용되는 함수
- 계산이 빠르고 간단해야 하며, 다른 키 값이 같은 주소를 산출하는 경우가 적어야 함
해시 함수 종류
- 나눗셈법
- 중간 제곱법
- 폴딩법
- 기수 변환법
- 자리수 분석법
나눗셈법
- 키 값을 정수로 보고 이를 적당한 양의 정수(주소, 해시 테이블의 크기 등)로 나누어 그 나머지를 해시 주소로 하는 방법
h(k) = k mod N
- h(): 해시 함수
- k: 키 값
- N: 나누는 수
특징
- 주소 계산법이 매우 간단하지만 나누는 수 N을 적당하게 선택하는 것이 쉽지 않음
N 선택 시 고려사항
- N 값은 충돌 발생의 가능성을 최소화하도록 선정
- 따라서 나누는 값 N은 소수로 정하는 것이 좋음
예시
- 키 값 : 172148
- 주소 공간 영역 : 7000
- 주소 공간 영역에 가까운 소수 : 6997
- 해시 주소 : 4220172148 / 6997 = 24 …. 4220
중간 제곱법
- 키 값을 제곱한 다음 그 제곱값의 중간 부분의 적당한 자리수를 해시 주소로 정하는 방법
예시
- 키 값 k = 7642
- k^2 = 58247424
- 해시 테이블의 주소 : 2474
- 58247424
폴딩법(folding)
- 키를 같은 크기의 부분으로 나누고(접고), 이들을 모두 더하거나 배타적 논리합(XOR) 등을 취하여 해시 주소를 정하는 방법
- 이동 폴딩(shift folding)
- 각 부분을 오른쪽 끝을 맞추어 더한 값을 해시 주소로 정하는 방법
충돌
- 해시 테이블에 데이터를 삽입할 때 서로 다른 데이터가 같은 주소에 배당되는 것
오버플로우
라고도 함- 충돌(오버플로우) 해결법
- 선형 조사법
- 2차 조사법
- 체이닝
선형 조사법
- 충돌이 일어난 항목을 해시 테이블의 다른 위치에 저장하는데
- 충돌이 발생한 자리에서 그 다음 버킷들을 차례로 하나씩 조사하여 최초로 나오는 빈 버킷에 데이터를 삽입하는 방법
- 장점
- 주소 계산이 간단함
- 단점
- 조사 시간이 많이 걸림
- 해시 테이블 상에 데이터의 위치가 일정한 키에 의해 집단으로 뭉치는 경향 발생
2차 조사법
- 충돌이 발생했을 때 원래 주소로부터 2차함수 되는 거리만큼 떨어진 곳을 차례로 검색해서 최초로 나오는 빈 곳에 해당 데이터를 삽입하는 방법
- 장점
- 주소 계산이 간단함
- 데이터들의 윙치가 일정한 키를 중심으로 뭉치려는 경향을 어느정도 배제 가능
- 단점
- 해시 테이블 모든 버킷 다 조사되지는 않음
체이닝법
- 각 버킷에 삽입과 삭제가 용이한 연결 리스트를 구성하는 방법
- 해시 테이블 자체는 포인터의 배열로 만들고, 같은 버킷에 해당되는 데이터들을 체인(연결리스트)으로 만들어서 연결
- 장점
- 삽입, 삭제 시 문제 없음
- 단점
- 포인터 연산이기 때문에 동적인 기억 장소 할당 필요
- 링크 필드로 사용되는 부가적인 기억 장소 필요
'프로그래밍 언어 > 자료구조 & 알고리즘' 카테고리의 다른 글
자료구조 - 탐색 (0) | 2021.12.01 |
---|---|
자료구조 - 정렬 (0) | 2021.12.01 |
자료구조 - 트리 (0) | 2021.11.30 |
자료구조 - 연결리스트(1) 연결 리스트 (0) | 2021.11.29 |
자료구조 - 순차리스트(2) 큐(Queue), 데크(Deque) (0) | 2021.11.29 |