Ilhwanee's Devlog
로그인
Ilhwanee's Devlog
로그인
해시 테이블(Hash Table)이란?
Ilhwanee
·
2022년 6월 9일
팔로우
0
자료구조
해시 테이블
0
자료구조&알고리즘
목록 보기
3/3
해시 테이블(Hash Table)
해시 테이블이란
key를 이용하여 value를 저장
하는 자료구조이다.
저장, 검색, 삭제의 평균적인 시간 복잡도가 O(1)에 수렴
하여 그 이유는 다음과 같다.
key를 특정
해시 함수(Hash Function)
를 통하여 해싱한 결과 값을 해시 테이블의 인덱스로 사용한다.
해시테이블의
key로 만든 인덱스에 value를 저장
한다.
key를 알면 value가 저장된 인덱스를 알 수 있으므로
저장, 검색, 삭제의 시간 복잡도가 O(1)에 수렴한다.
장점
저장, 검색, 삭제가
매우 빠르다
.
메모리 크기가 가변적이다.
대량의 정보
를 효율적으로 다룰 수 있다.
단점
해시 함수를 사용하는데
추가적인 연산이 필요
하다.
다른 자료구조보다
메모리가 더 많이 필요
하다.
해시 충돌이나 클러스터링이 발생하면 성능이 낮아진다.
문제점
해시 충돌(Hash Collision)
: 인덱스가 이미 존재할 수 있다.
오버플로우(Overflow)
: 해시 충돌이 버킷에 할당된 슬롯 수보다 많이 발생하면 더 이상 버킷에 값을 넣을 수 없다.
클러스터링(Clustering)
: 데이터가 한 쪽에 몰릴 수 있다.
해시 테이블의 문제점 해결 방법
해시 충돌
체이닝(Chaining)
버킷의 인덱스가 가르키는
연결 리스트에 노드를 추가
하여 key와 value를 같이 저장한다.
별도의 저장공간을 필요
로 하지만
인덱스가 바뀌지 않는다
.
key를 index로 변환 후 연결리스트에 해당 key가 존재하면 value를 가져온다.
매핑되는 value가 저장되어 있는 공간을 슬롯(Slot)이라고 한다.
해시 충돌이 계속 발생하여 할당된 슬롯 수를 넘게 되면 오버플로우가 발생한다.
개방 주소법(Open Addressing)
- 충돌이 발생했을 경우
추가적인 메모리를 사용하지 않고 빈 버킷을 찾아서 저장
한다.
- 다른 버킷에 저장하기 때문에
인덱스가 바뀔 수 있다
.
-
선형 검색법(Linear Probing)
- 가장 간단한 방법이며 캐시 효율이 높다.
- 충돌이 발생한 위치에서 선형적으로 검색하여 가장 처음 발견한 빈 영역에저장한다.
- 충돌이 자주 발생하는 위치 주변에 데이터가 밀집될 수 있어 클러스터링에 취약하다.
-
2차 검색법(Quadratic Probing)
- 클러스터링을 해결하기 위한 방법이다.
- 충돌이 일어나면 1, 4, 9, 16... 과 같이 떨어진 영역을 차례대로 검색하여 가장 처음 발견한 빈 영역에 저장한다.
- 하지만 제2밀집이 발생할 수 있어 클러스터링을 완벽히 해결하진 못한다.
-
이중 해싱(Double Hashing)
- 캐시 효율을 포기하고 클러스터링 해결에 집중한 방법이다.
- 충돌이 발생하면 2차 해시 함수를 이용하여 이동 거리를 계산하고 저장한다.
- 가장 많은 연산량이 일어난다.
Resizing
개방 주소법에서 사용되는 배열이 가득차거나, 체이닝에서 사용되는 연결 리스트가 길어지게 되면 버킷의 개수를 늘려준다.
늘어난 버킷의 크기에 맞게 재해싱하여 버킷을 채운다.
Ilhwanee
블로그 이전 -> https://pppp0722.github.io
팔로우
이전 포스트
정렬 알고리즘 7개 정리 (Java)
0개의 댓글
댓글 작성