1. 해시(Hash) 정의
- 배열은 검색 속도가 빠르나 데이터 삽입/삭제시 속도가 느리다.
- 링크드 리스트는 삽입 삭제시 인근 노드의 참조 값만 수정해서 속도가 빠르나 순회 검색만 가능하여 데이터가 많아질 수록 속도가 느려진다.
- 이러한 한계를 극복하기 위해 제시된 방법이 해시(Hash)
2. 특징
- 내부적으로 배열을 사용하여 데이터를 저장하여 검색 속도가 빠르다.
- 데이터의 삽입/삭제 시 해시 알고리즘을 이용하여 데이터와 연관된 고유한 숫자를 만들어 인덱스로 사용한다.
- 해시가 내부적으로 사용하는 배열을 Hash Table 이라고 하며 크기에 따라서 성능 차이가 난다.
3. 해시 메서드(Hash Method)
- 해시는 Hash Table을 사용하여 데이터를 저장한다.
- 이때 인덱스를 구하기 위해 해시 메서드(Hash Method)를 사용하여 고유의 숫자 값인 해시 코드(Hash Code)를 얻는다.
4. 해시 메서드 구현 방법
- 해시 메서드는 나머지 연산자를 이용하여 해시 코드(Hash Code)를 구한다.
* a=97, b=98, c=99 일때Hash Table의 크기가 10이면 다음과 같이 저장된다.
97 % 10 = 7
98 % 10 = 8
99 % 10 = 9
list[7] = 'a';
list[8] = 'b';
list[9] = 'c';
5. 해시 충돌
- 해시 충돌을 최소하 하기 위해서 테이블의 크기를 소수로 사용해서 만든다.
* 4 % 11 = 4
8 % 11 = 8
32 % 11 = 10 충돌!
10 % 11 = 10 충돌!
- 이러한 충돌을 해결하는 방법은 개방 주소법과 분리 연결법이 있다.
6. 개방 주소법
- 배열만을 사용하며, 저장 인덱스가 겹칠 경우 해당 인덱스의 옆 인덱스에 저장하는 방식
- 옆에 인덱스와 데이터 충돌이 일어나면 다시 옆 인덱스에 저장한다.
- 충돌 데이터가 많이 발생하면 성능에 심각한 문제가 발생한다.
7. 분리 연결법
- Hash Table 에 연결 리스트에서 사용하는 Node 객체를 저장한다.
- Hash Table의 셀마다 연결 리스트를 하나씩 저장하고 충돌이 발생하는 데이터는 연결 리스트의 다음 노드에 추가한다
- 데이터를 검색할 때는 Hash Table의 인덱스를 찾은 후 셀에 연결된 리스트를 순차적으로 탐색하며 찾으려는 Hash Code 와 저장된 Node의 Hash Code를 비교하는 것이다.
'면접 - 자바' 카테고리의 다른 글
개발자 면접 질문 - 동기화 (synchronized) 정의 (0) | 2020.12.02 |
---|---|
개발자 면접 질문 - HashMap과 HashTable의 차이 (0) | 2020.12.02 |
개발자 면접 질문 - 쓰레드 로컬(Thread Local) 정의 (0) | 2020.12.02 |
개발자 면접 질문 - 접근 제어자 및 접근 권한 (0) | 2020.12.02 |
개발자 면접 질문 - 자바 상속과 구현의 차이 (0) | 2020.12.02 |