Open Address(개방 주소법)
해시 충돌 시(= 삽입하려는 해시 버킷이 이미 사용중인 경우) 다른 해시 버킷(데이터를 저장하기 위한 공간)에 해당 자료를 삽입하는 방식
- 충돌이 발생하면 데이터를 저장할 장소를 찾아헤맨다.
- Worst case : 비어있는 버킷을 찾지 못하고 탐색을 시작한 위치까지 되돌아올 수 있음
- 버킷을 채운 밀도가 높아질 수록 Worst case발생 빈도가 높아짐
- 여러 방법들
1. Linear Probing(선형 탐사)
: 순차적으로 탐색하며 비어있는 버킷을 찾을 때까지 계속 진행
2. Quadratic Probing(2차 탐사)
: 2차 함수를 이용하여 탐색할 위치 찾기
3. Double hashing Probing(이중 해싱) : 하나의 해시 함수에서 충돌이 발생하면 2차 해시 함수를 이용해 새로운 주소를 할당하며, 1,2번 방법에 비해 많은 연산량을 요구
Seperate Chaining (분리 연결법)
해시 충돌이 잘 발생하지 않도록 보조 해시 함수(Key의 해시 값을 변형하여 충돌 가능성을 줄임)를 통해 조정할 수 있다면 Worst case에 가까워지는 빈도를 줄일 수 있음
-> Java 7에서는 분리 연결법을 이용하여 HashMap 구현하고 있음
두 가시 구현 방식이 있으며, 데이터의 개수로 방법 선택
두 방식 모두 Worst Case : O(n)
Open Address방식은 연속된 공간에 데이터를 저장하기 때문에 Seperate Chaining에 비해 캐시 효율이 높음 -> 즉, 데이터의 개수가 충분히 적다면 Open Address 방식이 더 성능 좋음
Seperate Chaining 방식에 비해 Open Address 방식은 버킷을 계속해서 사용하기 때문에 Seperate Chaining 방식을 사용한다면 테이블의 확장을 보다 늦출 수 있음
해시 버킷의 개수가 적다면 메모리 사용을 아낄 수 있으나 충돌로 인해 성능 상 손실 발생함 -> HashMap은 key-value 쌍 데이터가 일정 개수 이상이 되면 해시 버킷의 개수를 두배로 늘림
`* 일정 개수 : 현재 데이터의 개수가 해시 버킷의 개수의 75%가 되게 하는 될 때
0.75 = load factor 라고 불림
input : NATHAN_CS_STUDY
output : 26E9D96EDE39CB9FC7B61134DCDD7B9B1F46191C74BAEF939ABC3952BE86B2F1
input : NATHAN_CS_STUDY.
output : E004168F4260E23B8297DD46241B5E9AAE5A54B076ED4558BEDCECC24F410A37
input
: 매주 목요일 21시에 모여서 1시간정도 스터디
선행과제
발표를 맡은 사람은 스터디전까지 해당 주제에 대해 깊게 공부해오기
발표를 하지 않는 사람도 발표주제를 보고 질문할 부분 생각해보기
발표에 사용할 자료는 자유롭게 준비해서 PR 날려두기
스터디 시간에 할 일
매주 돌아가면서 발표하는 사람, 듣는 사람 나누어 진행
발표하는 사람은 자신이 정한 이번주 주제에 대해 공부한 것을 설명
듣는 사람은 발표를 듣고 이해가 안되거나 궁금한 점 적극적으로 질문
스터디 이후에 할 일
다음 주 발표주제 정하기
output : A29142873A808E028E23E9DC59FE1CD7F57F27F2C349895B46695ACF206C15D0
참고자료
https://siyoon210.tistory.com/85
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/DataStructure#hash-table
https://www.youtube.com/watch?v=Rpbj6jMYKag