Computer Science/Data Structure

해시 테이블(Hash Table)

DongHo 2023. 4. 14. 16:48

해시 테이블(Hash Table) : 키(Key), 값(Value)을 대응시켜 저장하는 데이터 구조

- 키를 통해 해당 데이터에 빠르게 접근 가능합니다.

 

Hash Table의 기본 구조

 

해싱(Hashing) : 키를 특정 계산식에 넣어 나온 결과를 사용하여 값에 접근하는 과정입니다.

키(key) : 해시 테이블 접근을 위한 입력 값입니다.

해시 함수(Hash Function) : 키를 해시 값으로 매핑하는 연산합니다.

해시 값(Hash Value) : 해시 테이블의 인덱스입니다.

해시 테이블(Hash Table) : 키-값(key-value)을 연관 시켜 저장하는 데이터 구조입니다.

 

 

해시 충돌 : 해시 함수를 통해 index값을 구했을 때 중복이 생기는 충돌입니다.

- 해시 테이블의 같은 공간에 서로 다른 값을 저장하려는 경우입니다.

   * 서로 다른 키의 해시 함수를 통한 해시 값이 동일한 경우입니다.

- 해시 충돌 해결 방법으로는 크게 개방 주소법분리 연결법이 있습니다.

해시 충돌 발생 경우

 

 

개방 주소법(Open Address) : 충돌시, 테이블에서 비어 있는 공간의 Hash를 찾아 데이터를 저장합니다.

- Hash와 Value가 1:1 관계 유지합니다.

- 비어 있는 공간 탐색 방법에 따라 분류합니다.

    * 선형 탐사법(Linear Probing)

    * 제곱 탐사법(Quadratic Probing)

    * 이중 해싱(Double Hashing)

Open Address 예시

 

선형 탐사법(Linear Probing)

- 빈 공간을 순차적으로 탐사하는 방법입니다.

    * 충돌 발생 지점부터 이후의 빈 공간을 순서대로 탐사합니다.

 

문제점

- 일차 군집화 문제 발생

    * 반복된 충돌 발생 시 해당 지점 주변에 데이터가 몰리는 경우 발생합니다.

 

Linear Probing 예시

제곱 탐사법(Quadratic Probing)

- 빈 공간을 n제곱만큼의 간격을 두고 탐사하는 방법입니다.

    * 충돌 발생 지점부터 이후의 빈 공간을 n제곱 간격으로 탐사합니다.

 

문제점

- 일차 군집화 문제 일부 보완합니다.

- 이차 군집화 문제 발생 가능성이 생깁니다.

 

Quadratic Probing 예시

 

이중 해싱(Double Hashing)

- 해싱 함수를 이중으로 사용

    * 해시 함수 1 : 최초 해시를 구할 때 사용합니다.

    * 해시 함수 2 : 충돌 발생 시, 탐사 이동 간격을 구할 때 사용합니다.

 

장점

- 선형 탐사(Linear Probing), 제곱 탐사(Quadratic Probing)에 비해 데이터가 골고루 분포됩니다.

Double Hashing 예시

 

분리 연결법(Separate Chaining) : 동일한 버킷(bucket)의 데이터에 대해 연결 리스트, 트리 등의 자료구조를 활용해 데이터의 주소를 저장하는 것입니다.

- 해시 테이블을 연결 리스트로 구성시킵니다.

- 충돌 발생 시, 테이블 내의 다른 위치를 탐색하는 것이 아닌 연결 리스트를 이용하여 해당 테이블에 데이터를 연결합니다.

 

Separate Chaining 예시

 

Perfect Hashing

Perfect Hashing 예시

 

 

 

 

Hash Table 메소드

put(K key, V value): 해시 테이블에 키(key)와 값(value)을 추가합니다. 

get(Object key): 주어진 키(key)에 해당하는 값을 반환합니다. 

remove(Object key): 주어진 키(key)에 해당하는 키-값 쌍을 해시 테이블에서 제거합니다. 

containsKey(Object key): 주어진 키(key)가 해시 테이블에 있는지 여부를 반환합니다. 

containsValue(Object value): 주어진 값(value)이 해시 테이블에 있는지 여부를 반환합니다. 

isEmpty(): 해시 테이블이 비어있는지 여부를 반환합니다. size(): 해시 테이블의 크기(키-값 쌍의 개수)를 반환합니다. 

clear(): 해시 테이블의 모든 키-값 쌍을 제거합니다. 

keys(): 해시 테이블의 모든 키(key)를 포함하는 열거형(Enumeration) 객체를 반환합니다. 

values(): 해시 테이블의 모든 값(value)을 포함하는 컬렉션(Collection) 객체를 반환합니다. 

clone(): 해시 테이블을 복제하여 새로운 해시 테이블 객체를 생성합니다. 

replace(K key, V value): 주어진 키(key)에 해당하는 값을 새로운 값(value)으로 대체합니다. 

entrySet(): 해시 테이블의 모든 키-값 쌍을 포함하는 Set 객체를 반환합니다. 

 

 

시간 복잡도(Time Table)

삽입(Insertion) : Best-case -> O(1), Worst-case -> O(n)

삭제(Deletion) : Best-case -> O(1), Worst-case -> O(n)

검색(Search) : Best-case -> O(1), Worst-case -> O(n)

 

 

 

 

 

 

Reference

- Introduction to Algorithms, 2nd Ed - Thomas H. Cormen.pdf

- 파이썬 알고리즘 인터뷰

- https://hsp1116.tistory.com/35

'Computer Science > Data Structure' 카테고리의 다른 글

힙(Heap)  (0) 2023.04.18
연결 리스트(Linked List)  (0) 2023.04.18
배열(Array)  (0) 2023.04.14
큐(Queue)  (0) 2023.04.13
스택(Stack)  (0) 2023.04.13